truedns是一个准确、快速、便捷的域名解析工具。它不改变系统现有架构,以驱动方式过滤中国大陆某墙的干扰,实时返回最真实的域名解析结果,是一个获取真实域名解析的驱动级工具,可以在系统底层以udp协议工作并过滤中国大陆GFW墙的干扰。
设置大陆以外的dns,如8.8.8.8或8.8.4.4或opendns等
使用时加载驱动就可正常运行。区分系统,32位和64位的驱动互不通用
加载驱动 insmod ip_ns.ko
卸载驱动 rmmod ip_ns.ko
官方项目主页:https://code.google.com/p/truedns/
官方最新版下载-https://truedns.googlecode.com/files/ip_ns.ko
下载地址:https://code.google.com/archive/p/truedns/downloads
作者补充的使用教程如下:
客户端安装过程
1、确定内核版本
执行
uname -a
显示类似于2.6.32-71.el6.x86_64,其中2.6.32表示内核版本,x86_64为64位版。32位为i686或i386字样
或执行
file /sbin/init
显示/sbin/init: ELF 64-bit。 64-bit为64位,32-bit为32位
2、下载对应的驱动并改名为truedns.ko
以下是文件改名代码,请根据实际情况修改(若已改过可忽略)
rename truedns_2_6_18_32bit.ko truedns.ko
3、安装驱动
insmod truedns.ko
为了确保系统稳定性及的升级便捷性,不推荐将本驱动设置为开机自动加载.
--------------------------
dns proxy for linux desktop
介绍:
我 们是在Linux下用Python并利用Twisted的network engine来写最简单的DNS Proxy并实现了多线程和简单的cache。 (Twisted是用Python写的事件驱动的Network Engine)。我们的DNS Proxy是可以通过多个用户的domain请求同时向Google发送请求再将Google应答返回各用户。其中我们用的是Google的Public DNS (8.8.8.8)。我们的DNS Proxy包括一个server和一个client。
我们的Project包括:
我 们是在Linux下用Python并利用Twisted的network engine来写最简单的DNS Proxy并实现了多线程和简单的cache。 (Twisted是用Python写的事件驱动的Network Engine)。我们的DNS Proxy是可以通过多个用户的domain请求同时向Google发送请求再将Google应答返回各用户。其中我们用的是Google的Public DNS (8.8.8.8)。我们的DNS Proxy包括一个server和一个client。
我们的Project包括:
- server.py
- client.py
- message.py
- resolv.conf
下载我们的hw2-dns_proxy(12/10/2010 update)。
编程环境:
(1) 操作系统:Ubuntu 10.10
(2) 编写语言:Python 2.6
(2) 重点module:Twisted 2.7
(1) 操作系统:Ubuntu 10.10
(2) 编写语言:Python 2.6
(2) 重点module:Twisted 2.7
运行方式:
先切换到个文件的当前目录再分别执行如下操作:
(1)对于server:python server.py
(2)对于client:python client.py domain
其中domain是用户所请求的,格式如:www.baidu.com 或 baidu.com 均可以。
先切换到个文件的当前目录再分别执行如下操作:
(1)对于server:python server.py
(2)对于client:python client.py domain
其中domain是用户所请求的,格式如:www.baidu.com 或 baidu.com 均可以。
步骤:
(1) Client发出domain的请求
(2) DNS Proxy为每一个接收到的请求创建一个线程。每一线程访问Google的公开DNS Server。
(3) Google的DNS Server再分别处理来自各处的请求并发回我们的DNS Proxy
(4) 我们的DNS Proxy再分别发回原请求的client
其中都是通过53端口实现的。Client与我们的DNS Proxy之间用的是UDP协议,我们的DNS Proxy与Google用的是TCP协议。
(1) Client发出domain的请求
(2) DNS Proxy为每一个接收到的请求创建一个线程。每一线程访问Google的公开DNS Server。
(3) Google的DNS Server再分别处理来自各处的请求并发回我们的DNS Proxy
(4) 我们的DNS Proxy再分别发回原请求的client
其中都是通过53端口实现的。Client与我们的DNS Proxy之间用的是UDP协议,我们的DNS Proxy与Google用的是TCP协议。
代码说明:
(1) server.py
从 main函数起,设置了端口DNS_PORT和LOCAL_PORT为53。我们的DNS Server将会从文件resolv.conf中被读出来。之后我们通过reactor.listenUDP(LOCAL_PORT, BaseThreadedUDPServer())语句来设置让reactor监听53端口的UDP包然后通过reactor.run()来启动这个 reactor。Twisted的好处是它能自己管理好线程,因此,每监听到每一个UDP包,会将创建一个新线程。由于我们通过 reactor.callFromThread()把要被线程运行的函数放在主循环中,会是多线程安全的。默认的线程个数为10。每一线程会运行 BaseThreadedUDPServer类中的datagramReceived函数。(注:resolv.conf只含一行并且格式 为:nameserver 8.8.8.8)
从 main函数起,设置了端口DNS_PORT和LOCAL_PORT为53。我们的DNS Server将会从文件resolv.conf中被读出来。之后我们通过reactor.listenUDP(LOCAL_PORT, BaseThreadedUDPServer())语句来设置让reactor监听53端口的UDP包然后通过reactor.run()来启动这个 reactor。Twisted的好处是它能自己管理好线程,因此,每监听到每一个UDP包,会将创建一个新线程。由于我们通过 reactor.callFromThread()把要被线程运行的函数放在主循环中,会是多线程安全的。默认的线程个数为10。每一线程会运行 BaseThreadedUDPServer类中的datagramReceived函数。(注:resolv.conf只含一行并且格式 为:nameserver 8.8.8.8)
通过得到answer包RR的最小值TTL可以知道什么时候cache里该数据过期。在查询和加入cache时都会检查是否需要“清洗”cache。
(2) client.py
这个会从命令行得到用户的domain请求并建立UDP包发给我们的DNS Proxy。最后通过一个socket来向我们的DNS Proxy发送。
(3) message.py定义好了DNS包头,questions section,和RR sections的结构。创建一个Message对象有两种方法,一个就是用一个已经写好的dns包(注意不是Message的对象,是真正的dns包) 来初始化即fromWire(),也可以调用createQuery()或createAnswer()。因为我们这次作业不许要创建answer,所以 在Message类里createAnswer()是空的。toWire()函数就是把Message类转换成要发送的DNS包。因为用TCP时要发送 DNS包的长度所以我们的Message类可以根据是否使用TCP或UDP来进行toWire(),fromWire()。
这个会从命令行得到用户的domain请求并建立UDP包发给我们的DNS Proxy。最后通过一个socket来向我们的DNS Proxy发送。
(3) message.py定义好了DNS包头,questions section,和RR sections的结构。创建一个Message对象有两种方法,一个就是用一个已经写好的dns包(注意不是Message的对象,是真正的dns包) 来初始化即fromWire(),也可以调用createQuery()或createAnswer()。因为我们这次作业不许要创建answer,所以 在Message类里createAnswer()是空的。toWire()函数就是把Message类转换成要发送的DNS包。因为用TCP时要发送 DNS包的长度所以我们的Message类可以根据是否使用TCP或UDP来进行toWire(),fromWire()。
需要改进的:
由于时间和精力的限制没能通过下列几点来改进我们的程序。
(1) 没有进行压缩
(2) 虽然用了UDP,但是我们没有考虑丢包重传scheme
(3) 我们当前的resolv.conf认为只有那一行
(4) 我们的Message类目前认为QDCOUNT即question个数是1
由于时间和精力的限制没能通过下列几点来改进我们的程序。
(1) 没有进行压缩
(2) 虽然用了UDP,但是我们没有考虑丢包重传scheme
(3) 我们当前的resolv.conf认为只有那一行
(4) 我们的Message类目前认为QDCOUNT即question个数是1
下载我们的课堂报告:DNS Proxy.pdf(12/10更新)
from http://course.ccert.edu.cn/2010a/blog/phaby/2010/12/07/dns-proxy/------------------------------------------------------------
在linux desktop os上使用tcp dns,防止dns污染
对tcp 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
----------------------------------------------------------
如何本地避免GFW的DNS污染
我来说下目前我知道的各平台上,本地避免DNS 污染的方法。
DNS污染的原理部分,参考这篇 深入理解GFW:DNS污染。本地避免污染,有两个思路:
- 通过加密方式,查询可信的DNS服务器
- 设置国外DNS服务器,并丢弃GFW DNS伪包
第一种思路下,目前比较靠谱的是 DNSCrypt,支持Windows (下载)和 Mac(下载)。DNSCrypt 使用很方便,把 Enable OpenDNS、Enable DNSCrypt 全勾上就好,也建议勾上 Fallback to insecure DNS。
第二种方式,Windows上不好弄。Mac 和 Linux 都有办法实现。前提是设置国外DNS,继续推荐台湾中华电信的168.95.1.1 。然后:
- Mac:安装 kernet 内核扩展(下载),我自己做的,开机自启动,风险自负。
- Linux:西厢计划项目做了这一部分,不过编译内核模块毕竟麻烦。2.6.33.7 以上版本的内核(不保证这是最低版本),依赖 iptables 1.4.10,都会自带u32 模块,可以用iptables 规则做丢弃GFW DNS伪包:
iptables -I INPUT -p udp -m udp –sport 53 -m u32 –u32 “0&0x0F000000=0×05000000 && 22&0xFFFF@16=0x5d2e0859,0xcb620741,0x0807c62d,0x4e10310f,0x2e52ae44,0xf3b9bb27,0xf3b9bb1e,0x9f6a794b,0x253d369e,0x9f1803ad” -j DROP iptables -I INPUT -p udp -m udp –sport 53 -m u32 –u32 “0&0x0F000000=0×05000000 && 22&0xFFFF@16=0x3b1803ad” -j DROP
设置联网自动加载iptables 配置:Ubuntu下,可以把以上规则写入 /etc/network/if-pre-up.d/iptablesload 文件。其它Linux发行版应该也有类似的方法。强烈建议淘宝上卖自制路由器的同学们,把这个防火墙规则写到路由器中,也能多一个卖点。
from http://liruqi.info/post/28775426009/how-to-avoid-dns-hijack-locally
---------------------------------------------------------------------------------------------------
一、OpenWRT的准备工作
普通Linux用户可以直接跳过这一节,因为大多数发行版已经安装了这些必要的软件包了喵~
opkg update opkg install iptables-mod-filter bind-dig
二、脚本本体及注释
#!/bin/ash #这行是用一个不存在的域名解析来钓出强制跳转地址 NONEXISTDOMAIN="non.exist.domain.cn" #这行写入一些会被污染的域名 POSIONEDDOMAIN="www.twitter.com www.facebook.com www.youtube.com plus.google.com" #下面这行写入本地的DNS地址,即被污染的DNS服务地址 WALLSERVER="61.139.2.69" LOOPTIMES=9 badip="" #钓出非法域名强制跳转地址 for DOMAIN in $NONEXISTDOMAIN ; do for IP in $(dig $DOMAIN +time=1 +tries=1 +retry=0 | grep ^$DOMAIN | grep -o -E "([0-9]+\.){3}[0-9]+") ; do if [ -z "$(echo $badip | grep $IP)" ] ; then badip="$badip $IP" fi done done echo First Step: $badip #钓出污染的IP地址(GFW反馈的) for i in $(seq $LOOPTIMES) ; do for DOMAIN in $POSIONEDDOMAIN ; do for IP in $(dig @$WALLSERVER $DOMAIN +time=1 +tries=1 +retry=0 | grep ^$DOMAIN | grep -o -E "([0-9]+\.){3}[0-9]+") ; do if [ -z "$(echo $badip | grep $IP)" ] ; then badip="$badip $IP" echo $IP $DOMAIN fi done done done echo Second Step: $badip #将这些地址在 Firewall里面过滤掉 for IP in $badip do hexip=$(printf '%02X ' ${IP//./ }; echo) # echo $hexip iptables -I INPUT -p udp --sport 53 -m string --algo bm --hex-string "|$hexip|" --from 60 --to 180 -j DROP iptables -I FORWARD -p udp --sport 53 -m string --algo bm --hex-string "|$hexip|" --from 60 --to 180 -j DROP done
三、原理介绍
因为DNS是使用UDP数据包进行发送的,正常的查询如下:
PC 查询域名 -查询UDP包-> 网关 -查询UDP包-> DNS服务器 -返回UDP包-> 网关 -返回UDP包-> PC结束查询
被GFW污染之后,GFW抢先在DNS服务器正确包到达之前返回被污染结果:
PC 查询域名 -查询UDP包-> 网关(路由旁路触发GFW) -查询UDP包-> DNS服务器 -返回UDP包-> (GFW抢先返回)网关 -GFW返回UDP包-> PC结束查询 -正确的UDP包-> 被遗弃
但是GFW只能固定返回几个IP(返回正确IP风险很高,比如暴风上次导致的故障),所以只要找到这几个IP,加以过滤,则能够将GFW抢答的包在防火墙上设置无效丢包即可,正确的包就会在稍加等待后返回。
-------------------------
使用ipfilter过滤GFW的DNS污染
最原始文档请参考AutoVPN上滴 这篇文章 喵~咱将其原始脚本修订了一些,并添加了 OpenWRT滴正确使用姿势喵~
一、OpenWRT的准备工作
普通Linux用户可以直接跳过这一节,因为大多数发行版已经安装了这些必要的软件包了喵~
opkg update opkg install iptables-mod-filter bind-dig
二、脚本本体及注释
#!/bin/ash #这行是用一个不存在的域名解析来钓出强制跳转地址 NONEXISTDOMAIN="non.exist.domain.cn" #这行写入一些会被污染的域名 POSIONEDDOMAIN="www.twitter.com www.facebook.com www.youtube.com plus.google.com" #下面这行写入本地的DNS地址,即被污染的DNS服务地址 WALLSERVER="61.139.2.69" LOOPTIMES=9 badip="" #钓出非法域名强制跳转地址 for DOMAIN in $NONEXISTDOMAIN ; do for IP in $(dig $DOMAIN +time=1 +tries=1 +retry=0 | grep ^$DOMAIN | grep -o -E "([0-9]+\.){3}[0-9]+") ; do if [ -z "$(echo $badip | grep $IP)" ] ; then badip="$badip $IP" fi done done echo First Step: $badip #钓出污染的IP地址(GFW反馈的) for i in $(seq $LOOPTIMES) ; do for DOMAIN in $POSIONEDDOMAIN ; do for IP in $(dig @$WALLSERVER $DOMAIN +time=1 +tries=1 +retry=0 | grep ^$DOMAIN | grep -o -E "([0-9]+\.){3}[0-9]+") ; do if [ -z "$(echo $badip | grep $IP)" ] ; then badip="$badip $IP" echo $IP $DOMAIN fi done done done echo Second Step: $badip #将这些地址在 Firewall里面过滤掉 for IP in $badip do hexip=$(printf '%02X ' ${IP//./ }; echo) # echo $hexip iptables -I INPUT -p udp --sport 53 -m string --algo bm --hex-string "|$hexip|" --from 60 --to 180 -j DROP iptables -I FORWARD -p udp --sport 53 -m string --algo bm --hex-string "|$hexip|" --from 60 --to 180 -j DROP done
三、原理介绍
因为DNS是使用UDP数据包进行发送的,正常的查询如下:
PC 查询域名 -查询UDP包-> 网关 -查询UDP包-> DNS服务器 -返回UDP包-> 网关 -返回UDP包-> PC结束查询
被GFW污染之后,GFW抢先在DNS服务器正确包到达之前返回被污染结果:
PC 查询域名 -查询UDP包-> 网关(路由旁路触发GFW) -查询UDP包-> DNS服务器 -返回UDP包-> (GFW抢先返回)网关 -GFW返回UDP包-> PC结束查询 -正确的UDP包-> 被遗弃
但是GFW只能固定返回几个IP(返回正确IP风险很高,比如暴风上次导致的故障),所以只要找到这几个IP,加以过滤,则能够将GFW抢答的包在防火墙上设置无效丢包即可,正确的包就会在稍加等待后返回。
-------------------------
dnsproxycn 的官方简介
windows系统的一个本地dns代理工具, 通过延时的方法减少中国的dns污染, 通过加载ipv6host.txt文件, 可强制只返回ipv6地址, 使得浏览器只能通过ipv6进行工作, 可通过ipv6访问google, 有图比 等网站.
ipv6host.txt中的地址提取自紫狐浏览器, 使用该工具不需紫狐浏览器也能使通过隧道运行ipv6的机器用ipv6host中的地址进行访问, 效果几乎和紫狐浏览器一样. 中国境外用户不需要本工具.
官方项目 http://code.google.com/p/dnsproxycn/
下载地址 http://code.google.com/p/dnsproxycn/downloads/detail?name=DNSProxy.exe&can=2&q=
具体使用方法 启动 DNSProxy.exe
把ADSL用户把宽带连接的DNS改成127.0.0.1
路由用户改本地连接的DNS为127.0.0.1
程序有CMD窗口,需要隐藏CMD窗口的话,就下载下面的 RunHiddenConsole.zip
使用方法
RunHiddenConsole.exe C:\DNSProxy\DNSProxy.exe
即可。
RunHiddenConsole.zip下载地址:http://www.box.com/s/vh43ev9m43eidotz5ll1
----------------
----------------
什么是DNS污染
回答这个问题之前,如果你不知道DNS的作用是什么,我可以简单的说,DNS的中文是域名系统,英文是Domain Name System,简称DNS,是因特网的一项业务服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。(抄自域名系统)
然后,DNS污染简单来说就是让找不到正确的IP,然后就没有然后,上不了网了,开着VPN也没用。
然后,DNS污染简单来说就是让找不到正确的IP,然后就没有然后,上不了网了,开着VPN也没用。
下面举个例子吧,下面同样域名得到差异很大的结果。如果我们使用国内的DNS服务器或者ISP提供的DNS服务器,就算开着VPN,我们也不能正常的DNS解析的。