ginuerzh / gost

GO Simple Tunnel - a simple tunnel written in golang
MIT License
15.57k stars 2.44k forks source link

自定义DNS解析行为不符合预期,gost 最终会使用系统的 /etc/resolv.conf 进行查询 #765

Closed lxf1992521 closed 2 years ago

lxf1992521 commented 2 years ago

首先,gost 支持自定义DNS解析,例如gost -L :1080?dns=192.168.123.1,会使用 192.168.123.1 服务器进行DNS解析。

但是如果 192.168.123.1 服务器返回 NXDOMAIN (表示无此域名的解析地址)结果时, gost 后续的行为将超出预期: gost 将会启用系统的 /etc/resolv.conf 进行查找,并且无论返回结果如何,该域名的后续所有查找都将不再使用 192.168.123.1 服务器,而是系统默认的 /etc/resolv.conf。

预期的行为,应该是在查询完 192.168.123.1 服务器之后,不论结果如何,都始终使用 192.168.123.1 服务器进行查询,而不是回退并持久回退到系统。

截图如下,其中 172.16.122.1 地址是我写在 /etc/resolv.conf 中的默认nameserver: —————————————————————————————————————— $ curl -I -p -x 127.0.0.1:8081 noexistname.com HTTP/1.1 503 Service Unavailable Proxy-Agent: gost/2.11.1 Content-Length: 0

curl: (56) Received HTTP code 503 from proxy after CONNECT ——————————————————————————————————————

—————————————————————————————————————— $ gost -L :8081?dns=192.168.123.1 2021/12/04 22:34:10 route.go:650: auto://:8081 on 0.0.0.0:8081 2021/12/04 22:34:12 http.go:161: [http] 127.0.0.1:44746 -> auto://:8081 -> noexistname.com:80 2021/12/04 22:34:12 http.go:251: [route] 127.0.0.1:44746 -> auto://:8081 -> noexistname.com:80 2021/12/04 22:34:12 http.go:272: [http] 127.0.0.1:44746 -> 127.0.0.1:8081 : dial tcp: lookup noexistname.com on 172.16.122.1:53: no such host ——————————————————————————————————————

ginuerzh commented 2 years ago

v3版本中已经解决。

lxf1992521 commented 2 years ago

感谢作者!

另外,会 backport 到 v2 版本吗?目前 v2 版本为了避免这个问题,我只能将其运行在容器中,并将容器的 /etc/resolv.conf 和 ?dns=... 参数设为一致,限制很多。

ginuerzh commented 2 years ago

后面会对关键性bug统一进行修复。

ginuerzh commented 2 years ago

此问题已修复。

lxf1992521 commented 2 years ago

使用最新 commit 版本测试,符合"始终使用 ?dns=x.x.x.x 服务器进行查询"的预期行为,赞!