• DNS解析污染原理——要么修改包,要么直接丢弃你的网络包


    DNS/域名解析

    可以看到dns解析是最初的一步,也是最重要的一步。比如访问亲友,要知道他的正确的住址,才能正确地上门拜访。

    dns有两种协议,一种是UDP(默认),一种是TCP。

    udp 方式,先回应的数据包被当做有效数据

    在linux下可以用dig来检测dns。国内的DNS服务器通常不会返回正常的结果。
    下面以google的8.8.8.8 dns服务器来做测试,并用wireshark来抓包,分析结果。

    1
    dig @8.8.8.8 www.youtube.com

    dns-udp-youtubedns-udp-youtube

    从wireshark的结果,可以看到返回了三个结果,前面两个是错误的,后面的是正确的

    但是,对于dns客户端来说,它只会取最快回应的的结果,后面的正确结果被丢弃掉了。因为中间被插入了污染包,所以即使我们配置了正确的dns服务器,也解析不到正确的IP。

    tcp 方式,有时有效,可能被rest

    再用TCP下的DNS来测试下:

    1
    dig @8.8.8.8 +tcp www.youtube.com

    dns-tcp-youtube-resetdns-tcp-youtube-reset

    从wireshark的结果,可以看出在TCP三次握手成功时,本地发出了一个查询www.youtube.com的dns请求,结果,很快收到了一个RST回应。而RST回应是在TCP连接断开时,才会发出的。所以可以看出,TCP通讯受到了干扰,DNS客户端因为收到RST回应,认为对方断开了连接,因此也无法收到后面正确的回应数据包了。

    再来看下解析twitter的结果:

    1
    dig @8.8.8.8 +tcp www.twitter.com

    结果:

    1
    2
    3
    4
    5
    www.twitter.com. 590 IN CNAME twitter.com.
    twitter.com. 20 IN A 199.59.150.7 80
    twitter.com. 20 IN A 199.59.150.7
    twitter.com. 20 IN A 199.59.149.230
    twitter.com. 20 IN A 199.59.150.39

    这次返回的IP是正确的。但是尝试用telnet 去连接时,会发现连接不上。

    1
    telnet 199.59.150.7 80

    但是,在国外服务器去连接时,可以正常连接,完成一个http请求。可见一些IP的访问被禁止了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ telnet 199.59.150.7 80
    Trying 199.59.150.7...
    Connected to 199.59.150.7.
    Escape character is '^]'.
    GET / HTTP/1.0
    HOST:www.twitter.com
     
    HTTP/1.0 301 Moved Permanently
    content-length: 0
    date: Sun, 08 Feb 2015 06:28:08 UTC
    location: https://www.twitter.com/
    server: tsa_a
    set-cookie: guest_id=v1%3A142337688883648506; Domain=.twitter.com; Path=/; Expires=Tue, 07-Feb-2017 06:28:08 UTC
    x-connection-hash: 0f5eab0ea2d6309109f15447e1da6b13
    x-response-time: 2

    黑名单/白名单

    想要获取到正确的IP,自然的黑名单/白名单两种思路。

    下面列出一些相关的项目:

    1
    2
    3
    https://github.com/holmium/dnsforwarder
    https://code.google.com/p/huhamhire-hosts/
    https://github.com/felixonmars/dnsmasq-china-list

    本地DNS软件

    • 修改hosts文件
      相信大家都很熟悉,也有一些工具可以自动更新hosts文件的。
    • 浏览器pac文件
      主流浏览器或者其插件,都可以配置pac文件。pac文件实际上是一个JS文件,可以通过编程的方式来控制dns解析结果。其效果类似hosts文件,不过pac文件通常都是由插件控制自动更新的。只能控制浏览器的dns解析。
    • 本地dns服务器,dnsmasq
      在linux下,可以自己配置一个dnsmasq服务器,然后自己管理dns。不过比较高级,也比较麻烦。

    顺便提一下,实际上,kubuntu的NetworkManager会自己启动一个私有的dnsmasq进程来做dns解析。不过它侦听的是127.0.1.1,所以并不会造成冲突。

    1
    /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf

    路由器智能DNS

    基于OpenWRT/Tomoto的路由器可以在上面配置dns server,从而实现在路由器级别智能dns解析。现在国内的一些路由器是基于OpenWRT的,因此支持配置dns服务器。
    参考项目:

    1
    https://github.com/clowwindy/ChinaDNS
  • 相关阅读:
    1相关介绍
    json c++处理学习
    重定向问题学习
    unordered_multimap学习
    std::bind()功能学习
    grep命令学习
    gdb调试coredump学习
    系统过载理解
    C++中int8_t int16_t、int32_t、int64_t、uint8_t等学习
    awk命令学习
  • 原文地址:https://www.cnblogs.com/bonelee/p/7462657.html
Copyright © 2020-2023  润新知