[摘要]因为业务特性对DNS请求量比较大(其实也没有多大,UDP流量也就50M+),然后整个网段的UDP53请求被运营商残忍地Block掉,所有机器无法解析域名。。。然后与IDC与运营商各种电话,发现流程非常繁琐,而且时间无法保证,重点是业务受到了严重影响,于是只能努力寻求其他解决方案。
初步想法是找台该IDC没有被block的ip地址,然后搭建dns,我们中转出去,后来经过沟通没有这样的IP存在,也就是说整个IDC被我们搞挂了,所有客户都无法解析域名啦,对这个表示非常sorry。。
另外就是猜测运营商是通过IP地址+协议+端口封的请求,是不是可以修改DNS的默认请求,下面就是这样的测试,后来发现成功鸟,不过这也只是临时解决方案,最终还是要找运营商把限制解开,这个暂且不提,下面是如何通过DNS非标准端口绕过封堵的过程。
具体操作如下:
需要搭建两台unbound服务器,远离就是通过本地DNS缓存与DNS forward功能:
DNS1:10.20.30.40:53(内网)
DNS2:80.70.60.50:5553(公网)
DNS请求流程:
10.20.30.0/24(内部服务器) –> 10.20.30.40:53(DNS1) –> 80.70.60.50:5553(DNS2)
##DNS2:80.70.60.50
DNS1 unbound配置:
cat /etc/unbound/unbound.conf interface: 80.70.60.50 port: 5553 root-hints: "/etc/unbound/named.cache" access-control: 10.20.30.0/24 allow
DNS2本机的dns配置
# cat /etc/resolv.conf nameserver 8.8.8.8
##DNS1: 10.20.30.40
DNS1 unbound配置:
cat /etc/unbound/unbound.conf interface: 10.20.30.40 port: 53 forward-zone: name: "." forward-addr: 80.70.60.50@5553
DNS1本机的dns配置
# cat /etc/resolv.conf nameserver 127.0.0.1
其他10.20.30.0/24网段的服务器可以配置10.20.30.40为dns服务器
# cat /etc/resolv.conf nameserver 10.20.30.40
下面是在其中一台服务器的测试情况:
# dig www.baidu.com
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> www.baidu.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65416 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 5 ;; QUESTION SECTION: ;www.baidu.com. IN A ;; ANSWER SECTION: www.baidu.com. 1200 IN CNAME www.a.shifen.com. www.a.shifen.com. 300 IN A 119.75.217.56 www.a.shifen.com. 300 IN A 119.75.218.77
如果通过公网DNS dig +trace的话,结果会非常长,能够看到13个根DNS服务器,依次是com. baidu.com. 最后找到www.baidu.com
# dig @8.8.8.8 www.baidu.com +trace
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> @8.8.8.8 www.baidu.com +trace ; (1 server found) ;; global options: +cmd . 16322 IN NS a.root-servers.net. . 16322 IN NS b.root-servers.net. . 16322 IN NS c.root-servers.net. . 16322 IN NS d.root-servers.net. . 16322 IN NS e.root-servers.net. . 16322 IN NS f.root-servers.net. . 16322 IN NS g.root-servers.net. . 16322 IN NS h.root-servers.net. . 16322 IN NS i.root-servers.net. . 16322 IN NS j.root-servers.net. . 16322 IN NS k.root-servers.net. . 16322 IN NS l.root-servers.net. . 16322 IN NS m.root-servers.net. ;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 6013 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. ;; Received 491 bytes from 193.0.14.129#53(193.0.14.129) in 9984 ms baidu.com. 172800 IN NS dns.baidu.com. baidu.com. 172800 IN NS ns2.baidu.com. baidu.com. 172800 IN NS ns3.baidu.com. baidu.com. 172800 IN NS ns4.baidu.com. baidu.com. 172800 IN NS ns7.baidu.com. ;; Received 201 bytes from 192.12.94.30#53(192.12.94.30) in 396 ms www.baidu.com. 1200 IN CNAME www.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. a.shifen.com. 1200 IN NS ns4.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. ;; Received 228 bytes from 202.108.22.220#53(202.108.22.220) in 1 ms
通过自己的DNS服务器则只有一跳:
# dig www.baidu.com +trace
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6 <<>> www.baidu.com +trace ;; global options: +cmd ;; Received 12 bytes from 10.20.30.40#53(10.20.30.40) in 1 ms
测试结果还是比较满意,至少功能上实现了,临时顶一阵,如果被封就继续换端口,还被封可以试试20,21,22,80之类的,我就不信量http/ftp也给封了(当然,人家把整个IP段封掉我也没辙,不过这个咱不告诉他:)