gfreezy / seeker

通过使用 tun 来实现透明代理。实现了类似 surge 增强模式与网关模式。
Apache License 2.0
34 stars 5 forks source link

发往 tun_cidr 的数据包似乎无回应 #134

Closed Jiawens closed 2 years ago

Jiawens commented 2 years ago

我的网卡名是 enp4s0,电脑 ip 为 192.168.3.79,我使用 clash 将我的 trojan(域名假设为 example.com)转换成 5589 端口上的 socks5 代理,经 curl 测试过,可以连接到 google.com ;然后使用 seeker 通过 tun 代理整个系统的请求,seeker 配置如下:

verbose: true
dns_start_ip: 10.0.0.10
dns_servers:
  - 223.5.5.5:53
  - 114.114.114.114:53
dns_timeout: 1s
tun_bypass_direct: true  # 直连的域名直接返回真实IP,不走tun
tun_name: utun4
tun_ip: 10.0.0.1
tun_cidr: 10.0.0.0/16
dns_listen: 0.0.0.0:53
gateway_mode: false
ping_timeout: 2s
probe_timeout: 30ms  # probe_timeout 时间内如果 TCP 可以直接连接,则直连;否则走代理
connect_timeout: 1s
read_timeout: 30s
write_timeout: 5s

max_connect_errors: 2  # ss 服务器重试次数,到达重试次数后会自动选择下一个最快的服务器
ping_urls:
  - host: www.facebook.com
    port: 80
    path: /
  - host: www.youtube.com
    port: 80
    path: /
  - host: twitter.com
    port: 80
    path: /

servers:
  - name: socks5 proxy server
    addr: 127.0.0.1:5589
    protocol: Socks5  # Https or Http or Socks5 or Shadowsocks

rules:
  - 'DOMAIN-SUFFIX,example.com,DIRECT'
  - 'MATCH,PROXY'

然后通过 sudo 运行 seeker,无报错,此时 ip rule 如下:

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

ip route 如下:

default via 192.168.3.1 dev enp4s0 proto static metric 100 
default via 192.168.3.1 dev enp4s0 proto dhcp src 192.168.3.79 metric 1002
10.0.0.0/16 via 10.0.0.1 dev utun4 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.3.0/24 dev enp4s0 proto dhcp scope link src 192.168.3.79 metric 1002

然后使用强制取消代理(但未清除 dns 缓存)的 chrome,可以访问 baidu.com 和 bing.com,但无法访问 google.com; 之后使用 dig 向 seeker 请求解析 bing.com( seeker 没有让所有应用都使用它提供的 dns 这件事稍后再谈),结果为 10.0.0.14,但是如果使用 curl --resolve bing.com:443:10.0.0.14 https://bing.com -v,结果如下:

* Added bing.com:443:10.0.0.14 to DNS cache
* Hostname bing.com was found in DNS cache
*   Trying 10.0.0.14:443...

之后再也没有输出,seeker 也没有输出信息,clash 同样没有输出日志。 以下是我机器的 uname -r:

6.0.8-arch1-1

(有些怀疑是系统不干净,所以打算 24h 内完全重启后再试一下,后续会发在这里) 提供的信息有些多,还请见谅,也提前感谢愿意帮忙分析的人啦。

gfreezy commented 2 years ago

分别试一下 curl baidu.com,curl google.com 可以不可以访问。

现在这样seeker配置有点问题,默认所有域名都走了代理,这样流量都会走到socks5服务器。socks5服务器根据规则,如果是直连的域名,会直接对域名发起连接。这时候seeker dns又会把直连域名解析成10.x.x.x 的IP,又会被seeker捕获。流量就产生循环了。

想避免这种情况,需要将直连规则写在seeker,或者 socks5代理那边不使用系统dns

Jiawens commented 2 years ago

分别试一下 curl baidu.com,curl google.com 可以不可以访问。

现在这样seeker配置有点问题,默认所有域名都走了代理,这样流量都会走到socks5服务器。socks5服务器根据规则,如果是直连的域名,会直接对域名发起连接。这时候seeker dns又会把直连域名解析成10.x.x.x 的IP,又会被seeker捕获。流量就产生循环了。

想避免这种情况,需要将直连规则写在seeker,或者 socks5代理那边不使用系统dns

我试了一下 curl,连接 baidu.com 和 google.com 时都是使用它们的真实 ip,baidu.com 可以访问,但 google.com 无响应(半分钟内无错误代码)

根据我的观察,clash 没有向 seeker 请求 dns,而且所有发往 tun_cidr 的数据包似乎没有到达 seeker (至少没有到达后端 socks5 代理),导致程序一直没有接收到响应,所以应该不是因为流量循环的问题。

现在配置了一下 systemd-resolved,关闭了 firewalld,可以成功运行了,我再具体研究一下是防火墙的哪部分功能导致的问题然后发上来,抱歉耽误您时间了,也希望后来的人能以我为鉴

Jiawens commented 2 years ago

找了一下,没找到解决 firewalld 和 tun 打架的方法 :( 所以我选择禁用 firewalld ,这个 issue 应该可以关掉了

gfreezy commented 2 years ago

那应该是设置系统 dns 没生效。seeker现在在 linux 下是通过修改 /etc/resolv.conf 的方式实现的,可能系统不认这种方式。

你是什么系统,我回头看一下

Jiawens commented 2 years ago

那应该是设置系统 dns 没生效。seeker现在在 linux 下是通过修改 /etc/resolv.conf 的方式实现的,可能系统不认这种方式。

你是什么系统,我回头看一下

我是 Arch Linux,一开始设置 dns 未生效是因为我把 systemd resolved 关了;之后把配置文件里的 DNSStubListener 设置为 no 再启用(不这样的话会导致本机 53 端口被它占用),seeker 就可以成功设置系统 dns 了。 但是在这之后浏览器什么的只能成功请求 dns,还不能联网,是我手动关掉 firewalld 之后才正常的。