本文将演示如何使用systemd-resolved在Fedora操作系统上通过TLS配置DNS。

前言

现代计算机用来在Internet上查找资源的域名系统(DNS)是很旧以前设计的,没有考虑用户隐私,它面临安全风险和DNS劫持之类的攻击,它还允许ISP拦截查询。

幸运的是,可以使用基于TLS的DNS和DNSSEC。TLS和DNSSEC上的DNS允许创建从计算机到其配置的DNS服务器的安全且加密的端到端隧道,在Fedora操作系统上,实现这些技术的步骤很容易,并且所有必要的工具也很容易获得。

步骤1:设置systemd-resolved

修改/etc/systemd/resolved.conf,使其类似于以下所示,确保启用基于TLS的DNS并配置要使用的DNS服务器的IP地址:

$ cat /etc/systemd/resolved.conf

[Resolve]

DNS=1.1.1.1 9.9.9.9

DNSOverTLS=yes

DNSSEC=yes

FallbackDNS=8.8.8.8 1.0.0.1 8.8.4.4

#Domains=~.

#LLMNR=yes

#MulticastDNS=yes

#Cache=yes

#DNSStubListener=yes

#ReadEtcHosts=yes

关于选项的简要说明:

DNS:以空格分隔的IPv4和IPv6地址列表,用作系统DNS服务器。

FallbackDNS:用作后退DNS服务器的IPv4和IPv6地址的空格分隔列表。

Domains:解析单标签主机名~时,这些域用作搜索后缀,代表使用DNS= 定义的系统DNS服务器,最好用于所有域。

DNSOverTLS:如果为true,则将加密与服务器的所有连接。请注意,此模式要求DNS服务器支持TLS上的DNS,并具有其IP的有效证书。

注意:上面示例中列出的DNS服务器是我个人的选择,您应该确定要使用的DNS服务器。

步骤2:使NetworkManager将信息推送到systemd-resolved

在/etc/NetworkManager/conf.d中创建一个名为10-dns-systemd-resolved.conf的文件:

$ cat /etc/NetworkManager/conf.d/10-dns-systemd-resolved.conf

[main]

dns=systemd-resolved

上面显示的设置(dns=systemd-resolved)使NetworkManager将从DHCP获得的DNS信息推送到systemd-resolved服务,这将覆盖在步骤1中配置的DNS设置,这在受信任的网络上很好,但是可以设置dns=none来使用/etc/systemd/resolved.conf中配置的DNS服务器。

第三步:启动和重启服务

要使前面步骤中配置的设置生效,请启动并启用systemd-resolved,然后重新启动NetworkManager。

注意:重新启动NetworkManager时,这将导致失去连接几秒钟:

$ sudo systemctl start systemd-resolved

$ sudo systemctl enable systemd-resolved

$ sudo systemctl restart NetworkManager

注意:当前,默认情况下禁用systemd解析的服务,并且该服务的使用是可选的,不过在Fedora 33中有计划默认启用systemd-resolved。

步骤4:检查一切是否正常

现在,您应该使用基于TLS的DNS,通过使用以下方法检查DNS解析状态来确认这一点:

$ resolvectl status

如下图所示:

64731274c45ccf072100349821e3a423.png

/etc/resolv.conf应指向127.0.0.53:

$ cat /etc/resolv.conf

# Generated by NetworkManager

search lan

nameserver 127.0.0.53

要查看systemd-resolved正在发送和接收安全查询的地址和端口,请运行:

$ sudo ss -lntp | grep '\(State\|:53 \)'

9c9920199172b1161e27f2348607edc4.png

要进行安全查询,请运行:

$ resolvectl query fedoraproject.org

9875c4304084f3b33ed0b2aad87cc5fd.png

步骤5:使用Wireshark验证配置

首先,安装并运行Wireshark:

$ sudo dnf install wireshark

$ sudo wireshark

它将询问您必须在哪个链接设备上开始捕获数据包,就我而言,因为我使用无线接口,所以我将继续使用wlp58s0,在Wireshark中设置一个过滤器,例如tcp.port == 853(853是TLS协议端口上的DNS),您需要先刷新本地DNS缓存,然后才能捕获DNS查询:

$ sudo resolvectl flush-caches

现在运行:

$ nslookup fedoramagazine.org

您应该在计算机和配置的DNS服务器之间看到经过TLS加密的交换,如下图:

7ad7dc99f50cca85ab80f97640ba444c.png

相关主题

Logo

更多推荐