配置 TPROXY 失败,各位给点意见?

2020-02-03 21:37:12 +08:00
 linxy19957

最近尝试配置树莓派做透明代理,按说明配置完 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 转发呢?

4683 次点击
所在节点    问与答
9 条回复
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
ysc3839
2020-02-03 22:13:51 +08:00
建议使用 OpenWrt,官方源里面的 ss 带有 ss-rules,可以自动配置相关转发规则。
https://github.com/openwrt/packages/tree/master/net/shadowsocks-libev

同时 OpenWrt 也是开箱即用配置好了路由转发,不需要手动配置。
linxy19957
2020-02-03 22:45:16 +08:00
@laucenmi 对比了一下没有什么差别,请问你是什么操作系统呢?
linxy19957
2020-02-03 23:00:28 +08:00
@ysc3839 感谢回复,我的是树莓派 4b,当前 openwrt 只有 snapshot 版本
ysc3839
2020-02-03 23:06:17 +08:00
@linxy19957 你不介意的话可以先用着,看你选择了。
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
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 里。
请问您是怎么解决的?
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
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 停难看的, 需要自己改进脚本。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX