V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
linxy19957
V2EX  ›  问与答

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

  •  
  •   linxy19957 · 2020-02-03 21:37:12 +08:00 · 4702 次点击
    这是一个创建于 1762 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    9 条回复    2020-07-17 11:19:38 +08:00
    laucenmi
        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
    ysc3839
        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 也是开箱即用配置好了路由转发,不需要手动配置。
    linxy19957
        3
    linxy19957  
    OP
       2020-02-03 22:45:16 +08:00
    @laucenmi 对比了一下没有什么差别,请问你是什么操作系统呢?
    linxy19957
        4
    linxy19957  
    OP
       2020-02-03 23:00:28 +08:00
    @ysc3839 感谢回复,我的是树莓派 4b,当前 openwrt 只有 snapshot 版本
    ysc3839
        5
    ysc3839  
       2020-02-03 23:06:17 +08:00
    @linxy19957 你不介意的话可以先用着,看你选择了。
    laucenmi
        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
    manjuprajna
        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 里。
    请问您是怎么解决的?
    laucenmi
        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
    laucenmi
        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 停难看的, 需要自己改进脚本。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1786 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:32 · PVG 00:32 · LAX 08:32 · JFK 11:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.