云服务器下 Ubuntu 18 正确的 DNS 修改
一、起因
Netflix DNS 分流实际上我目前的方案是通过 CoreDNS 作为主 DNS Server,然后在 CoreDNS 上针对 Netflix 全部域名解析 forward 到一台国外可以解锁 Netflix 机器上;如果直接将 CoreDNS 暴露在公网,那么无疑是在作死,为 DNS 反射 DDos 提供肉鸡;所以想到的方案是自己编写一个不可描述的工具,本地 Client 到 Server 端以后,Server 端再去设置到 CoreDNS 做分流;其中不可避免的需要调整 Server 端默认 DNS。
二、已废弃修改方式
目前大部份人还是习惯修改 /etc/resolv.conf
配置文件,这个配置文件上面已经明确标注了不要去修改它;因为自 Systemd 一统江山以后,系统 DNS 已经被 systemd-resolved
服务接管;一但修改了 /etc/resolv.conf
,机器重启后就会被恢复;所以根源解决方案还是需要修改 systemd-resolved
的配置。
三、netplan 的调整
在调整完 systemd-resolved
配置后其实有些地方仍然是不生效的;原因是 Ubuntu 18 开始网络已经被 netplan 接管,所以问题又回到了如何修改 netplan;由于云服务器初始化全部是由 cloud-init 完成的,netplan 配置里 IP 全部是由 DHCP 完成;那么直接修改 netplan 为 static IP 理论上可行,但是事实上还是不够优雅;后来研究了一下其实更优雅的方式是覆盖掉 DHCP 的某些配置,比如 DNS 配置;在阿里云上配置如下(/etc/netplan/99-netcfg.yaml
)
1 |
|
修改完成后执行 netplan try
等待几秒钟,如果屏幕的读秒倒计时一直在动,说明修改没问题,接着回车既可(尽量不要 netplan apply
,一旦修改错误你就再也连不上了…)
四、DNS 分流
顺便贴一下 CoreDNS 配置吧,可能有些人也需要;第一部分的域名是目前我整理的 Netflix 全部访问域名,针对这些域名的流量转发到自己其他可解锁 Netflix 的机器既可
1 |
|
五、关于 docker
当 netplan 修改完成后,只需要重启 docker 既可保证 docker 内所有容器 DNS 请求全部发送到自己定义的 DNS 服务器上;请不要尝试将自己的 CoreDNS 监听到 127.*
或者 ::1
上,这两个地址会导致 docker 中的 DNS 无效,因为在 libnetwork 中针对这两个地址做了过滤,并且 FilterResolvDNS
方法在剔除这两种地址时不会给予任何警告日志