Pages

Friday, 16 March 2012

使用 PWX-DNS-Proxy 建立DNS代理服务器 (支持几乎所有的 DNS 请求类型)

2011/8/9 版本 0.1 Alpha 2:

  1. 修改了程序启动代码,不需要通过 twistd 运行。
  2. 优化代码:UpstreamResolver, LocalResolver。
  3. UpstreamResolver 对 TCP 连接建立持久连接池,根据 config 文件的指定,在 timeout 之前 TCP 连接可以被复用。
  4. 调整配置文件,只依赖一个 config 文件。hosts 可以在 config 文件中指定,也可以由 config 文件载入外部 hosts 文件。
  5. config 文件在不同平台上通过不同策略确定目录:
  6. 增加控制台的日志输出。
  7. 修正 hosts 文件格式,以符合操作系统的 hosts 表。
  8. 修正 domain.py: lookup 函数,以修复一些域名映射的小问题。

Linux/mac用户:

  1. 请安装 Python 2.7,以及 Twisted-11.0
  2. 请通过 git 下载源代码。运行 run.sh 即可打开代理服务器。

Windows 用户:

  1. 下载 dnsproxy-0.1-alpha-2.rar,解压到任意文件夹。
  2. dnsproxy.exe 是主程序。下载之后,请修改 data/dnsproxy.conf:
  3. 将 add_server("isp", "202.96.209.133", 53, False) 里面的 202.96.209.133 修改成你的 ISP DNS。
    https://github.com/GameXG/pwx-dns-proxy 
这个 DNS 代理服务器是基于 Python 以及 Twisted 框架写成的,并且它支持几乎所有的 DNS 请求类型,包括 A 地址以及 AAAA 地址(IPv6)。
远程服务器的 DNS 应答根据它们的 TTL 值将会被缓存在本地。
另外,这个服务器能够链接多个上游服务器,并且根据查询域名的不同,使用特定的服务器查询。
查询上游服务器的时候,可以使用 TCP 协议,而不是 UDP 协议。这样,就可以避免大部分 DNS 污染了。
提供了本地 HOSTS 表的功能,支持 IPv4 和 IPv6 的地址.
这个项目的初衷是为中国大陆的用户提供一个完整的 DNS 代理解决方案——因为它能够透过 GFW,获得被屏蔽的网站的真实 IP 地址。另外,当中国大陆的用户使用 VPN 翻墙的时候,他们既能够使用更安全的、国外的 DNS 服务器,也能够享受更快的上网速度——DNS 查询结果会被缓存,而且大陆拥有 CDN 的门户网站也能够通过 ISP 的 DNS 服务器查询地址,不至于翻山越岭到美国的服务器上访问这些门户网站的内容。

希望有兴趣的亲能够参与到这个项目中,E-mail 至 airyai@gmail.com
项目地址:https://code.google.com/archive/p/pwx-dns-proxy/
下载地址:https://code.google.com/archive/p/pwx-dns-proxy/downloads

我的补充说明:
在mac机器上。
git clone https://github.com/GameXG/pwx-dns-proxy pwx-dns-proxy-by-GameXG
cd pwx-dns-proxy-by-GameXG
nano data/dnsproxy.conf
(注释掉这行:add_server("google", "8.8.8.8", 53, True)
添加一行:

add_server("my-vps", "vps-ip", dnsmasq-port-number-on-vps, True)

set_default_server("my-vps")

然后运行:
sudo python src/dnsproxy.py

(上面的"vps-ip", dnsmasq-port-number-on-vps意思请参见https://briteming.blogspot.com/2 019/12/vpsdnsmasq.html里的“在自己的vps上安装dnsmasq”部分.True表示连接协议选择tcp协议False表示连接协议选择udp协议)


实际使用例子:
在本地机器上,运行mellow.

sudo networksetup -setdnsservers "Wi-Fi" 127.0.0.1

cd ~/pwx-dns-proxy-by-GameXG && sudo python src/dnsproxy.py  

然后,就可用全局代理程序mellow任意翻墙了。

------------------------------------------------------------------

你直接双击dnsproxy.exe窗口只是一闪就关了,就是失败了。
成功运行后会有一个窗口显示当前DNS解释情况。那个窗口还不能关,关了就没dnsproxy.exe了。
还有记得把所有网卡,网络连接的DNS改成dnsproxy.exe的服务地址,不然没用。
或是把 “本地连接” 的DNS改成dnsproxy.exe,别的网卡,连接上的DNS都删掉。
win7 vista win2008用户如果无法运行可以参考此法
去microsoft的网站下这个工具
http://technet.microsoft.com/en-us/sysinternals/bb897553
用以下命令开一个system用户权限的cmd窗口
psexec -s -i cmd.exe
去dnsproxy目录运行以下命令
start dnsproxy.exe
然后会弹出一个空的全黑的dos窗口,那个就是dnsproxy的窗口。
之前打开的cmd窗口就可以关掉了。
注意:
start dnsproxy.exe命令的start一定不能少不然你的cmd窗口一关,dnsproxy的窗也一起关掉了。
不要在system权限的cmd窗口运行别的程序,这个帐号是给服务进程用的,别把没用的进程弄进去。

安装成服务,就可以不看黑窗口了,不过建议先用黑窗口调试好再用服务加载:
@echo sc stop dnsproxy > !register_as_server.bat
@echo sc delete dnsproxy >> !register_as_server.bat
@echo sc create DNSProxy binPath= “%cd%\srvany.exe” start= auto >> !register_as_server.bat
@echo sc description dnsproxy “DNSProxy TCP DNS Server” >> !register_as_server.bat
@echo reg add HKLM\SYSTEM\CurrentControlSet\Services\dnsproxy\Parameters /v Application /d “%cd%\dnsproxy.exe” >> !register_as_server.bat /f
@echo reg add HKLM\SYSTEM\CurrentControlSet\Services\dnsproxy\Parameters /v AppDirectory /d “%cd%” >> !register_as_server.bat /f
@echo sc start dnsproxy >> !register_as_server.bat
@echo sc stop dnsproxy > !delete_dnsproxy_server.bat
@echo sc delete dnsproxy >> !delete_dnsproxy_server.bat
@echo 安装文件已生成.
@echo.
@echo 以 *管理员身份* 运行这个文件:!register_as_server.bat 注册服务;!delete_dnsproxy_server.bat 删除此服务
@echo.
@pause
sryany.exe 是 Windows Resource Kit 带的工具,只有 8kb 大小.
----------

PWX-DNS-Proxy 可以强制使用 TCP 查询的 DNS 服务器

项目地址:
https://code.google.com/archive/p/pwx-dns-proxy/
简介:
这个 DNS 代理服务器是基于 Python 以及 Twisted 框架写成的,并且它支持几乎所有的 DNS 请求类型,包括 A 地址以及 AAAA 地址(IPv6)。
远程服务器的 DNS 应答根据它们的 TTL 值将会被缓存在本地。
另外,这个服务器能够链接多个上游服务器,并且根据查询域名的不同,使用特定的服务器查询。
在查询上游服务器的时候,可以(强制)使用 TCP 协议,而不是 UDP 协议。这样,就可以避免大部分 DNS 污染了。
提供了本地 HOSTS 表的功能,支持 IPv4 和 IPv6 的地址。
这个项目的初衷是为中国大陆的用户提供一个完整的 DNS 代理解决方案——因为它能够透过 GFW,获得被屏蔽的网站的真实 IP 地址。另外,当中国大陆的用户使用 VPN 翻墙的时候,他们既能够使用更安全的、国外的 DNS 服务器,也能够享受更快的上网速度——DNS 查询结果会被缓存,而且大陆拥有 CDN 的门户网站也能够通过 ISP 的 DNS 服务器查询地址,不至于翻山越岭到美国的服务器上访问这些门户网站的内容。
终于无需再去频繁的更新那些被 DNS 劫持的站点地址的HOSTS 文件了!而且针对仅仅遭受 DNS 劫持的 Dropbox,Xmarks 以及那些境外文件服务网站,使用这个工具比使用 VPN 以及 SSH 都要来得方便(当然前提是站点本身没有被墙,只是 DNS 被污染)
运行方法:
cd ~/pwx-dns-proxy/src/ && sudo python dnsproxy.py

DNS 服务器效率测试:
在服务器配置文件中我使用了 202.14.67.14 这个香港 ISP 的 DNS 服务器来查询,由截图看出, PWX 的确有缓存功能。
配置文件 dnsproxy.conf 中有详细的参数解析,个人建议 TCP 查询并不一定要用 8.8.8.8 这个 Google 的服务器地址,北方可以找韩国的,南方可以用香港的 ISP DNS 服务器。
在Windows下,使用 nslookup 命令时加上 -vc 参数可以强制使用 TCP 协议而不是 UDP 协议进行 DNS 查询。例如 :
nslookup -vc encrypted.google.com 8.8.8.8
进行DNS查询就可以得到正确的查询结果,其中 encrypted.google.com 是要解析的地址,8.8.8.8 是解析用到的 DNS 服务器地址,用此命令可以预先测试 DNS 服务器是否支持 TCP 方式的查询。
安装调试方法:
直接解压,运行 dnsproxy.exe 会有个黑窗口停留在任务栏,如果黑窗口一闪而过请查看配置文件是否有错。设置系统 DNS 服务器地址为 127.0.0.1 ,启动浏览器,应该能正常打开网页,同时黑窗口会有一些查询调试信息出现。正常后,可以运行 install.bat 来把这个软件安装成系统服务,开机自动运行而且不会有黑窗口出现。
DNS 服务器为保证安全性会随机打开一些高位端口(1024+,我机器都是20000+的端口号)来执行查询通讯,确保你的防火墙允许这个程序访问这些端口,如果系统有限制可以通过 TCPOptimizer 来改。
-------------------------

使用tcpdns.py防止dns污染

动手写了一个小脚本
可以把udp和tcp的dns请求全部转换到tcp,发送到dns服务器.

使用方法:
使用sudo或者root下执行python tcpdns.py
(绑定1024以下的端口需要root权限)
然后把本机dns设为127.0.0.1
需要安装python和python-twisted-core
dns设置方法:
在/etc/resolv.conf中添加nameserver 127.0.0.1
注意:
默认dns为8.8.4.4 可自己打开脚本修改
其他:
为保证安全性在绑定端口后会把脚本降低权限,默认为os.setuid(1000)
使用前请检查当前用户的uid是否为1000然后做出修改,在/etc/passwd中可以查到
在xp上也可以使用,需要安装python、twisted和zope,可以在以下地址中下载
http://www.python.org/
http://twistedmatrix.com/trac/wiki/Downloads
http://pypi.python.org/pypi/zope.interface#download
下载地址http://storage.googleapis.com/google-code-attachments/pydnsproxy/issue-11/comment-6/tcpdns.py

from  https://code.google.com/archive/p/pydnsproxy/issues/11


tcpdns.py也确实基本上解决了dns污染问题.