什么是 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,关于路由优化、节点健康检查、节点同步什么的有兴趣的可以自己研究一下