在Debian系统中,resolv.conf文件是配置DNS解析的关键,但它经常被网络管理服务或恶意软件篡改,导致DNS查询被劫持或泄露。要防止这种情况,你可以通过文件锁定、设置只读属性,并结合DNS-over-TLS(DoT)来加密DNS流量,确保解析过程的安全和隐私。下面我将详细解释如何一步步实现这些防护措施。

理解resolv.conf文件的作用与风险

resolv.conf位于/etc/resolv.conf,它定义了系统进行域名解析时使用的DNS服务器地址。默认情况下,Debian中的网络管理器(如systemd-resolved或NetworkManager)可能会动态更新这个文件,但这带来了风险:恶意软件或中间人攻击可以修改DNS设置,将流量重定向到恶意服务器,窃取你的数据。因此,固定DNS配置并防止篡改是首要任务。

锁定resolv.conf文件的方法

有几种方法可以保护resolv.conf不被修改。首先,你可以设置文件为只读属性,使用chattr命令来防止任何写入操作。例如,运行

sudo chattr +i /etc/resolv.conf

,这会添加不可变标志,即使root用户也无法修改。如果需要临时更改,先使用

sudo chattr -i /etc/resolv.conf

解除锁定。其次,禁用可能覆盖文件的网络服务,比如停用systemd-resolved:

sudo systemctl disable systemd-resolved.service

,并手动创建静态resolv.conf内容,指定可信的DNS服务器如Cloudflare(1.1.1.1)或Google(8.8.8.8)。

配置静态DNS解析设置

在锁定文件前,确保resolv.conf包含正确的DNS配置。编辑文件

sudo nano /etc/resolv.conf

,添加类似以下内容:

nameserver 1.1.1.1
nameserver 8.8.8.8
options edns0

这指定了两个公共DNS服务器,并启用了EDNS0扩展以提高解析效率。保存后,测试DNS解析是否正常:

ping example.com

,如果响应正常,说明配置生效。注意,如果使用DHCP,还需调整网络接口设置,避免覆盖。

引入DNS-over-TLS(DoT)增强安全

仅仅锁定文件还不够,因为传统的DNS查询是明文的,容易被监听。DNS-over-TLS(DoT)通过TLS加密将DNS请求安全地传输到服务器,防止中间人攻击。在Debian上,你可以使用stubby或systemd-resolved来实现DoT。例如,安装stubby:

sudo apt update && sudo apt install stubby

,然后编辑配置文件/etc/stubby/stubby.yml,设置DoT服务器如Cloudflare:

resolution_type: GETDNS_RESOLUTION_STUB
dns_transport_list:
  - GETDNS_TRANSPORT_TLS
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
tls_query_padding_blocksize: 128
edns_client_subnet_private: 1
round_robin_upstreams: 1
idle_timeout: 10000
listen_addresses:
  - 127.0.0.1
upstream_recursive_servers:
  - address_data: 1.1.1.1
    tls_auth_name: "cloudflare-dns.com"
  - address_data: 8.8.8.8
    tls_auth_name: "dns.google"

保存后重启服务:

sudo systemctl restart stubby

,并将resolv.conf的nameserver改为127.0.0.1,让系统通过本地stubby代理进行加密查询。

整合systemd-resolved与DoT的替代方案

如果你偏好使用systemd-resolved,它原生支持DoT。编辑/etc/systemd/resolved.conf,启用DoT并指定服务器:

[Resolve]
DNS=1.1.1.1 8.8.8.8
DNSOverTLS=yes
DNSSEC=yes

然后重启服务:

sudo systemctl restart systemd-resolved

,并检查状态:

systemd-resolve --status

。这样,所有DNS查询都会自动加密。注意,使用systemd-resolved时,resolv.conf通常是一个符号链接,需确保它指向/run/systemd/resolve/stub-resolv.conf以保持一致性。

监控和维护安全设置

部署防护后,定期检查resolv.conf是否被意外修改:

lsattr /etc/resolv.conf

,确认有'i'标志。同时,测试DoT是否工作,使用工具如kdig:

kdig @127.0.0.1 example.com

,查看响应是否加密。此外,保持系统更新:

sudo apt upgrade

,以修补潜在安全漏洞。对于生产环境,建议结合防火墙规则限制DNS端口(如53和853)的访问,只允许可信源。

总结与最佳实践建议

在Debian安全中,resolv.conf防篡改与DNS-over-TLS的结合,提供了从本地配置到网络传输的全方位保护。关键步骤包括:锁定resolv.conf文件、配置静态DNS、启用DoT加密,并选择适合的工具如stubby或systemd-resolved。这不仅防止了DNS劫持,还提升了隐私性。根据你的需求,如果追求简单,直接使用systemd-resolved的DoT功能;如果需更精细控制,stubby是更佳选择。记住,安全是一个持续过程,定期审计和更新配置才能应对新威胁。