Pages

Saturday, 31 December 2011

truedns:一个获取真实的dns解析结果的驱动级工具(仅限于linux desktop os),解决DNS污染问题


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包括:
  • 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)对于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) 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)
通过得到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()。
需要改进的:
由于时间和精力的限制没能通过下列几点来改进我们的程序。
(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污染。本地避免污染,有两个思路:
  1. 通过加密方式,查询可信的DNS服务器
  2. 设置国外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 
---------------------------------------------------------------------------------------------------

使用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服务器或者ISP提供的DNS服务器,就算开着VPN,我们也不能正常的DNS解析的。
[23:13:07] roowe@roowe-gentoo /tmp$ nslookup twitter.com 8.8.8.8
Server:         8.8.8.8
Address:        8.8.8.8#53
 
Non-authoritative answer:
Name:   twitter.com
Address: 199.59.148.82
Name:   twitter.com
Address: 199.59.149.230
Name:   twitter.com
Address: 199.59.150.39
 
[23:14:37] roowe@roowe-gentoo /tmp$ nslookup twitter.com 114.114.114.114
Server:         114.114.114.114
Address:        114.114.114.114#53
 
Non-authoritative answer:
Name:   twitter.com
Address: 46.82.174.68
--------
resolvconf的作用就是 managing multiple DNS configurations,要不然resolv.conf配置全乱了,第一个都不是我们想要的127.0.0.1。
resolvconf配置如下。
resolv_conf=/etc/resolv.conf
name_servers=127.0.0.1
用了resolvconf之后,我们自动生成的resolv.conf配置大概如下:
[23:46:30] roowe@roowe-gentoo /tmp$ cat /etc/resolv.conf 
# Generated by resolvconf
nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
------------------
发现fedora很多包都更新得很慢,我虽然不是很热衷于新版本,但是现在有些新版本的feture是我需要呀,比如Xfce按住Alt+Tab之后的左右方向键在xfce-4.9是有效,但是在4.8版本是没有用的,囧!还有Emacs还没有升级到24呀。想到这里,我就想马上搬我的电脑过来用gentoo。除了更新慢之外,还有些包没有,比如resolvconf这个包竟然没有。所以就没法管理resolv.conf了,但是为了使用dnsmasq,还是有办法的,在 /etc/sysconfig/network-scripts/ifcfg-p33p1(这个文件是我的,找你相应的)这个文件后面添加DNS1=127.0.0.1,然后/etc/init.d/network restart下就好了。PS:我没用NetworkManager,这货坑爹的,直接用network来管理.