Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

legacy分支的透明代理配置不生效 #449

Open
perqin opened this issue Apr 5, 2022 · 12 comments
Open

legacy分支的透明代理配置不生效 #449

perqin opened this issue Apr 5, 2022 · 12 comments

Comments

@perqin
Copy link

perqin commented Apr 5, 2022

我的路由器是GL-iNet的一款用了国产芯片的路由器(SFT1200),所以没有办法使用预编译的v2ray,预装的Openwrt是18.06版本,因此我自行编译了kuoruan/openwrt-v2ray和本项目的legacy分支并都顺利安装上去了。但是实际使用发现透明代理没有生效。

我的网络拓扑如下:

  • 光猫:192.168.1.1
  • 客厅主路由WAN:连接光猫,192.168.0.1
  • 客厅NAS:连接主路由LAN,192.168.0.110
  • SFT1200:WAN连接主路由LAN,192.168.0.116;NAT子网为192.168.8.0/24,其在子网的地址是192.168.8.1
  • PC:连接SFT1200的LAN,192.168.8.204

NAS:

  • 运行v2ray,监听0.0.0.0的2022端口,socks5协议,入站流量会经过我配置的路由规则;
  • 运行coredns,监听0.0.0.0的53端口,作为DNS服务器提供DNS分流功能,非国内域名使用上述v2ray走代理解析域名,详细配置不表。

SFT1200:

  • 配置一个dokodemo-door入站,用于透明代理;
  • 配置一个socks5入站,用于调试;
  • tag为proxy的出站,配置为socks5协议,目标为NAS,即:socks5://192.168.0.110:2022;
  • DNS配置中,指定DNS服务器为192.168.0.110;
  • 透明代理配置中,启用udp转发。

首先我在我的PC上验证了我的NAS和SFT1200的socks5入站都是正常的:

[perqin@DESKTOP-JQ6QUA0 ~]$ curl -x socks5://192.168.0.110:2022 https://www.google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.com.hk/url?sa=p&amp;hl=zh-CN&amp;pref=hkredirect&amp;pval=yes&amp;q=https://www.google.com.hk/&amp;ust=1649164413112276&amp;usg=AOvVaw1UV52rNdVL1yxrdmu36U_R">here</A>.
</BODY></HTML>
[perqin@DESKTOP-JQ6QUA0 ~]$ curl -x socks5://192.168.8.1:1080 https://www.google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://www.google.com.hk/url?sa=p&amp;hl=zh-CN&amp;pref=hkredirect&amp;pval=yes&amp;q=https://www.google.com.hk/&amp;ust=1649164444517604&amp;usg=AOvVaw20V49s0iqatQJH5Ud80aQd">here</A>.
</BODY></HTML>

然后验证了NAS上的DNS服务也是正常的(下面的gen10.perqin.com是我通过coredns的hosts文件配置的,公网没有这个子域名),并且看起来SFT1200上的DNS也是向NAS查询的:

[perqin@DESKTOP-JQ6QUA0 ~]$ drill @192.168.0.110 gen10.perqin.com
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 16395
;; flags: qr aa rd ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; gen10.perqin.com.    IN      A

;; ANSWER SECTION:
gen10.perqin.com.       3600    IN      A       192.168.0.110

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 7 msec
;; SERVER: 192.168.0.110
;; WHEN: Tue Apr  5 21:16:01 2022
;; MSG SIZE  rcvd: 66
[perqin@DESKTOP-JQ6QUA0 ~]$ drill @192.168.8.1 gen10.perqin.com
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 50049
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; gen10.perqin.com.    IN      A

;; ANSWER SECTION:
gen10.perqin.com.       600     IN      A       192.168.0.110

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 19 msec
;; SERVER: 192.168.8.1
;; WHEN: Tue Apr  5 21:16:39 2022
;; MSG SIZE  rcvd: 50

但在PC上无法正常访问Google,提示超时;我在NAS上配置了CN直连,在PC上访问国内站点确实可以打开,虽然不知道为什么特别慢。

SFT1200上/var/etc/v2ray/v2ray.main.json的内容如下:

{
        "log": {
                "access": "\/dev\/null",
                "loglevel": "warning",
                "error": "\/var\/log\/v2ray-error.log"
        },
        "dns": {
                "tag": "dns",
                "hosts": {
                        "example.com": "127.0.0.1"
                },
                "servers": [
                        {
                                "address": "192.168.0.110",
                                "port": 53
                        }
                ]
        },
        "routing": {
                "domainStrategy": "IPOnDemand",
                "rules": [
                        {
                                "type": "field",
                                "protocol": [
                                        "bittorrent"
                                ],
                                "outboundTag": "direct"
                        },
                        {
                                "type": "field",
                                "port": "53",
                                "network": "udp",
                                "inboundTag": [
                                        "transparent"
                                ],
                                "outboundTag": "dns_out"
                        },
                        {
                                "type": "field",
                                "ip": [
                                        "114.114.114.114",
                                        "223.5.5.5"
                                ],
                                "outboundTag": "direct"
                        },
                        {
                                "type": "field",
                                "ip": [
                                        "1.1.1.1",
                                        "8.8.8.8",
                                        "208.67.222.222"
                                ],
                                "outboundTag": "proxy"
                        },
                        {
                                "type": "field",
                                "port": "123",
                                "network": "udp",
                                "outboundTag": "direct"
                        },
                        {
                                "type": "field",
                                "inboundTag": [
                                        "dns"
                                ],
                                "outboundTag": "direct"
                        }
                ]
        },
        "inbounds": [
                {
                        "listen": "0.0.0.0",
                        "port": 1081,
                        "protocol": "dokodemo-door",
                        "settings": {
                                "followRedirect": true,
                                "network": "tcp,udp"
                        },
                        "streamSettings": {
                                "sockopt": {
                                        "tproxy": "tproxy"
                                }
                        },
                        "tag": "transparent",
                        "sniffing": {
                                "enabled": true,
                                "destOverride": [
                                        "http",
                                        "tls"
                                ]
                        }
                },
                {
                        "listen": "0.0.0.0",
                        "port": 1080,
                        "protocol": "socks",
                        "settings": {
                                "auth": "noauth",
                                "udp": false
                        },
                        "streamSettings": {
                                "sockopt": {

                                }
                        },
                        "sniffing": {
                                "enabled": true,
                                "destOverride": [
                                        "http",
                                        "tls"
                                ]
                        }
                }
        ],
        "outbounds": [
                {
                        "protocol": "socks",
                        "settings": {
                                "servers": [
                                        {
                                                "address": "192.168.0.110",
                                                "port": 2022
                                        }
                                ]
                        },
                        "streamSettings": {
                                "sockopt": {
                                        "mark": 255
                                }
                        },
                        "tag": "proxy"
                },
                {
                        "protocol": "freedom",
                        "settings": {

                        },
                        "streamSettings": {
                                "sockopt": {
                                        "mark": 255
                                }
                        },
                        "tag": "direct"
                },
                {
                        "protocol": "blackhole",
                        "settings": {

                        },
                        "streamSettings": {
                                "sockopt": {
                                        "mark": 255
                                }
                        },
                        "tag": "block"
                },
                {
                        "protocol": "dns",
                        "settings": {

                        },
                        "streamSettings": {
                                "sockopt": {
                                        "mark": 255
                                }
                        },
                        "tag": "dns_out"
                }
        ]
}

iptables的配置如下:

root@GL-SFT1200:~# iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N V2RAY
-N V2RAY_MASK
-N mwan3_connected
-N mwan3_hook
-N mwan3_iface_in_wan
-N mwan3_ifaces_in
-N mwan3_policy_default_poli
-N mwan3_rules
-A PREROUTING -j mwan3_hook
-A PREROUTING -i br-lan -j V2RAY
-A PREROUTING -m mark --mark 0x1 -j V2RAY
-A FORWARD -o eth0.2 -p tcp -m tcp --tcp-flags SYN,RST SYN -m comment --comment "!fw3: Zone wan MTU fixing" -j TCPMSS --clamp-mss-to-pmtu
-A OUTPUT -j mwan3_hook
-A OUTPUT -j V2RAY_MASK
-A V2RAY -m mark --mark 0xff -j RETURN
-A V2RAY -d 192.168.8.1/32 -p udp -m udp --dport 53 -j TPROXY --on-port 1081 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1
-A V2RAY -m set --match-set v2ray_src_direct_v4 src -j RETURN
-A V2RAY -m set --match-set v2ray_dst_direct_v4 dst -j RETURN
-A V2RAY -p tcp -j TPROXY --on-port 1081 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1
-A V2RAY -p udp -j TPROXY --on-port 1081 --on-ip 0.0.0.0 --tproxy-mark 0x1/0x1
-A V2RAY_MASK -m mark --mark 0xff -j RETURN
-A V2RAY_MASK -m set --match-set v2ray_src_direct_v4 src -j RETURN
-A V2RAY_MASK -m set --match-set v2ray_dst_direct_v4 dst -j RETURN
-A V2RAY_MASK -p tcp -j MARK --set-xmark 0x1/0xffffffff
-A V2RAY_MASK -p udp -j MARK --set-xmark 0x1/0xffffffff
-A mwan3_connected -m set --match-set mwan3_connected dst -j MARK --set-xmark 0x3f00/0x3f00
-A mwan3_hook -j CONNMARK --restore-mark --nfmask 0x3f00 --ctmask 0x3f00
-A mwan3_hook -m mark --mark 0x0/0x3f00 -j mwan3_ifaces_in
-A mwan3_hook -m mark --mark 0x0/0x3f00 -j mwan3_connected
-A mwan3_hook -m mark --mark 0x0/0x3f00 -j mwan3_rules
-A mwan3_hook -j CONNMARK --save-mark --nfmask 0x3f00 --ctmask 0x3f00
-A mwan3_hook -m mark ! --mark 0x3f00/0x3f00 -j mwan3_connected
-A mwan3_iface_in_wan -i eth0.2 -m set --match-set mwan3_connected src -m mark --mark 0x0/0x3f00 -m comment --comment default -j MARK --set-xmark 0x3f00/0x3f00
-A mwan3_iface_in_wan -i eth0.2 -m mark --mark 0x0/0x3f00 -m comment --comment wan -j MARK --set-xmark 0x100/0x3f00
-A mwan3_ifaces_in -m mark --mark 0x0/0x3f00 -j mwan3_iface_in_wan
-A mwan3_policy_default_poli -m mark --mark 0x0/0x3f00 -m comment --comment "wan 3 3" -j MARK --set-xmark 0x100/0x3f00
-A mwan3_rules -m mark --mark 0x0/0x3f00 -m comment --comment default_rule -j mwan3_policy_default_poli

看起来是TCP流量没有通过透明代理转发给NAS导致的,是哪里的规则配置出了问题呢?

@jeccyyeah
Copy link

我的为啥只有5行呢?用curl -x 去访问特定网站也没问题
/ # iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
/ #

@perqin
Copy link
Author

perqin commented May 2, 2022

我的为啥只有5行呢?用curl -x 去访问特定网站也没问题 / # iptables -S -t mangle -P PREROUTING ACCEPT -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT / #

我用的路由器自带了一些防火墙规则;你这个输出里都没有包含透明代理相关的规则呀

@jeccyyeah
Copy link

jeccyyeah commented May 2, 2022

   所以我很奇怪啊,开始的时候我怎么设置透明代理,执行iptables --list都没有变化。后来我看到有网站说luci-app-v2ray 是在特定Client用的,不用set iptables,以为是v2ray可能会主动调用类似功能,所以也没再纠结iptables的问题。这个透明代理相关规则从哪儿来的呢?有没有可能是我把firewall清空造成的呢?
  我的理解配置完ransparent Proxy至少得有个进dokodemo-door端口得iptable把。

@jeccyyeah
Copy link

所以我很奇怪啊,我怎么设置透明代理,执行iptables --list都没有变化。后来我看到有网站说luci-app-v2ray 是在特定Client用的,不用set iptables,以为是v2ray可能会主动调用类似功能,所以也没再纠结iptables的问题。这个透明代理相关规则从哪儿来的呢?有没有可能是我把firewall清空造成的呢?

@perqin
Copy link
Author

perqin commented May 2, 2022

透明代理的设置在luci-app-v2ray的web gui里设置,在“透明代理”选项卡里选择一个dokodemo-door的入站之后就可以了,然后运行iptables就可以看到相关的规则。

@jeccyyeah
Copy link

透明代理的设置在luci-app-v2ray的web gui里设置,在“透明代理”选项卡里选择一个dokodemo-door的入站之后就可以了,然后运行iptables就可以看到相关的规则。

我也是觉得应该是这样,反复试过多次配置transparent Proxy,iptables都没变化。环境是:nas-docker-OpenWrt 21.02.2- V2Ray 4.44.0-做旁路由,docker镜像是openwrtorg/rootfs,检查kmod-ipt-tproxy iptables-mod-tproxy bind-dig之类的包也都有。执行“curl -Is -x 127.0.0.1:8123 特定网站”返回200,也正常。看来就是配置transparent Proxy的问题。只不过不知道为什么不能生成iptables

@jeccyyeah
Copy link

你的问题我估计主路由改桥接就能搞定了

@jeccyyeah
Copy link

话说你为什么不用docker直接做路由呢?

@sharljimhtsin
Copy link

和我问题很像,我的是广联的gl.net sft 165 设置透明代理的n1为网关无效,头大……

@sharljimhtsin
Copy link

我的为啥只有5行呢?用curl -x 去访问特定网站也没问题
/ # iptables -S -t mangle
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
/ #

你的规则在nat链表里,你不是tproxy模式

@sharljimhtsin
Copy link

我的问题查到了,是傻逼的上海电信的送的广猫(烽火某型号)做的限制,第一级路由下只有光猫自己的ip .1 能做网关,其他一概不通。也就是说一级路由下旁路由基本没戏了。和openwrt和iptables 以及v2ray没有一毛钱关系……

@robberphex
Copy link

robberphex commented May 20, 2023

You could check the rule at mwan3_hook chain. it set mark on packets, which means overwrite the mask 0xff from v2ray.

At luci-app-v2ray, and official guide it just set mark and match mark, which is conflict with GL-iNet Router. So we should set mark with mask (like --set-xmark 0x1/0x1), match mark with mask (like --mark 0x2/0x2).

P.S. iptables -j LOG is useful for debug iptables. -j TRACE is more useful, but not available at some routers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants