我的心里除了露娜大人已经装不下其他女人了

搭建一个属于自己的 Anycast 递归 DNS

什么是 Anycast 递归 DNS

就是类似于 223.5.5.5 8.8.8.8 185.222.222.222 这种的服务

为什么要搞一个自己的 Anycast DNS 呢

有一个自己的 Anycast DNS 真的很酷,好嘛

准备工作

  • 多台支持 BGP 的 VPS(如果你不缺钱的话,其实物理机也可以的)
  • 一个 ASN
  • 一段 IP Block
  • 一个脑子

安装 Unbound

为了方便配置,这里就都使用 Docker-compose 安装了,以下 docker-compose.yml 文件和 unbound.conf 配置文件

version: '3.3'
services:
    unbound:
        container_name: unbound
        network_mode: host
        restart: unless-stopped
        volumes:
            - '<path to config>/unbound.conf:/opt/unbound/etc/unbound/unbound.conf'
        image: 'mvance/unbound:latest'
server:
    directory: "/opt/unbound/etc/unbound"
    chroot: "/opt/unbound/etc/unbound"
    interface: 127.0.0.1@5053    # 这里是监听的 IP 和端口,按照你自己的改
    interface: ::                # 这里是监听的 IP 和端口,按照你自己的改
    rrset-roundrobin: yes
    username: "_unbound"
    
    # Performance Config
    num-threads: 1
    so-reuseport: yes
    prefetch: yes
    minimal-responses: yes
    
    # Logs Config
    log-local-actions: no
    log-queries: no
    log-replies: no
    log-servfail: no
    verbosity: 0
    
    # Cache Config
    cache-max-ttl: 3600
    cache-min-ttl: 0
    msg-cache-size: 64m
    rrset-cache-size: 128m
    
    # EDNS0 Config
    edns-buffer-size: 1232
    edns-tcp-keepalive: yes
    edns-tcp-keepalive-timeout: 60000
    send-client-subnet: 0.0.0.0/0
    send-client-subnet: ::0/0
    max-client-subnet-ipv6: 56
    max-client-subnet-ipv4: 24
    
    # DNSSEC
    auto-trust-anchor-file: "var/root.key"
    
    # Sec Config
    access-control: 0.0.0.0/0 allow
    access-control: 2000::/3 allow
    hide-identity: yes
    hide-version: yes
    private-address: 10.0.0.0/8
    private-address: 172.16.0.0/12
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: fd00::/8
    private-address: fe80::/10
    private-address: ::ffff:0:0/96

remote-control:
    control-enable: no

配置 Anycast

我这次使用的是三台 Vultr 的 VPS(分别是新泽西、阿姆斯特丹、东京),关于如何在 Vultr 广播自己的 IP 可以看看我的这篇文章,在这里我就不多做赘述了

Anycast 听起来很高级,其实简单来说就是在不同的机器上广播同一段 IP 地址,因此我们要做的就是在三台 VPS 上都广播同一段地址,然后绑定一个 IP 到虚拟网卡,可以看到效果如下

然后将 Unbound 中监听的 IP 改成你自己指定的 IP 并且重启一下容器即可

Vultr 的 VPS 现在是默认开启防火墙的,如果你是 Debian 系的机器的话使用 ufw disable 即可关闭防火墙,否则外网无法访问服务,其他系统建议谷歌一下

通过 dig whoami.akamai.net 查看出口,可以看到不同地区的机器走了不同的出口,已经达到了我们想要的效果了

一点点小尾巴

这篇文章只是最简单的实现了一下 Anycast,关于路由优化、节点健康检查、节点同步什么的有兴趣的可以自己研究一下

搭建一个属于自己的 Anycast 递归 DNS

https://www.9bingyin.com/archives/build-an-anycast-recursive-dns.html

作者

bingyin

发布时间

2023-05-20

许可协议

CC BY 4.0

添加新评论