刘博平的博客

一个软件工程师

如何利用pdnsd和PRCDNS防止DNS劫持

防止运营商DNS劫持,DNS污染,DNS劫持怎么办,DNS污染怎么办,DNS污染怎么解决,DNS污染太严重

DNS劫持主要是运营商以盈利为目的,进行的域名解析干扰,比如广告和强制使用缓存。几年前很多教程会告诉你使用OPENDNS或者114、百度、阿里的公共DNS来解决,运营商也提升了劫持技术,针对UDP协议,伪造DNS查询结果。目前DNS劫持主要针对UDP协议,TCP还没有被劫持,目前国内公共DNS支持TCP的也只有114,可以预见基于TCP协议的DNS查询应该没事,因为门槛高,用的人比较少。

安装pdnsd,将DNS地址指向pdnsd所在的IP,让pdnsd通过TCP协议查询上游DNS,这样就避免了DNS劫持,上游服务器可以选择114、OPENDNS和PRCDNS,但是OPENDNS对CDN不友好,会把淘宝的图片CDN网址img.alicdn.com指向香港,所以不推荐使用。

安装

pdnsd不支持Windows,建议Windows用户使用UNbound。
pdnsd可以安装在openwrt(淘宝有刷好的几十元路由器)、树莓派(淘宝二手50元不带电源线)、x86的工控机小主机(淘宝上几十元可能买到),推荐后2种,路由器性能太低,可玩性不高。

配置

根据不同的需求,我推荐pdnsd的2种配置。

  • 普通用户
    使用114DNS,114DNS还有其他功能
    纯净 无劫持 无需再忍受被强扭去看广告或粗俗网站之痛苦
    服务地址为:114.114.114.114 和 114.114.115.115
    拦截 钓鱼病毒木马网站 增强网银、证券、购物、游戏、隐私信息安全
    服务地址为:114.114.114.119 和 114.114.115.119
    学校或家长可选拦截 色情网站 保护少年儿童免受网络色情内容的毒害
    服务地址为:114.114.114.110 和 114.114.115.110
    详见114DNS官网
    下面是pdnsd的配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    global {
    perm_cache=2048;
    cache_dir="/var/cache/pdnsd";
    run_as="pdnsd";
    server_ip = 0.0.0.0; // Use eth0 here if you want to allow other
    server_port = 53; // machines on your network to query pdnsd.
    status_ctl = on;
    paranoid=on;
    query_method=tcp_only; // pdnsd must be compiled with tcp 只用tcp协议
    min_ttl=1d; // Retain cached entries at least 15 minutes.
    max_ttl=1w; // One week.
    timeout=10; // Global timeout option (10 seconds).
    }
    server {
    label = "114dns"; //设置114DNS作为上游服务器
    ip = 114.114.114.114,114.114.115.115;
    timeout = 10;
    port = 53;
    }
  • 高级用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    global {
    perm_cache=2048;
    cache_dir="/var/cache/pdnsd";
    run_as="pdnsd";
    server_ip = 0.0.0.0; // Use eth0 here if you want to allow other
    server_port = 53; // machines on your network to query pdnsd.
    status_ctl = on;
    paranoid=on;
    query_method=tcp_only; // pdnsd must be compiled with tcp 只用tcp协议
    min_ttl=1d; // Retain cached entries at least 15 minutes.
    max_ttl=1w; // One week.
    timeout=10; // Global timeout option (10 seconds).
    par_queries=1; 一定要加,否则会同时查询114,114会抢答查询结果
    }
    server {
    label = "prcdns"; //设置PRCDNS作为上游服务器
    ip = 23.106.151.177;
    timeout = 10;
    port = 3535;
    }
    server {
    label = "114dns"; //备用114DNS作为上游服务器
    ip = 114.114.114.114,114.114.115.115;
    timeout = 10;
    port = 53;
    }