fix: tproxy cannot work on openwrt

This commit is contained in:
mzz2017 2021-09-02 00:45:36 +08:00
parent 6d1cd49b1d
commit 8f8e5ce76a
5 changed files with 69 additions and 95 deletions

View File

@ -41,6 +41,8 @@ See [**v2rayA - Wiki**](https://github.com/v2rayA/v2rayA/wiki/Usage)
[Loyalsoldier/v2ray-rules-dat](https://github.com/Loyalsoldier/v2ray-rules-dat)
[zfl9/ss-tproxy](https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy)
## Stargazers over time
[![Stargazers over time](https://starchart.cc/v2rayA/v2rayA.svg)](https://starchart.cc/v2rayA/v2rayA)

View File

@ -43,6 +43,8 @@ v2rayA主要提供了下述使用方法
[Loyalsoldier/v2ray-rules-dat](https://github.com/Loyalsoldier/v2ray-rules-dat)
[zfl9/ss-tproxy](https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy)
## 协议
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)

View File

@ -16,7 +16,7 @@ func (t *tproxy) AddIPWhitelist(cidr string) {
// avoid duplication
t.RemoveIPWhitelist(cidr)
var commands string
commands = fmt.Sprintf(`iptables -w 2 -t mangle -I SETMARK 6 -d %s -j RETURN`, cidr)
commands = fmt.Sprintf(`iptables -w 2 -t mangle -I TP_RULE 5 -d %s -j RETURN`, cidr)
if !strings.Contains(cidr, ".") {
//ipv6
commands = strings.Replace(commands, "iptables", "ip6tables", 1)
@ -36,118 +36,88 @@ func (t *tproxy) RemoveIPWhitelist(cidr string) {
func (t *tproxy) GetSetupCommands() SetupCommands {
commands := `
# 设置策略路由
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
# 建链
iptables -w 2 -t mangle -N TP_OUT
iptables -w 2 -t mangle -N TP_PRE
iptables -w 2 -t mangle -N TP_RULE
iptables -w 2 -t mangle -I OUTPUT -j TP_OUT
iptables -w 2 -t mangle -I PREROUTING -j TP_PRE
iptables -w 2 -t mangle -I OUTPUT -j TP_OUT
# 打上 iptables 标记mark 了的会走代理
iptables -w 2 -t mangle -N SETMARK
# 出方向白名单端口
iptables -w 2 -t mangle -A SETMARK -i docker+ -j RETURN
iptables -w 2 -t mangle -A SETMARK -i veth+ -j RETURN
iptables -w 2 -t mangle -A SETMARK -i br-+ -j RETURN
iptables -w 2 -t mangle -A SETMARK -p udp --dport 53 ! -d 127.0.0.0/8 -j MARK --set-mark 1
iptables -w 2 -t mangle -A SETMARK -p tcp --dport 53 ! -d 127.0.0.0/8 -j MARK --set-mark 1
# 注意如果要调整位置记得调整func AddIPWhitelist的插入位置
iptables -w 2 -t mangle -A SETMARK -d 0.0.0.0/32 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 10.0.0.0/8 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 100.64.0.0/10 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 127.0.0.0/8 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 169.254.0.0/16 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 172.16.0.0/12 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 192.0.0.0/24 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 192.0.2.0/24 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 192.88.99.0/24 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 192.168.0.0/16 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 198.18.0.0/15 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 198.51.100.0/24 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 203.0.113.0/24 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 224.0.0.0/4 -j RETURN
iptables -w 2 -t mangle -A SETMARK -d 240.0.0.0/4 -j RETURN
iptables -w 2 -t mangle -A SETMARK -p tcp -m multiport --sports {{TCP_PORTS}} -j RETURN
iptables -w 2 -t mangle -A SETMARK -p udp -m multiport --sports {{UDP_PORTS}} -j RETURN
iptables -w 2 -t mangle -A SETMARK -p tcp -j MARK --set-mark 1
iptables -w 2 -t mangle -A SETMARK -p udp -j MARK --set-mark 1
# CORE流量通行
iptables -w 2 -t mangle -A TP_OUT -m mark --mark 0xff -j RETURN
iptables -w 2 -t mangle -A TP_OUT -p tcp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
iptables -w 2 -t mangle -A TP_OUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
# 本机发出去的 TCP UDP 走一下 SETMARK
iptables -w 2 -t mangle -A TP_OUT -p tcp -m mark ! --mark 1 -j SETMARK
iptables -w 2 -t mangle -A TP_OUT -p udp -m mark ! --mark 1 -j SETMARK
# CORE流量通行
iptables -w 2 -t mangle -A TP_PRE -m mark --mark 0xff -j RETURN
# 让内网主机发出的 TCP UDP 走一下 SETMARK
iptables -w 2 -t mangle -A TP_PRE -p tcp -m mark ! --mark 1 -j SETMARK
iptables -w 2 -t mangle -A TP_PRE -p udp -m mark ! --mark 1 -j SETMARK
# 将所有打了标记的 TCP UDP 包透明地转发到代理的监听端口
iptables -w 2 -t mangle -A TP_PRE -m mark --mark 1 -p tcp -j TPROXY --on-port 32345 --tproxy-mark 1
iptables -w 2 -t mangle -A TP_PRE -m mark --mark 1 -p udp -j TPROXY --on-port 32345 --tproxy-mark 1
iptables -w 2 -t mangle -A TP_PRE -i lo -m mark ! --mark 1 -j RETURN
iptables -w 2 -t mangle -A TP_PRE -p tcp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
iptables -w 2 -t mangle -A TP_PRE -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
iptables -w 2 -t mangle -A TP_PRE -p tcp -m mark --mark 1 -j TPROXY --on-port 32345 --on-ip 127.0.0.1
iptables -w 2 -t mangle -A TP_PRE -p udp -m mark --mark 1 -j TPROXY --on-port 32345 --on-ip 127.0.0.1
iptables -w 2 -t mangle -A TP_RULE -j CONNMARK --restore-mark
iptables -w 2 -t mangle -A TP_RULE -m mark --mark 1 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -i docker+ -j RETURN
iptables -w 2 -t mangle -A TP_RULE -i veth+ -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 0.0.0.0/32 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 10.0.0.0/8 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 100.64.0.0/10 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 127.0.0.0/8 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 169.254.0.0/16 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 172.16.0.0/12 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 192.0.0.0/24 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 192.0.2.0/24 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 192.88.99.0/24 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 192.168.0.0/16 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 198.18.0.0/15 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 198.51.100.0/24 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 203.0.113.0/24 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 224.0.0.0/4 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -d 240.0.0.0/4 -j RETURN
iptables -w 2 -t mangle -A TP_RULE -p tcp -m tcp --syn -j MARK --set-mark 1
iptables -w 2 -t mangle -A TP_RULE -p udp -m conntrack --ctstate NEW -j MARK --set-mark 1
iptables -w 2 -t mangle -A TP_RULE -j CONNMARK --save-mark
`
if IsIPv6Supported() {
commands += `
# 设置策略路由
ip -6 rule add fwmark 1 table 100
ip -6 route add local ::/0 dev lo table 100
# 建链
ip6tables -w 2 -t mangle -N TP_OUT
ip6tables -w 2 -t mangle -N TP_PRE
ip6tables -w 2 -t mangle -N TP_RULE
ip6tables -w 2 -t mangle -I OUTPUT -j TP_OUT
ip6tables -w 2 -t mangle -I PREROUTING -j TP_PRE
ip6tables -w 2 -t mangle -I OUTPUT -j TP_OUT
# 打上 iptables 标记mark 了的会走代理
ip6tables -w 2 -t mangle -N SETMARK
# 出方向白名单端口
ip6tables -w 2 -t mangle -A SETMARK -i docker+ -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -i veth+ -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -i br-+ -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -p udp --dport 53 ! -d ::1/128 -j MARK --set-mark 1
ip6tables -w 2 -t mangle -A SETMARK -p tcp --dport 53 ! -d ::1/128 -j MARK --set-mark 1
# 注意如果要调整位置记得调整func AddIPWhitelist的插入位置
ip6tables -w 2 -t mangle -A SETMARK -d ::/128 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d ::1/128 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d 64:ff9b::/96 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d 100::/64 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d 2001::/32 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d 2001:20::/28 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d 2001:db8::/32 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d 2002::/16 -j RETURN
# fakedns
# ip6tables -w 2 -t mangle -A SETMARK -d fc00::/7 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d fe80::/10 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -d ff00::/8 -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -p tcp -m multiport --sports {{TCP_PORTS}} -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -p udp -m multiport --sports {{UDP_PORTS}} -j RETURN
ip6tables -w 2 -t mangle -A SETMARK -p tcp -j MARK --set-mark 1
ip6tables -w 2 -t mangle -A SETMARK -p udp -j MARK --set-mark 1
# CORE流量通行
ip6tables -w 2 -t mangle -A TP_OUT -m mark --mark 0xff -j RETURN
ip6tables -w 2 -t mangle -A TP_OUT -p tcp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
ip6tables -w 2 -t mangle -A TP_OUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
# 本机发出去的 TCP UDP 走一下 SETMARK
ip6tables -w 2 -t mangle -A TP_OUT -p tcp -m mark ! --mark 1 -j SETMARK
ip6tables -w 2 -t mangle -A TP_OUT -p udp -m mark ! --mark 1 -j SETMARK
# CORE流量通行
ip6tables -w 2 -t mangle -A TP_PRE -m mark --mark 0xff -j RETURN
# 让内网主机发出的 TCP UDP 走一下 SETMARK
ip6tables -w 2 -t mangle -A TP_PRE -p tcp -m mark ! --mark 1 -j SETMARK
ip6tables -w 2 -t mangle -A TP_PRE -p udp -m mark ! --mark 1 -j SETMARK
# 将所有打了标记的 TCP UDP 包透明地转发到代理的监听端口
ip6tables -w 2 -t mangle -A TP_PRE -m mark --mark 1 -p tcp -j TPROXY --on-port 32345 --tproxy-mark 1
ip6tables -w 2 -t mangle -A TP_PRE -m mark --mark 1 -p udp -j TPROXY --on-port 32345 --tproxy-mark 1
ip6tables -w 2 -t mangle -A TP_PRE -i lo -m mark ! --mark 1 -j RETURN
ip6tables -w 2 -t mangle -A TP_PRE -p tcp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
ip6tables -w 2 -t mangle -A TP_PRE -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j TP_RULE
ip6tables -w 2 -t mangle -A TP_PRE -p tcp -m mark --mark 1 -j TPROXY --on-port 32345 --on-ip ::1
ip6tables -w 2 -t mangle -A TP_PRE -p udp -m mark --mark 1 -j TPROXY --on-port 32345 --on-ip ::1
ip6tables -w 2 -t mangle -A TP_RULE -j CONNMARK --restore-mark
ip6tables -w 2 -t mangle -A TP_RULE -m mark --mark 1 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -i docker+ -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -i veth+ -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d ::/128 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d ::1/128 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d 64:ff9b::/96 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d 100::/64 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d 2001::/32 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d 2001:20::/28 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d fe80::/10 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -d ff00::/8 -j RETURN
ip6tables -w 2 -t mangle -A TP_RULE -p tcp -m tcp --syn -j MARK --set-mark 1
ip6tables -w 2 -t mangle -A TP_RULE -p udp -m conntrack --ctstate NEW -j MARK --set-mark 1
ip6tables -w 2 -t mangle -A TP_RULE -j CONNMARK --save-mark
`
}
return SetupCommands(commands)
@ -164,12 +134,12 @@ iptables -w 2 -t mangle -X TP_OUT
iptables -w 2 -t mangle -F TP_PRE
iptables -w 2 -t mangle -D PREROUTING -j TP_PRE
iptables -w 2 -t mangle -X TP_PRE
iptables -w 2 -t mangle -F SETMARK
iptables -w 2 -t mangle -X SETMARK
iptables -w 2 -t mangle -F TP_RULE
iptables -w 2 -t mangle -X TP_RULE
`
if IsIPv6Supported() {
commands += `
ip -6 rule del fwmark 1 table 100
ip -6 rule del fwmark 1 table 100
ip -6 route del local ::/0 dev lo table 100
ip6tables -w 2 -t mangle -F TP_OUT
@ -178,8 +148,8 @@ ip6tables -w 2 -t mangle -X TP_OUT
ip6tables -w 2 -t mangle -F TP_PRE
ip6tables -w 2 -t mangle -D PREROUTING -j TP_PRE
ip6tables -w 2 -t mangle -X TP_PRE
ip6tables -w 2 -t mangle -F SETMARK
ip6tables -w 2 -t mangle -X SETMARK
ip6tables -w 2 -t mangle -F TP_RULE
ip6tables -w 2 -t mangle -X TP_RULE
`
}
return CleanCommands(commands)

View File

@ -70,7 +70,7 @@ func (d *DnsSupervisor) DeleteHandles(ifname string) (err error) {
}
close(d.handles[ifname].done)
delete(d.handles, ifname)
log.Trace("DnsSupervisor:", ifname, "closed")
log.Trace("DnsSupervisor:%v closed", ifname)
return
}

View File

@ -148,7 +148,7 @@ func UpdateV2RayConfig() (err error) {
defer func() {
if err == nil {
if e := CheckAndSetupTransparentProxy(true); e != nil {
err = fmt.Errorf("%w: %w", err, e)
err = e
if IsV2RayRunning() {
if e = StopV2rayService(true); e != nil {
err = fmt.Errorf("%w: %w", err, e)