修改BIND9实现TCP DNS
近日适逢某平方节日,Google国外网站陆续出现被墙的状况,想必大家都是知道的。
其实本人一直在使用SSH的Socket代理功能爬梯子,效果还是不错的,加上学校有原生IPv6支持,就算不走代理一般也能上各大网站。唯独有一点,不论是浏览器还是操作系统,DNS均使用了UDP协议,而UDP显然是无法走Socket代理的,所以对于Youtube、Facebook这些网站由于域名解析问题,仍旧无法访问。

不过,事情总有解决的办法。
由于习惯于使用UDP协议的DNS,很多人不知道其实DNS也是支持TCP协议的,功夫网只对UDP的DNS进行了劫持和污染,TCP DNS则可畅通无阻。
唯一的问题就是,浏览器、操作系统等都无法直接使用TCP DNS,我前一段时间一直在使用Tcp-DNS-proxy解决这个问题。这是一个基于Python的小程序,可以通过TCP连接DNS服务器,并在本地监听UDP53端口,实现TCP DNS的中转,程序简单运行方便,比较推荐。
不过Tcp-DNS-proxy本身也存在着一些问题,比如没有完整的缓存机制,导致查询速度较慢,程序稳定性和抗并发性一般。于是我考虑能否有更加稳定的解决方案?
最终还是选定了BIND这一老牌的DNS服务器,利用forward功能可以比较容易的实现对DNS的转发。Ubuntu 14.04下修改配置如下:
/etc/bind/named.conf.options
...
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
forward only;
forwarders {
8.8.8.8;
8.8.4.4;
};
allow-query {
any;
};
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
...
仅仅这样是不够的,我们需要的是TCP DNS转发(代理),但经过测试BIND会首选UDP解析进行递归查询,经过搜索Google、查看官方文档、查看源代码,我发现从配置上修改这条路是行不通的。
没有办法,只能动手改源代码了。不过还好,最近嵌入式课程实验我尝试把NginX移植到了ARM平台上,对于裁剪代码还是有心理准备的。
经过几个小时的努力,翻看了几个重要的.c文件,最终我确定了BIND9(这里选用bind-9.10.0-P1)发出查询的函数,是位于lib/dns/resolver.c文件第1403行的fctx_query函数,节选其中1446至1451行如下:
- query->mctx = fctx->mctx;
- query->options = options;
- query->attributes = 0;
- query->sends = 0;
- query->connects = 0;
- query->dscp = addrinfo->dscp;
其中query->options = options;这一行中options利用位运算存储了是否使用TCP连接的变量DNS_FETCHOPT_TCP,我们需要做的就是将这一行改为:
- query->options = options | DNS_FETCHOPT_TCP;
强制让BIND使用TCP进行递归查询。之后进行编译,覆盖二进制文件即可,在此就不再赘述。效果如下:

可以看到,第1、36报文是客户端查询BIND服务器,为UDP协议;其他报文为BIND查询8.8.8.8,为TCP报文(颜色不同)。
修改BIND9实现TCP DNS的更多相关文章
- CentOS 网络设置修改 指定IP地址 DNS 网关(转)
CentOS 网络设置修改 指定IP地址 DNS 网关(实测 笔记) 环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5-x86_64 ...
- 修改linux系统TCP连接数
修改linux系统TCP连接数 centOS 6.x (1)vi /etc/sysctl.conf (2)添加参数 net.nf_conntrack_max = 655360 (3)sysctl -p ...
- 【点滴积累,厚积薄发】修改hosts,并刷新dns缓存
Windows系统下hosts位置 C:\Windows\System32\drivers\etc 修改hosts后,要想马上生效,需要运行命令来刷新DNS缓存:ipconfig /flushdns
- ubuntu 修改静态IP和DNS
1.修改配置文件/etc/network/interfacesroot@ubuntu:~# sudo vi /etc/network/interfaces 添加以下内容:auto eth0 ...
- Linux下修改网卡IP、DNS和网关
Linux下修改网卡IP和网关 建议通过终端字符方式下来修改 一.修改IP地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOO ...
- CentOS 6 网络设置修改 指定IP地址 DNS 网关
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5-x86_64 路由器网关:192.168.1.1 步骤: 1.查看网络MAC地址 [ro ...
- 通过JAVA反射修改JDK1.6*当中DNS缓存内容
时间 2012-05-28 17:09:03 Taobao QA Team原文 http://qa.taobao.com/?p=15523 为了实现性能压测时的域名动态绑定功能,尝试通过java反 ...
- 注册表修改IP地址和DNS等信息
---------------------win8系统 1. 2. 3. --------------------------------------------------------------- ...
- centos7 修改静态ip 和dns
1.修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-et ...
随机推荐
- MySql分组函数-Group by与having理解
注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...
- 【OPENGL】第三篇 着色器基础(二)
在这一小节,主要学习GLSL的基本数据类型以及控制结构.GLSL具备了C++和Java的很多特性,我们会先了解所有着色阶段共有的特性,再了解各个着色器的专属特性. 1.着色器的基本结构 一个着色器程序 ...
- English—句子
1. So far so good. 目前为止,一切都好. 2. Be my guest. 请便.别客气. 3. You're the boss. 听你的. 4.I've heard ...
- JMeter基础之--元件的作用域与执行顺序
前面有介绍过jmeter的元件类别,对于新手来说,jmeter的元件是还是不少的,如果我们按照每一个元件的每一个参数的含义去学习,无疑会降低学习性能测试的热情,就算我们熟悉了所有元件以及元件上的参数了 ...
- 【转】libevent和基于libevent的网络编程
转自: http://www.cnblogs.com/nearmeng/p/4043548.html 1 libevent介绍和安装 介绍 libevent是一个轻量级的基于事件驱动的高性能的开源网络 ...
- NSUserDefault的使用
NSUserDefaults 在我们编写代码中是最常用的一个永久保存数据的方法,也是最简单的. 使用NSUserDefault需要注意: 1.数据的本地化保存不是实时的,如果需要实时保存,调用sync ...
- GraphicsMagick+Im4Java在windows和linux下的配置
GraphicsMagick介绍及安装 Im4Java包为: im4java-1.2.0.jar 直接在lib下引用即可 GraphicsMagick的安装如下: windows下: 安装:Graph ...
- 北京全景视频外包公司:长年承接VR全景视频外包
北京动点飞扬软件,从事外包业务五年,长年承接全景VR视频,全景普通视频外包. 以下是全景VR视频案例(可操作,人不动景物不动,人移动,景物跟随) 欢迎联系我们QQ:372900288 TEL:1391 ...
- Python 面向对象2
静态方法 静态方法相当于函数,可以不创建对象直接引用 如果在类里面用静态方法,相当于函数,可以不创建对象,直接是用类里面的方法,你就当它是函数. 静态方法名义上归类管理,实际上静态方法访问不了类或实例 ...
- SQL JOIN的用法
背景:(血的教训) 非常感谢能够有幸的去活力世纪面试,面试官非常的祥和,虽然最后没能够去成,但是非常的感谢,是他让我明白了自己还有很多需要去学习,每一次的面试不是为了去证明自己有多强,能拿多少的工资, ...