最近尝试配置树莓派做透明代理,按说明配置完 TPROXY 后 UDP 协议的转发一直没有成功,调查后发现失败的原因是本地的 ss-redir 一直收不到内核 TPROXY 转发过来的数据包,iptables 是使用 ss-nat 进行配置的,尝试过:
1、完全清理掉 iptables 再配置,失败
2、自己写了个小程序替代 ss-redir,也收不到
3、不使用 ss-nat,手动添加 iptables 规则,失败
考虑到可能是树莓派上各种 bridge、docker 之类的有影响,一怒之下开了两个虚拟机组了个网,一台当客户端,一台当路由器,操作系统是新安装的 ubuntu18.04 ,配置过程如下:
1、配置好两台机子的 ip,清理掉 iptables 上所有规则,路由器上用 iptables 配置好 nat,客户端可以正常访问互联网
2、运行 ss-redir
3、参照 ss-libev 主页上 Transparent proxy 一节,配置 iptables
TCP 成功,UDP 依然失败,实在想不出来原因,不知道各位有没有什么思路?
ps:
1、在树莓派上,在 filter 表的 input 链上插一句 log,可以看到 TPROXY 转发过来的数据包,但在 ubuntu 上看不到
2、树莓派和虚拟机都可以看到本地发出的 dns 请求被 TPROXY 转发最后到达 ss-redir,这实在超出我的理解,按说明来讲本地发出的数据包应该是不经过 prerouting 链的,这些数据包为什么会被 TPROXY 转发呢?
1
laucenmi 2020-02-03 21:55:39 +08:00
ipset -N gfw4 iphash family inet
ip -f inet rule add fwmark 0x01/0x01 table 100 ip -f inet route add local 0.0.0.0/0 dev lo table 100 iptables -t nat -A OUTPUT -p tcp -m set --match-set gfw4 dst -j REDIRECT --to-port 1080 iptables -t nat -A PREROUTING -p tcp -m set --match-set gfw4 dst -j REDIRECT --to-port 1080 iptables -t mangle -A PREROUTING -p udp -m set --match-set gfw4 dst -j TPROXY --on-port 1080 --tproxy-mark 0x01/0x01 我自己用的, dnsmasq 根据 g f w l i s t 自动添加 IP 到 gfw4, 最后通过 stun 测试是 Full Cone |
2
ysc3839 2020-02-03 22:13:51 +08:00 1
建议使用 OpenWrt,官方源里面的 ss 带有 ss-rules,可以自动配置相关转发规则。
https://github.com/openwrt/packages/tree/master/net/shadowsocks-libev 同时 OpenWrt 也是开箱即用配置好了路由转发,不需要手动配置。 |
3
linxy19957 OP @laucenmi 对比了一下没有什么差别,请问你是什么操作系统呢?
|
4
linxy19957 OP @ysc3839 感谢回复,我的是树莓派 4b,当前 openwrt 只有 snapshot 版本
|
5
ysc3839 2020-02-03 23:06:17 +08:00
@linxy19957 你不介意的话可以先用着,看你选择了。
|
6
laucenmi 2020-02-04 10:21:44 +08:00
@linxy19957 openwrt 18 - 19.07 一直在用。 包括 v2ray 我也没有用他自己的路由规则,都是走的这套方案,不过在 IPv6 上 udp 有问题. 可以参考
https://github.com/v2ray/v2ray-core/issues/1309 |
7
manjuprajna 2020-07-17 01:49:26 +08:00
@laucenmi 我也是用的 openwrt1907,目前 ipv4 正常,ipv6 udp 还是有问题,请问您解决 ipv6 udp 转发的问题了吗? ip6tables 好像没有 tproxy 这个包。
另外,我在 openwrt 里,把这几条命令复制到 firewall.user 里, ip -f inet rule add fwmark 0x01/0x01 table 100 这条不生效,启动之后要登录 ssh 里手动输入一次。 现在只好把两条 ip 命令复制到 rc.local 里。 请问您是怎么解决的? |
8
laucenmi 2020-07-17 09:25:59 +08:00
@manjuprajna 没有哦,因为 ipv6 经常有莫名其妙的问题,所以我已经禁止 LAN 上的 ipv6 了
这些命令我都是在 Firewall - Custom Rules 里面保存的,应该也是保存到 firewall.user 里面的,被你一说我重新检查了下 stun 发现也是 ip -f inet rule add 没有生效... 搜索有类似的解决方案哦: https://forum.openwrt.org/t/solved-ip-rule-in-etc-firewall-user-is-flushed-somewhere/29797 |
9
laucenmi 2020-07-17 11:19:38 +08:00
@manjuprajna
/etc/config/firewall 里 include 添加 reload 选项就没问题了。 config include option path '/etc/firewall.user' option reload '1' 不过 firewall.user 里面的命令会被多次执行,虽然没啥影响,但是看起来多条重复的 rule 停难看的, 需要自己改进脚本。 |