xjasonlyu / tun2socks

tun2socks - powered by gVisor TCP/IP stack
https://github.com/xjasonlyu/tun2socks/wiki
GNU General Public License v3.0
2.85k stars 405 forks source link

[Bug] direct:// mode keeps establishing connections #182

Closed cfanbo closed 1 year ago

cfanbo commented 1 year ago

Verify steps

Version

ccfb3a4

What OS are you seeing the problem on?

Linux, macOS

Description

使用 direct:// 本地代理模式,发现发送请求时,本地一直创建链接。macOS 提示 “WARN[0088] [TCP] dial 139.196.207.38:443: dial tcp 139.196.207.38:443: socket: too many open files”, 在Linux下提示“本地地址占用完,无可用地址”类似的错误,直到机器资源耗尽(ssh被断开或重启电脑)

在 wireshark 抓包,在macOS 看似正常,但在 Linux 下提示大量的

[TCP ACKed unseen segment] 32323 -> 443 [FIN, ACK] Seq=1 Ack=2 Win=503 Len=0 TSVal=302392343 TSecr=2323423

其中SeqAckWinLenTSVal 字段的值是不变的。

CLI or Config

sudo ./tun2socks -device utun123 -proxy direct://

Logs

...
INFO[0124] [TCP] 198.18.0.1:57934 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57935 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57936 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57937 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57938 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57939 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57940 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57941 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57942 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57943 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57944 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57945 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57946 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57947 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57948 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57949 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57950 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57951 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57952 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57954 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57953 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57955 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57956 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57957 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57958 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57959 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57960 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57961 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57962 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57963 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57964 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57965 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57966 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57967 <-> 110.242.68.66:80
INFO[0124] [TCP] 198.18.0.1:57968 <-> 110.242.68.66:80
WARN[0124] [TCP] dial 110.242.68.66:80: dial tcp 110.242.68.66:80: socket: too many open files

How to Reproduce

  1. 参考示例文档 https://github.com/xjasonlyu/tun2socks/wiki/Examples#macos ,我这里是 macOS ,在Linux下存在同样的问题
  2. 将 baidu.com 的ip 添加到路由表中
    sudo route add 110.242.68.66 198.18.0.1

    这里 110.242.68.66是 ping baidu.com 解析出来的IP

  3. 客户端发起请求
    curl https://baidu.com

    执行命令后,长时间无响应,而 DEBUG 模式下不停的输出上面的日志,直到本地无法创建端口为止

xjasonlyu commented 1 year ago

这是典型的route loop了,是路由没有配置正确的结果。

cfanbo commented 1 year ago

这个是按官网示例中设置的,只是添加了一条自定义的路由

❯ netstat -nr | grep utun123
110.242.68.66     198.18.0.1         UGHS          utun123
198.18.0.1         198.18.0.1         UH            utun123
larry19840909 commented 1 year ago

你需要设置socket option,将direct的conn设置到指定网卡上。