基于 Technitium DNS Server 部署自己的 DNS Server

Intro

之前买的域名是在阿里云上,前段时间将几个应用部署到了 Azure Kubernetes Service 上了,配置好 cert bot 之后,后面不知道什么原因域名被阿里云拦截掉了,没有办法正常解析了,找阿里云客服说是反诈中心给封的,得找他们申诉,结果打了好多次电话根本打不通。。真想骂人啊

域名被封之后想把域名转到 cloudflare 上去,转起来似乎有些麻烦,最后把另外一个域名的 name server 改到了 cloudflare 上去,想避免再次被封掉,如果再被封了,以后就不在阿里云注册域名了,目前看下来还好,没有出现被封的情况

由于一些特殊需求最近想部署一个 DNS server,然后通过自己的 DNS server 配置来解析了之前被阿里云封掉的域名,使用自己的 DNS Server 可以避免一些 DNS 污染的问题也可以解析一些自己内部的域名同时可以借助 DNS 解析来拦截掉一些想要过滤的内容比如广告,比如一些想要限制访问的网站

Setup

Technitium DNS Server 是基于 C# 写的一个 DNS Server,功能很强大,我是基于 docker 部署的,也可以直接下载安装包进行部署

可以参考介绍:https://technitium.com/dns/

docker 部署可以直接基于 docker-compose 示例来跑一个 container,跑之前,如果打算使用默认的 53 端口需要先禁用系统的 dns 服务

disable 默认 dns 服务:

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

docker-compose: https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml

version: "3"
services:
  dns-server:
    container_name: dns-server
    hostname: dns-server
    image: technitium/dns-server:latest
    # For DHCP deployments, use "host" network mode and remove all the port mappings, including the ports array by commenting them
    # network_mode: "host"
    ports:
      - "5380:5380/tcp" #DNS web console (HTTP)
      # - "53443:53443/tcp" #DNS web console (HTTPS)
      - "53:53/udp" #DNS service
      - "53:53/tcp" #DNS service
      # - "853:853/udp" #DNS-over-QUIC service
      # - "853:853/tcp" #DNS-over-TLS service
      # - "443:443/udp" #DNS-over-HTTPS service (HTTP/3)
      # - "443:443/tcp" #DNS-over-HTTPS service (HTTP/1.1, HTTP/2)
      # - "80:80/tcp" #DNS-over-HTTP service (use with reverse proxy or certbot certificate renewal)
      # - "8053:8053/tcp" #DNS-over-HTTP service (use with reverse proxy)
      # - "67:67/udp" #DHCP service      
    environment:
      - DNS_SERVER_DOMAIN=dns-server #The primary domain name used by this DNS Server to identify itself.
      # - DNS_SERVER_ADMIN_PASSWORD=password #DNS web console admin user password.
      # - DNS_SERVER_ADMIN_PASSWORD_FILE=password.txt #The path to a file that contains a plain text password for the DNS web console admin user.
      # - DNS_SERVER_PREFER_IPV6=false #DNS Server will use IPv6 for querying whenever possible with this option enabled.
      # - DNS_SERVER_WEB_SERVICE_HTTP_PORT=5380 #The TCP port number for the DNS web console over HTTP protocol.
      # - DNS_SERVER_WEB_SERVICE_HTTPS_PORT=53443 #The TCP port number for the DNS web console over HTTPS protocol.
      # - DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=false #Enables HTTPS for the DNS web console.
      # - DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=false #Enables self signed TLS certificate for the DNS web console.
      # - DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP=false #Enables DNS server optional protocol DNS-over-HTTP on TCP port 8053 to be used with a TLS terminating reverse proxy like nginx.
      # - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks #Recursion options: Allow, Deny, AllowOnlyForPrivateNetworks, UseSpecifiedNetworks.
      # - DNS_SERVER_RECURSION_DENIED_NETWORKS=1.1.1.0/24 #Comma separated list of IP addresses or network addresses to deny recursion. Valid only for `UseSpecifiedNetworks` recursion option.
      # - DNS_SERVER_RECURSION_ALLOWED_NETWORKS=127.0.0.1, 192.168.1.0/24 #Comma separated list of IP addresses or network addresses to allow recursion. Valid only for `UseSpecifiedNetworks` recursion option.
      # - DNS_SERVER_ENABLE_BLOCKING=false #Sets the DNS server to block domain names using Blocked Zone and Block List Zone.
      # - DNS_SERVER_ALLOW_TXT_BLOCKING_REPORT=false #Specifies if the DNS Server should respond with TXT records containing a blocked domain report for TXT type requests.
      # - DNS_SERVER_BLOCK_LIST_URLS= #A comma separated list of block list URLs.
      # - DNS_SERVER_FORWARDERS=1.1.1.1, 8.8.8.8 #Comma separated list of forwarder addresses.
      # - DNS_SERVER_FORWARDER_PROTOCOL=Tcp #Forwarder protocol options: Udp, Tcp, Tls, Https, HttpsJson.
      # - DNS_SERVER_LOG_USING_LOCAL_TIME=true #Enable this option to use local time instead of UTC for logging.
    volumes:
      - config:/etc/dns
    restart: unless-stopped
    sysctls:
      - net.ipv4.ip_local_port_range=1024 65000
 
volumes:
    config:

我们可以直接基于这个 docker-compose 跑起来 dns-server 服务,然后通过 web ui 来管理具体的配置,默认的 web ui 端口是 5380

第一次打开会自动用 admin/admin 登录,之后会提示你修改密码,如果公网暴露出去,一定要修改密码。。

我们可以创建一个  Conditional Forwarder Zone  来解析自己的域名,对于没有配置的域名就可以 forward 给另外一个 dns server 去解析

4760bc66afffbfe415a790b332e79ef7.png

add zone

另外默认地 Recursion 只会发生在内网里,我们需要配置为 Allow Recursion 来支持解析未配置的域名解析:

4d30dcc4ccbe0fd6a147c53f921d508f.png

除了自己的域名解析,我们也可以配置 block list,可以对一些域名进行 block

Settings => Blocking 的配置中,我们可以使用一些内置的广告等拦截规则,这样我们就可以拦截一些不想查看的内容或者控制客户端不让访问的内容,

而且我们可以自己维护一个 list,可以配置定期更新,默认一天更新一次

d90c843fd8d18dac5c79e2d8bcd1cf73.png

More

dns-server 配置好之后,可以修改家里路由器的 DNS 配置为我们自己的 dns 服务器,这样我们通过路由器的客户端没有特别配置的话我们就会走自己 dns server 进行 dns 解析,就可以实现访问自己的 dns 服务解析

7317cb3fb0d1740d13faf1137dbcf5a6.png

dns-result

除了常规的 dns 之外,Technitium DNS Server 还支持 dns over http(s) , dns over tls, dns over quic 等,有一篇 Android 上基于 DoH 来实现广告拦截的一篇文章,感兴趣的可以研究一下:https://romailler.ch/2021/04/15/misc-pihole_over_dot/

Technitium blog 里有很多 dns 的知识,对于想要了解 dns 知识的朋友们一定不要错过 https://blog.technitium.com/

还要提一下,cloudflare 有一个 dns server 1.1.1.1  号称 privacy-first,大家自己配置 dns server 可以考虑一下使用这个代替 114.114.114.114

最后,现在自定义了 dns server,可以解析到之前的 aks 集群上去了,但是证书过期了,还得花些时间研究一下在 k8s 集群里 certbot 怎么使用自定义的 dns server 来申请 tls 证书,后面搞定了再来分享,下次见

References

  • https://technitium.com/dns/

  • https://github.com/TechnitiumSoftware/DnsServer

  • https://hub.docker.com/r/technitium/dns-server

  • https://romailler.ch/2021/04/15/misc-pihole_over_dot/

  • https://blog.technitium.com/

  • https://blog.cloudflare.com/welcome-hidden-resolver/

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐