目录

ubuntu-解决-DNS-代理设置错误,导致不能上网的-DoHDoT问题

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查询的效率和隐私性。

再未来 DoX :变是永远的不变。

优缺点

  • DNS
    • 优点:原生支持,广泛部署,无需额外配置。
    • 缺点:明文传输,容易受到篡改和监听。
  • DoH
    • 优点:与HTTPS流量不可区分,难以被审查,易于绕过某些网络限制。
    • 缺点:可能与现有的网络基础设施(如中间件、缓存)存在兼容性问题。
  • DoT
    • 优点:设计简洁,易于实现,提供端到端加密。
    • 缺点:可被ISP或网络防火墙识别并阻止,因为使用了专用端口。
  • DoQ
    • 优点:减少连接延迟,提高传输效率,支持并发请求。
    • 缺点:目前支持度不广,需要进一步测试和部署。

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

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服务器,本质上都可以是中间人,只不过这个中间人到底是谁而已。

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 给应用程序‌

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