Skip to content

Instantly share code, notes, and snippets.

@timercrack
Last active October 9, 2025 01:21
Show Gist options
  • Save timercrack/bc758a0021e2ee62a80e0ba5541804dd to your computer and use it in GitHub Desktop.
Save timercrack/bc758a0021e2ee62a80e0ba5541804dd to your computer and use it in GitHub Desktop.
openwrt + XRAY 使用 iptables 实现 IPV4 / IPV6 透明代理
#!/bin/sh
#路由器地址:192.168.123.1
#创建一张IPV4路由表,表名:"100" 添加一条规则
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
# 创建一张IPV6路由表,表名:"106" 添加一条规则 删除:ip -6 ru del table 106 查看:ip -6 ru list
#ip -6 rule add fwmark 1 table 106
#ip -6 route add local ::/0 dev lo table 106
ip route flush cache
# 代理IPV4局域网设备
iptables -t mangle -N XRAY
iptables -t mangle -A XRAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A XRAY -d 192.168.123.1/24 -p tcp -j RETURN
iptables -t mangle -A XRAY -d 192.168.123.1/24 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A XRAY -j RETURN -m mark --mark 0xff
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
iptables -t mangle -A XRAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
# 代理IPV4网关本机
iptables -t mangle -N XRAY_MASK
iptables -t mangle -A XRAY_MASK -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A XRAY_MASK -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A XRAY_MASK -d 192.168.123.1/24 -p tcp -j RETURN
iptables -t mangle -A XRAY_MASK -d 192.168.123.1/24 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A XRAY_MASK -m mark --mark 0xff -j RETURN
iptables -t mangle -A XRAY_MASK -p tcp -j MARK --set-mark 1
iptables -t mangle -A XRAY_MASK -p udp -j MARK --set-mark 1
# 代理IPV6局域网设备
#ip6tables -t mangle -N XRAY6
#ip6tables -t mangle -A XRAY6 -d ::1/128 -j RETURN
#ip6tables -t mangle -A XRAY6 -d fd07:22f2:2eb9::1/60 -p tcp -j RETURN
#ip6tables -t mangle -A XRAY6 -d fd07:22f2:2eb9::1/60 -p udp ! --dport 53 -j RETURN
#ip6tables -t mangle -A XRAY6 -j RETURN -m mark --mark 0xff
#ip6tables -t mangle -A XRAY6 -p tcp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
#ip6tables -t mangle -A XRAY6 -p udp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
# 新建 DIVERT 规则,避免已有连接的包二次通过 TPROXY,理论上有一定的性能提升
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
# 代理IPV6网关本机
#ip6tables -t mangle -N XRAY6_MASK
#ip6tables -t mangle -A XRAY6_MASK -d fd07:22f2:2eb9::1/60 -p tcp -j RETURN
#ip6tables -t mangle -A XRAY6_MASK -d fd07:22f2:2eb9::1/60 -p udp ! --dport 53 -j RETURN
#ip6tables -t mangle -A XRAY6_MASK -m mark --mark 0xff -j RETURN
#ip6tables -t mangle -A XRAY6_MASK -p tcp -j MARK --set-mark 1
#ip6tables -t mangle -A XRAY6_MASK -p udp -j MARK --set-mark 1
# 新建 DIVERT6 规则,避免已有连接的包二次通过 TPROXY,理论上有一定的性能提升
#ip6tables -t mangle -N DIVERT6
#ip6tables -t mangle -A DIVERT6 -j MARK --set-mark 1
#ip6tables -t mangle -A DIVERT6 -j ACCEPT
# 应用IPV4规则
iptables -t mangle -A PREROUTING -j XRAY
iptables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A OUTPUT -j XRAY_MASK
iptables -t mangle -I XRAY -m mark --mark 0xff -j RETURN
# 应用IPV6规则
#ip6tables -t mangle -A PREROUTING -j XRAY6
#ip6tables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT6
#ip6tables -t mangle -A OUTPUT -p tcp -j XRAY6_MASK
#ip6tables -t mangle -I XRAY6 -m mark --mark 0xff -j RETURN
@YuenJay
Copy link

YuenJay commented Aug 17, 2022

您好。我尝试了这个设置。我的网段是192.168.31.1/24。当我把xray和iptables脚本布置在家庭主路由192.168.31.1上时(它同时也是dhcp服务器),它工作得非常好。
但当我把它布置在同网段的另一台软路由(192.168.31.10),并在一台工作电脑上手动指定ip地址和网关(ip:192.168.31.150, 掩码:255.255.255.0,网关-在我的mac电脑上显示是路由器:192.168.31.10)。就不能透明代理了。此时,指定1080端口仍然可以完全正常代理国内和国外的,所以xray是没问题的。
2种情形,惟一的区别:一次安装在主路由(靠dhcp让客户端自动指定主路由为网关),一次安装在网段内的另一台主机上(并手动指定该主机为网关)。前者工作完好,后者不能工作(国内外都不能正常访问)。
您方便的时候可以提供一个布置在非主路由上的版本吗?谢谢!

@timercrack
Copy link
Author

你得软路由需要开启代理转发:
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p

@YuenJay
Copy link

YuenJay commented Aug 27, 2022

谢谢您的回复。我的是OPENWRT,所以默认是打开转发的。因于脚本没弄好,我最好装了PASSWALL。现在回想,应该是我的DNS链没设好造成不能正常访问。您的IPTABLES规则没问题。

@askiter
Copy link

askiter commented Oct 5, 2022

root@OpenWrt:~# iptables -t mangle -A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 2099 --tproxy-mark 1
iptables v1.8.7 (legacy): unknown option "--on-ip"
Try `iptables -h' or 'iptables --help' for more information.

请问这个是啥情况,我的OpenWrt是最新的官方稳定版本22.03

@YuenJay
Copy link

YuenJay commented Oct 7, 2022

root@OpenWrt:~# iptables -t mangle -A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 2099 --tproxy-mark 1 iptables v1.8.7 (legacy): unknown option "--on-ip" Try `iptables -h' or 'iptables --help' for more information.

请问这个是啥情况,我的OpenWrt是最新的官方稳定版本22.03

22.03由fw4代替了fw3,默认是不带iptables的。你应该是自行安装了iptables包。但可能还需要安装iptables-mod-conntrack-extra、iptables-mod-extra、iptables-mod-tproxy等。

@lionkingc
Copy link

请问如何指定某个IP通过XRAY上网, 某个IP直联路由,谢谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment