zfl9 / ipt2socks

将 iptables/nftables 传入的透明代理流量转为 socks5 流量的实用工具
GNU Affero General Public License v3.0
411 stars 94 forks source link

好像udp只能转发到本机 (v2ray的socks5实现有问题) #28

Closed t66y100 closed 3 years ago

t66y100 commented 3 years ago

ea6200 运行ipt2socks,转发到局域网内跑v2ray的debian。

ea6200 192.168.1.1 Linux unknown 2.6.36.4brcmarm #17 PREEMPT Thu May 7 22:42:27 CEST 2020 armv7l Tomato

debian 192.168.1.149 Linux Debian 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) x86_64 GNU/Linux

不能转发udp到192.168.1.149,tcp是可以的。 我测试了redsocks和redsocks2,也是一样的结果。

运行命令: /jffs/ipt2socks -b 192.168.1.1 -l 12345 -s 192.168.1.149 -p 1081 -R -4&

在局域网内win10电脑运行 NAT 类型测试工具 后:

错误提示: 2020-07-15 13:44:11 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:11 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:12 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:14 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:16 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:18 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:20 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:22 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:24 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:26 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:28 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused 2020-07-15 13:44:30 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused

查看netstat -nap|grep ipt2socks udp 0 0 0.0.0.0:12345 0.0.0.0:* 16749/ipt2socks udp 0 0 127.0.0.1:24157 127.0.0.1:1081 ESTABLISHED 16749/ipt2socks udp 0 0 127.0.0.1:6012 127.0.0.1:1081 ESTABLISHED 16749/ipt2socks udp 0 0 127.0.0.1:61083 127.0.0.1:1081 ESTABLISHED 16749/ipt2socks udp 0 0 127.0.0.1:9646 127.0.0.1:1081 ESTABLISHED 16749/ipt2socks udp 0 0 127.0.0.1:39615 127.0.0.1:1081 ESTABLISHED 16749/ipt2socks

iptables规则: iptables -t mangle -N FUCKGFW ip route add local 0/0 dev lo table 100 ip rule add fwmark 0x2333/0x2333 lookup 100 iptables -t mangle -A FUCKGFW -d 0.0.0.0/8 -j RETURN iptables -t mangle -A FUCKGFW -d 10.0.0.0/8 -j RETURN iptables -t mangle -A FUCKGFW -d 127.0.0.0/8 -j RETURN iptables -t mangle -A FUCKGFW -d 169.254.0.0/16 -j RETURN iptables -t mangle -A FUCKGFW -d 172.16.0.0/12 -j RETURN iptables -t mangle -A FUCKGFW -d 192.168.0.0/16 -j RETURN iptables -t mangle -A FUCKGFW -d 224.0.0.0/4 -j RETURN iptables -t mangle -A FUCKGFW -d 240.0.0.0/4 -j RETURN iptables -t mangle -A FUCKGFW -s 192.168.1.149 -j RETURN iptables -t mangle -A FUCKGFW -p udp -j TPROXY --tproxy-mark 0x2333/0x2333 --on-port 12345 iptables -t mangle -A PREROUTING -p udp -s 192.168/16 -j FUCKGFW

t66y100 commented 3 years ago

我用socat中转一下: socat UDP4-LISTEN:1081,reuseaddr,fork UDP4:192.168.1.149:1081 udp通了,可以FullCone。 要是可以直接转发就好了。

捕获

zfl9 commented 3 years ago
iptables -t mangle -A FUCKGFW -p udp -j TPROXY --tproxy-mark 0x2333/0x2333 --on-port 12345

这句规则改为下面这句试试?

iptables -t mangle -A FUCKGFW -p udp -j TPROXY --tproxy-mark 0x2333/0x2333 --on-ip 192.168.1.1 --on-port 12345
zfl9 commented 3 years ago

我只能说是你的iptables规则或者是ipt2socks/redsocks2的监听地址问题,ss-tproxy一直都能正常代理tcp/udp的(tproxy方式和redirect都行)

t66y100 commented 3 years ago

我只能说是你的iptables规则或者是ipt2socks/redsocks2的监听地址问题,ss-tproxy一直都能正常代理tcp/udp的(tproxy方式和redirect都行)

我改了还是不行。 根据ipt2socks的运行命令/jffs/ipt2socks -b 192.168.1.1 -l 12345 -s 192.168.1.149 -p 1081 -R -4& 并结合netstat -nap|grep ipt2socks的结果:udp 0 0 0.0.0.0:12345 0.0.0.0:* 16749/ipt2socks ipt2socks是监听在0.0.0.0的,监听没有问题。

会不会是下面这两条规则问题啊,我完全不懂,都是照抄的v2和ss的规则。 v2和ss的教程都是转发到本机,以前用着也一直没问题,现在我转发到另一台机器,搞不懂了。

请大大帮忙测试一下,主路由实在跑不动v2ray啊,谢谢。

ip route add local 0/0 dev lo table 100 ip rule add fwmark 0x2333/0x2333 lookup 100

zfl9 commented 3 years ago

ipt2socks 监听地址改为 -b 0.0.0.0 -l 12345 iptables规则的tproxy改为 --on-ip 127.0.0.1 --on-port 12345

t66y100 commented 3 years ago

ipt2socks 监听地址改为 -b 0.0.0.0 -l 12345 iptables规则的tproxy改为 --on-ip 127.0.0.1 --on-port 12345

好的,感谢回复。现在离家要十多天,待回去后再改,谢谢。

t66y100 commented 3 years ago

ipt2socks 监听地址改为 -b 0.0.0.0 -l 12345 iptables规则的tproxy改为 --on-ip 127.0.0.1 --on-port 12345

如此修改后ipt2socks还是转发到了127.0.0.1。 还是靠socat转发吧,好像性能也没有损失。

zfl9 commented 3 years ago

只能说你的环境“特殊”吧,我自己测试完全ok,其他人也是都ok。

t66y100 commented 3 years ago

只能说你的环境“特殊”吧,我自己测试完全ok,其他人也是都ok。

恩,感谢耐心回复。 都没有xt_TPROXY.ko的,但是可以tproxy。 可能是内核太老了。

Provissy commented 3 years ago

遇到同样的问题。。用的是ss-tproxy + ipt2proxy组合, tcp转发无问题, udp全都是

2020-08-11 19:19:57 ERR: [udp_socks5_recv_udpmessage_cb] recv from socks5 server: Connection refused

同样同的是V2RAY,会不会v2ray的问题呢,用的是QV2RAY,打开了UDP支持的。

Provissy commented 3 years ago
## mode                                                                                                                                                                                                            
mode='global'  # global ...... (.........)                                                                                                                                                                         
#mode='gfwlist' # gfwlist ...... (.........)                                                                                                                                                                       
#mode='chnroute' # chnroute ...... (.........)                                                                                                                                                                     

## ipv4/6                                                                                                                                                                                                          
ipv4='true'     # true:......ipv4............; false:......ipv4............                                                                                                                                        
ipv6='false'    # true:......ipv6............; false:......ipv6............                                                                                                                                        

## tproxy                                                                                                                                                                                                          
tproxy='true'  # true:TPROXY+TPROXY; false:REDIRECT+TPROXY                                                                                                                                                         

## tcponly                                                                                                                                                                                                         
tcponly='false' # true:.........TCP......; false:......TCP...UDP......                                                                                                                                             

## selfonly                                                                                                                                                                                                        
selfonly='false' # true:.....................; false:..............."......"......                                                                                                                                 

## proxy                                                                                                                                                                                                           
proxy_svraddr4=(192.168.10.10) # ............ IPv4 ..................................................................                                                                                              
proxy_svraddr6=()        # ............ IPv6 ..................................................................                                                                                                    
proxy_svrport='80,443'   # ......................................................... ipts_proxy_dst_port                                                                                                     
proxy_tcpport='60080'    # ss/ssr/v2ray .................. TCP ..........................................                                                                                                          
proxy_udpport='60080'    # ss/ssr/v2ray .................. UDP ..........................................                                                                                                          
proxy_startcmd=''     # ................................. shell .............................................                                                                                                      
proxy_stopcmd=''      # ................................. shell .............................................                                                                                                      

## dns                                                                                                                                                                                                             
dns_direct='114.114.114.114'          # ...... IPv4 DNS......................................................... DNS                                                                                               
dns_direct6='240C::6666'              # ...... IPv6 DNS......................................................... DNS                                                                                               
dns_remote='8.8.8.8#53'               # ...... IPv4 DNS............................................. DNS ............                                                                                              
dns_remote6='2001:4860:4860::8888#53' # ...... IPv6 DNS............................................. DNS ............     

配置如上, 其他的没动, 会不会是我配置的问题呢

Provissy commented 3 years ago

@zfl9 mention一下吧,挺郁闷的,等下试试redsocks2

zfl9 commented 3 years ago

连接被拒是因为socks5服务器的udp端口没有打开,连不上。

zfl9 commented 3 years ago

ss -anptu | grep socks5服务器监听端口 看下

zfl9 commented 3 years ago

https://blog.csdn.net/dog250/article/details/9569855

zfl9 commented 3 years ago

显然可以确定,ipt2socks连不上socks5服务器的udp端口。收到了对端主机的icmp消息,然后提示连接被拒绝。

zfl9 commented 3 years ago

建议看下socks5服务器的监听地址和端口,是否正常。

zfl9 commented 3 years ago

怀疑是v2ray监听了::,而不是0.0.0.0。和ipv6only可能有关系。

Provissy commented 3 years ago
# ss -natpu | grep 30990
udp      UNCONN        0         0                                   *:30990                                                    *:*                              users:(("v2ray",pid=476463,fd=8))     

Screenshot from 2020-08-14 05-30-23

试过用SSR,UDP转发后倒是没有错误, 但是收不到答复,DNS请求发起之后就timeout。难道是V2ray不能运行在局域网内的另一架服务器上吗。似乎大部分人配置透明代理都是在同设备内完成iptables转发和v2ray/ssr处理的。

我再排查排查吧

Provissy commented 3 years ago

测试过redsocks2,也是不能转发UDP, 和楼主一模一样。。。而且redsocks2性能比阁下的ipt2socks性能差很多(编译还要好多依赖)

zfl9 commented 3 years ago

udp local ip 改为 0.0.0.0 试下?)

ohmyadd commented 3 years ago

同样遇到这个问题,运行ipt2socks的主机遇到up的透明代理请求就一直在访问本机127.0.0.1的1080,就不停refused

Provissy commented 3 years ago

Update 10/11/2020

怎么试都不行, 最后效仿楼主用socat转发TCP+UDP, 就没问题了... DNS请求可以正常转发而且有Full-Cone NAT. 依然不知道为什么

还有就是请问-j TPROXY --on-ip可以用非本机的ip吗, 我试过好像无法成功redirect过去, 是不是TPROXY本身不可以转发到外部ip呢? 还是我的配置有问题呢

zfl9 commented 3 years ago

-j TPROXY --on-ip可以用非本机的ip吗 不行的吧

zfl9 commented 1 month ago

我好像意识到一个点,可能会触发此 issue 中的错误。

我猜测是 socks5 服务器(v2ray)对于 udp assoc 请求的 response 有点问题(或者说不符合标准)

盲猜是 dst.ip 字段不对(可能被赋予了 0.0.0.0 或者 127.0.0.1 地址),导致 ipt2socks 在 udp assoc 时,连接到了本机(0.0.0.0 估计会被解释为本机 ip),然后因为本机没有对应的 udp 端口监听,所以提示连接被拒。而使用 socat 在本地监听对应的 udp 端口之后,数据链路就被打通了,于是就正常了。。。

这种情况感觉可以兼容下,那就是如果 dst.ip 是 0.0.0.0 或者 127.0.0.1,则强制修正为 -s 选项指定的 socks5 服务器 IP,兼容这种实现质量不佳的 socks5 服务器。