Linux禁用IPv6、禁用resolvconf、启用systemd-resolved、启用DoT

Linux禁用IPv6、禁用resolvconf、启用systemd-resolved、启用DoT的完整步骤

前情提要:把主机名写入/etc/hostname/etc/hosts

一、禁用 IPv6

  1. 禁用 IPv6

    编辑 sysctl.conf 文件以禁用所有 IPv6:

    1
    sudo vim /etc/sysctl.conf

    添加以下内容以禁用 IPv6:

    1
    2
    3
    4
    # 禁用 IPv6
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    net.ipv6.conf.lo.disable_ipv6 = 1

    保存并退出编辑器。

  2. 应用设置

    运行以下命令使配置生效:

    1
    sudo sysctl -p
  3. 验证 IPv6 是否已禁用

    执行以下命令来确认没有 IPv6 地址:

    1
    ip a

    预期结果

    • 输出中不应显示任何带 inet6 的地址,表示 IPv6 已被禁用。

二、删除 resolvconf 并启用 systemd-resolved

  1. 删除 resolvconf

    为了彻底移除旧的 resolvconf 工具,使用 apt 完全卸载它:

    1
    sudo apt purge resolvconf
  2. 删除旧的 /etc/resolv.conf 符号链接

    删除 /etc/resolv.conf 文件的符号链接,确保系统使用 systemd-resolved 提供的配置文件:

    1
    sudo rm /etc/resolv.conf
  3. 启用并启动 systemd-resolved 服务

    确保 systemd-resolved 服务已经启用并启动:

    1
    2
    sudo systemctl enable systemd-resolved
    sudo systemctl start systemd-resolved
  4. 验证 systemd-resolved 服务状态

    确认 systemd-resolved 正常运行:

    1
    sudo systemctl status systemd-resolved

    预期结果

    • 服务状态应为 active (running),表示 systemd-resolved 正在后台运行。

三、配置 systemd-resolved 使用 DNS-over-TLS (DoT)

  1. 配置 DNS 服务器并启用 DoT

    编辑 systemd-resolved 配置文件 /etc/systemd/resolved.conf

    1
    sudo vim /etc/systemd/resolved.conf

    [Resolve] 部分,配置 DNS 服务器,并启用 DNS-over-TLS:

    1
    2
    3
    4
    5
    6
    [Resolve]
    DNS=1.1.1.1 8.8.8.8
    DNSOverTLS=yes
    LLMNR=no
    MulticastDNS=no
    DNSStubListener=yes

    保存并关闭文件。

  2. 重启 systemd-resolved 服务

    使配置生效:

    1
    sudo systemctl restart systemd-resolved

四、设置 /etc/resolv.conf

  1. 创建符号链接 /etc/resolv.conf

    由于 /etc/resolv.conf 文件已经被删除,需要创建一个新的符号链接,指向 systemd-resolved 提供的配置:

    1
    sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
  2. 验证 /etc/resolv.conf 内容

    运行以下命令,确认 /etc/resolv.conf 是否正确指向 systemd-resolved 的 stub resolver:

    1
    cat /etc/resolv.conf

    预期输出

    1
    2
    nameserver 127.0.0.53
    options edns0 trust-ad

五、测试 DNS 配置

  1. 安装 dnsutils

    1
    sudo apt install dnsutils
  2. 使用 dig 命令测试 DNS 查询

    查询 google.com 的 IPv4 地址:

    1
    dig google.com

    查询 google.com 的 IPv6 地址:

    1
    dig AAAA google.com

    预期输出

    • 查询的结果应返回正确的 IP 地址。
    • SERVER 字段应显示为 127.0.0.53,表示 DNS 查询通过 systemd-resolved 处理。

六、验证 DNS-over-TLS 是否生效

  1. 使用 tcpdump 捕获端口 53 的流量

    使用 tcpdump 捕获端口 53 的流量,看看是否只有 localhost 的流量(这表示 DNS 查询在本地通过 systemd-resolved 处理,而没有通过外部 DNS 服务器)。

    运行以下命令:

    1
    sudo tcpdump -i any port 53
  2. 使用 tcpdump 捕获端口 853 的流量

    运行 tcpdump 来捕获端口 853 上的流量,这通常是 DNS-over-TLS 的默认端口:

    1
    sudo tcpdump -i any port 853

    这会显示通过端口 853(DNS-over-TLS)发送的流量。因为 DoT 是加密的,流量内容是不可见的,但你可以看到流量的元数据和通信的目标 IP。

  3. 运行 dig 查询

    在另一个终端中,运行以下命令测试 DNS 查询:

    1
    dig google.com

    预期结果

    • tcpdump 捕获端口 53 的流量输出应显示只有 localhost (127.0.0.53) 的流量,表示 DNS 查询通过 systemd-resolved 本地解析。
    • 如果 DNS-over-TLS 成功启用,捕获端口 53 的流量不会显示到外部 DNS 服务器的 IP 地址,而是会显示在本地 53 端口的流量。

七、清空 DNS 缓存(可选)

如果你想清空 systemd-resolved 的 DNS 缓存,可以使用以下命令:

1
sudo resolvectl flush-caches