ubuntu 解决 DNS 代理设置错误,导致不能上网的 DoH、DoT问题
老旧的 udp dns明文查询,早就被 doh ,dot取代了。优选 doh,更自在。
但目前的现状是 3种 DNS 传输协议 udp / doh / dot 同时存在。
未来,如何选择?
- 测试: udp dns:简单方便
- 内网:dot:方便管理
- 外网:doh,DoQ 自在
DoQ (DNS over QUIC):
DoQ是一种新兴的技术,它结合了DNS查询和QUIC协议的优势。QUIC是一个基于UDP的多路复用传输协议,它减少了连接建立时间,并提供了更好的性能和加密支持。DoQ旨在进一步提升DNS查询的效率和隐私性。 DoH, DoT, DoQ 的区别 - DNS-WIKI
再未来 DoX :变是永远的不变。
优缺点
- DNS
- 优点:原生支持,广泛部署,无需额外配置。
- 缺点:明文传输,容易受到篡改和监听。
- DoH
- 优点:与HTTPS流量不可区分,难以被审查,易于绕过某些网络限制。
- 缺点:可能与现有的网络基础设施(如中间件、缓存)存在兼容性问题。
- DoT
- 优点:设计简洁,易于实现,提供端到端加密。
- 缺点:可被ISP或网络防火墙识别并阻止,因为使用了专用端口。
- DoQ
- 优点:减少连接延迟,提高传输效率,支持并发请求。
- 缺点:目前支持度不广,需要进一步测试和部署。
1.
abc@mpc:~$ sudo netstat -tulnp | grep ':53'
tcp6 0 0 :::53 :::* LISTEN 1/init
udp 0 0 0.0.0.0:5353 0.0.0.0:* 662/avahi-daemon: r
udp6 0 0 :::53 :::* 1/init
udp6 0 0 :::5353 :::* 662/avahi-daemon: r#
# 由于53 端口已经被占用了,所以运行下面 3句,是不会改变上面的结果的。
abc@mpc:~$ sudo systemctl stop systemd-resolved
abc@mpc:~$ sudo systemctl start systemd-resolved
2.
abc@mpc:~$ sudo lsof -i:53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 67u IPv6 8304 0t0 UDP *:domain
systemd 1 root 68u IPv6 6829 0t0 TCP *:domain (LISTEN)
systemd-t 554 systemd-timesync 12u IPv4 50483 0t0 UDP localhost:58362->127.0.0.53:domain
dnss 673 dnss 3u IPv6 6829 0t0 TCP *:domain (LISTEN)
dnss 673 dnss 8u IPv6 6829 0t0 TCP *:domain (LISTEN)
dnss 673 dnss 9u IPv6 8304 0t0 UDP *:domain
snapd 692 root 17u IPv4 51454 0t0 UDP localhost:36633->127.0.0.53:domain
firefox 4322 test 18u IPv4 53266 0t0 UDP localhost:33606->127.0.0.53:domain
firefox 4322 test 55u IPv4 52458 0t0 UDP localhost:34866->127.0.0.53:domain#
# dnss为官方仓库里就有的,一句简单命令就可以 doh 了,OK。但是,doh 被那啥了,国内的一些 doh可以使用。
路由器,DNS服务器,本质上都可以是中间人,只不过这个中间人到底是谁而已。
3.
abc@mpc:~$ sudo apt remove dnss
abc@mpc:~$ sudo netstat -tulnp | grep ':53'
udp 0 0 0.0.0.0:5353 0.0.0.0:* 662/avahi-daemon: r
udp6 0 0 :::5353 :::* 662/avahi-daemon: r
## stop dnss 即可,并不是一定要 remove
abc@mpc:~$ sudo systemctl stop systemd-resolved
abc@mpc:~$ sudo systemctl start systemd-resolved
- systemd-resolved 为 debian 系自带的域名服务器;使用 ip 为 127.0.0.53:53
- 127.0.0.1:53 给其他dns代理服务器使用的。
- dns查询顺序:先查询 systemd-resolved dns 127.0.0.53:53,无效、则查询 127.0.0.1:53 ?
当然,并不只是这里提到的,实际上,中间还有其他的查询路径,比如 hosts 文件 - 所以用户自己配置了dns服务器时,如需要使用自己的,则需要先停止系统自带的 systemd-resolved dns ?有些是代理软件自行设置,有些则需要用户自己设置。
应用程序发起 DNS 请求
├─ 1. 检查本地 `/etc/hosts` 文件(若域名存在则直接返回 IP)#自己也可以进行DNS劫持
├─ 2. 查询本地 DNS 缓存(如 `systemd-resolved` 或浏览器缓存)
├─ 3. 通过 `/etc/resolv.conf` 找到 DNS 服务器地址(默认指向 `127.0.0.53:53`)
│ ├─ 若使用 `systemd-resolved`:请求转发至 `127.0.0.53:53`(本地代理,OS自带?)
│ │ ├─ `systemd-resolved` 根据配置(`/run/systemd/resolve/resolv.conf`)│ │ │ 向外部 DNS 服务器发起查询
│ │ └─ 结果缓存并返回给应用程序
│ └─ 若手动绑定其他服务(如 `dnsmasq`,用户代理,不是系统默认自带的代理):│ 请求直接发往 `127.0.0.1:53`(需服务已监听此地址)
└─ 4. 外部 DNS 服务器响应,最终返回 IP 给应用程序
4.
abc@mpc:~$ sudo netstat -tulnp | grep ':53'
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 5360/systemd-resolv
udp 0 0 127.0.0.53:53 0.0.0.0:* 5360/systemd-resolv
udp 0 0 0.0.0.0:5353 0.0.0.0:* 662/avahi-daemon: r
udp6 0 0 :::5353 :::* 662/avahi-daemon: r
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 5360/systemd-resolv
系统自带的 DNS 服务,回来了。
OK