xl224 发表于 2018-11-21 11:40:42

dns server配合dingo防止dns投毒和内网解析

之前看到有人用群晖的dns server做了内网解析,我之前家里的网络么一直都是使用的dnsmasq+chinadns+pdnsd来做解析和防止dns的某些解析错误(大家应该都懂的),然后手痒痒准备折腾下群晖自己的dns server

      先简单说下家里网络吧,因为北京这边电信已经彻底不给公网ip了,所以我家里的网络和阿里云的ecs主机打了一个洞,阿里云的机器可以直接访问内网的任意一台机器,从公网访问内网也就成为了可能。
      然后就是fq的需求了,上上google啊,看看土鳖啊,这一块呢就碰到了dns偶尔的解析错误了,所以之前采用了上面说到的方式来防止,dnsmasq里面导入了国内域名列表,国内域名直接走本地电信的dns,其他的域名走chinadns,然后转发给pdnsd把dns请求从udp转换为tcp丢给hk的机器来做真正的解析,同时还要负责解析我自己的域名,回到家里就解析成内网地址。

      前情提要结束,下面开干,首先是选择更好的防止dns解析错误的方式,原来的chinadns+pdnsd对于cdn其实不是很友好,家里访问一些国内的视频网站经常各种解析错误或者慢,所以这次也要一并解决,最终研究了一天,选择了DNS Over HTTP(S),提供https的解析服务选择的是dns.google.com。
      首先说下dns.google.com本身解析速度飞快,然后呢就是很重要的支持edns_client_subnet设置,这一点很重要,设置edns_client_subnet为本地的出口地址,这样解析出来的结果cdn也是正确的了,可以说是目前最完美的解决dns投毒的方式了。
      然后就是选择本地的应用了,支持使用dns.google.com做解析的开源软件其实挺多,看到国内有人做过prcdns,但是各种不好用,后来看到了dingo,用go开发的,做了一些测试完美,而且可以在docker里面跑。
      关于dingo的镜像我没有直接使用docker hub上的版本,而是直接去了做着的github做了调整,因为默认的镜像修改一些参数群晖自己的docker界面创建的时候会报错,所以我是自己从Dokerfile在群晖本地构建出来的镜像。
      1、首先ssh到群晖,然后命令创建一个dingo目录(mkdir dingo)
            
      2、进入dingo目录(cd dingo),下载dockerfile(wget https://raw.githubusercontent.co ... er/dingo/Dockerfile)
            
      3、然后就是需要对Dockerfile做修改,我直接把修改的内容放上来
FROM ubuntu:16.04

RUN set -x \
    && apt-get update \
    && apt-get install -y ca-certificates \
    && apt-get install -y curl \
    && curl -k -L -o /usr/local/bin/dingo https://github.com/pforemski/dingo/releases/download/0.13/dingo-linux-amd64 \
    && chmod a+x /usr/local/bin/dingo \
    && apt-get remove -y --purge curl \
    && apt-get autoremove -y --purge \
    && rm -rf /var/lib/apt/lists/*

CMD dingo -bind=0.0.0.0 -port=53 -gdns:edns=1.203.64.25 -gdns:server=216.58.197.110          这里我主要增加了apt-get install -y ca-certificates,安装证书,否则运行会报错          然后就是最后的启动参数,默认只绑定在127.0.0.1,所以在docker 里面跑会有问题
          -gdns:edns=1.203.64.25,这里是指定edns_client_subnet的参数,后面的地址用你们自己宽带的出口ip地址即可
          -gdns:server=216.58.197.110,这里是指定dns.google.com的地址,我用的hk的,因为解析最终就是hk完成,这里需要自己修改,找到一个能访问的ip地址,我家里是在路由导入了国内的路由表,如果不是国内的ip地址就会转发走隧道出去。
          修改好之后,运行"sudo docker build -t dingo:latest . ",注意最后一个“点”哦~不要忘记。
         
          看到最后的successfully就好了,然后就能在群晖的docker里面,看到你刚刚build出来的镜像了
         
      4、后面我们开始在docker里面做写操作,首先我们要新增一个新的网络
            
          这里随便起一个名字吧,然后确定,我们开始运行dingo
         
          回去docker的映像,选择前面创建出来的dingo:latest,然后启动,名字自己随便起,这里先点击高级设置
         
         进入高级设置,选择网络,把你刚才新建的网络添加进去,确定,然后下一步应用,docker就会把dingo起来了
         
          在容器里面就能看到已经运行的dingo了,点击详情查看下日志,有同样的内容就代表运行好了,然后来配置群晖的dns server。
          这里有一点,我们需要知道dingo的地址,还是在dingo的详情里面,选择最后的终端机,点新增旁边的箭头,通过命令启动
          输入“/bin/bash”,然后确定
         
      可以左边就有了bash,点击进去,就可以在右边输入命令
       执行“cat /etc/hosts”,这里能看到我最后的“172.19.0.2 dingo-dns2https",我的容器名字就是dingo-dns2https,前面的172.19.0.2这个地址就是docker分配给dingo的地址,这里记下来。
      
      我们打开dns server,进入解析,勾选“启用解析服务”和下面的“启用解析器”,下面输入上面查到的docker里面的ip地址,然后应用
      

      好了,这样就可以了,用群晖的dns提供了解析服务,我用来访问群晖的域名解析成内网地址,然后解析也使用群晖的dns来完成了,一举兼得,而且比以前架构简单~


米兔兔 发表于 2018-11-21 13:22:27

小白看不懂

kingzwj168 发表于 2018-11-21 14:03:50

这个教程好,收藏了

snowman1003 发表于 2018-11-21 22:42:57

感谢分享

jojo100 发表于 2018-11-21 23:59:22

也就是说,不用ngrok之类的,也能够在外网直接访问内网了?

超导体 发表于 2018-11-21 23:59:42

谢谢分享!!!

136347358 发表于 2018-11-25 22:30:11

感谢分享!!!

xl224 发表于 2018-11-26 12:36:47

jojo100 发表于 2018-11-21 23:59
也就是说,不用ngrok之类的,也能够在外网直接访问内网了?

ngrok只是选择之一
我直接通过家里的路由器和阿里云之间通过pptp建立一个隧道,然后家里的群晖自己就可以配置反响代理,还支持https,包括lets的证书,基本上隧道建立之后就不用管了,阿里云上只要配置好80和443端口转发到内网的群晖上就可以了,剩下的都用群晖自己的功能和配置就实现了

avivi 发表于 2018-11-27 16:16:49

专业专业!
页: [1]
查看完整版本: dns server配合dingo防止dns投毒和内网解析