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包括:
编程环境:
(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
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服务器
- 设置国外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来管理.