ARwMq9b6 / dnsproxy

防 DNS 缓存污染,兼顾查询质量与速度
MIT License
173 stars 42 forks source link

一些建议 #1

Open Justsoos opened 7 years ago

Justsoos commented 7 years ago

首先,感谢作者,,好用! 建议: 1,这里有一个golang systray的开源,可以参考,做成systray,隐藏运行 command 窗口 (windows下)https://github.com/getlantern/systray 2,可以开机自动运行(windows),并能够程序异常退出后重启 3,可以在systray 上点击设置,或退出 4,可以关闭自带代理服务器,避免出现代理端口被侦测等问题。以及使用自己pac 和代理的用户,可以关掉这个功能。 5,程序运行后,可以用 netsh interface ip set dns "你的网卡接口" static 127.0.0.1 来设置本地 dns 并测试是否有效,并弹出对话框,多数小白用户都根本不懂这个,会导致不能上网或dnsproxy 根本没起作用。程序退出后,netsh …… dhcp 或者恢复原接口状态 6,可以有设置所有dns 查询走 https google dns 的api ,或者所有查询走 socks 翻墙 tcp 8.8.8.8 等等 7,有日志可以查看过去dns查询,以及 socks 服务器的连接通断的心跳包

ARwMq9b6 commented 7 years ago

感动!感谢这么好的建议。目前打算优先实现 6 和 7.

MeABc commented 7 years ago

我也来两条,2333

  1. 增加本地 hosts 支持 。(还是原本就支持,难道我姿势不对?)
  2. 增加支持 cacheDefaultExpiration 和 cacheCleanupInterval 在 toml 里配置。目前这两个我是改代码。。。。。

补充: 我是用 nssm 来封装成系统服务(windows 系统)的。(这个可以解决楼主的第一和第二条)

楼主第四点: 监听端口问题,可以改写(或者在配置里说明)成 "127.0.0.1:1480" or "127.0.0.1:53" ,这样就可以避免暴露在外网。

ARwMq9b6 commented 7 years ago

@MeABc Word 天!基友们真给力。在下已把上述事项记在小本本上。

MeABc commented 7 years ago

在下已把上述事项记在小本本上。

大神你也太夸张了。。。

用你家的产品不反馈,天理不容。。。

ARwMq9b6 commented 7 years ago

@MeABc 俺只是追随 phuslu 一路走来的小白而已,只是后来学了点编程,勉强可以做一些插科打诨的勾当。

MeABc commented 7 years ago

@ARwMq9b6 proxy 不支持 CONNECT 吗?我这提示 Received HTTP code 503 from proxy after CONNECT

补充: 国内 https 可以,国外的 https 却不行。 我的上游代理是支持 https 和 socks 的。

配置我就改了端口,其它没动:

image

ARwMq9b6 commented 7 years ago

@MeABc 抱歉这么晚回复。我这里没问题哎。

MeABc commented 7 years ago

@ARwMq9b6 奇怪。DNS 也是用同一个上游代理,DNS 可以,proxy 就不行。再看看,是我哪里搞错了。

MeABc commented 6 years ago

@ARwMq9b6 这里可能里手误,你看下: https://github.com/ARwMq9b6/dnsproxy/blob/master/cmd/dnsproxy/main.go#L95

    go func() {
        proxy := gost.NewProxyChain()
        if err := proxy.AddProxyNodeString(conf.DNS.Abroad.Proxy); err != nil { #这行
            e <- errors.WithStack(err)
        }
        proxy.Init()
        direct := gost.NewProxyChain()
        if err := dnsproxy.ServeProxy(conf.Proxy.Listen, proxy, direct); err != nil {
            e <- err
        } else {
            e <- errors.New("ServeProxy returned without error")
        }
}()

我理解应该是这样的:

    go func() {
        proxy := gost.NewProxyChain()
        if err := proxy.AddProxyNodeString(conf.Proxy.ProxyServer); err != nil { # 改成 conf.Proxy.ProxyServer
            e <- errors.WithStack(err)
        }
        proxy.Init()
        direct := gost.NewProxyChain()
        if err := dnsproxy.ServeProxy(conf.Proxy.Listen, proxy, direct); err != nil {
            e <- err
        } else {
            e <- errors.New("ServeProxy returned without error")
        }
}()
MeABc commented 6 years ago

这个是接着我上面 ( proxy 不支持 CONNECT 吗? ) 这个话题的。呃,对不住,这个话题隔了几个月!

2017-11-13_045948

上图是我加了一些调信息进行的跟踪,分 A、B 两部份。使用 Proxifier 里的 ProxyChecker 测试。测试 dnsproxy 的 proxy 部分是否支持 socks5 代理。

A 部分测试使用外网(公网) SOCKS5 代理测试没有问题。B 部分使用本地内网 socks5 代理测试,“标识 2” 显示本机代理是支持 socks5 代理的,但一直跟踪到“标识 5”,就开始了错了。这里出错的是 libgost (gost 包)。

呃,说了怎么多,是想说明 dnsproxy 有 bug (gost 的锅)。虽说这个 bug 不影响使用,但有时想用本机代理时就蛋疼了。更新 gost 到最新版不知道能不能解决此问题?!

又,这图里我已按上楼改成了 conf.Proxy.ProxyServer ,这样 dnsserver 和 proxyserver 就可以用不同的 socks5 代理。

最后,非常感谢你的软件!!!

Justsoos commented 6 years ago

@MeABc 使用这段时间,的确有几次有类似现象,即科学上网代理失效情况下,国内网站也无法访问。 还有 dnsproxy 的代理访问策略相当激进,遇到代理阻塞情况,往往会短时间产生几百到上千个 tcp 访问连接。

MeABc commented 6 years ago

@Justsoos

即科学上网代理失效情况下,国内网站也无法访问。

我个人猜测,这个“国内网站“ dnsproxy 最后解析得到的 IP 为国外 IP 。所以,上游代理失效的话就无法访问。另,如果 DNS 解析“超时”也可能会出现些问题。(“超时”情况有多种,包括 DNS 服务器宕机等)

往往会短时间产生几百到上千个 tcp 访问连接。

这个没有留意到。