我在使用连接的同一台 Linux 机器上运行代理客户端。在配置中,我可以告诉它使用 tproxy 到端口 2500。代理在端口 443 上运行,使用 TLS(尽管这部分由代理接管管理)
因此我需要使用 iptables 或 nftables 将所有数据包路由到代理。但我也需要标记它们,以免造成循环。
我最初的尝试没有成功,好像我的 UDP 数据包没有通过(我位于 NAT 后面,但我不知道这是不是问题,因为我无论如何都在使用代理)。我想知道它如何更好地工作,以便我可以自己调试它。
这是我的尝试:
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
#Setup a chain DIVERT to mark packets
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
#Use DIVERT to prevent existing connections going through TPROXY twice:
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A PREROUTING -p udp -m socket -j DIVERT
#Mark all other (new) packets and use TPROXY to pass into xray
iptables -t mangle -A PREROUTING -p tcp -j TPROXY --tproxy-mark 0x1/0x1 --on-port 2500
iptables -t mangle -A PREROUTING -p udp -j TPROXY --tproxy-mark 0x1/0x1 --on-port 2500
#disable rp_filter and enable ip_forward
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.wlp38s0.rp_filter=0
数据包只是按照我的规则传递,就像它们不存在一样
因此我想出了一个方法,即以不同的用户身份运行 xray 可执行文件:
sudo -u xray_tproxy xray -c config.json
其中 GID 为 23333接下来我创建了这些规则
我运行它们
sudo
参见: https://xtls.github.io/document/level-2/iptables_gid.html#_3-%E9%85%8D%E7%BD%AE%E6%9C%80%E5%A4%A7%E6%96%87%E4%BB%B6%E6%89%93%E5%BC%80%E6%95%B0-%E8%BF%90%E8%A1%8C-xray-%E5%AE%A2%E6%88%B7%E7%AB%AF