文章背景图

Linux DNS 与网络实践:BIND9、dnsmasq、SNAT、DNAT 和排障

2026-07-25
4
-
- 分钟

DNS 与 NAT 问题常被误判为应用故障。排查时要区分名称解析、路由、过滤和地址转换四层。

## DNS 查询链路

```bash

resolvectl status

cat /etc/resolv.conf

dig example.com

dig @DNS_SERVER example.com +trace

getent hosts example.com

```

应用使用的解析器可能与 dig 不同,因此同时测试 getent。容器、VPN、systemd-resolved 和 NetworkManager 也可能生成 resolv.conf。

## BIND9 权威或缓存服务

配置 zone 后先检查:

```bash

named-checkconf

named-checkzone example.internal /etc/bind/db.example.internal

systemctl reload bind9

dig @127.0.0.1 host.example.internal A

```

每次修改 zone 都要增加 SOA serial。生产至少配置主从、限制 zone transfer 和 recursion 来源,并根据场景启用 DNSSEC。不要部署面向公网的开放递归解析器。

## dnsmasq

适合小型网络的 DNS 缓存和 DHCP。配置简单,但要限制监听接口、上游 DNS 和客户端网段,避免与 systemd-resolved 或其他 DHCP 服务抢占端口。

## SNAT 与 DNAT

- SNAT 修改源地址,常用于内网出站。

- MASQUERADE 是动态出口地址场景的 SNAT 形式。

- DNAT 修改目标地址,常用于端口转发。

启用转发并使用 nftables/发行版工具持久化规则。概念示例:

```bash

sysctl net.ipv4.ip_forward

nft list ruleset

ip route

ip rule

conntrack -L

```

不要直接复制陌生 iptables 规则到生产。先确认接口、源网段、目标服务、回程路由和防火墙策略;NAT 成功仍要求回包能回到同一转换节点。

## 网络排障顺序

1. ip addr 检查地址与链路。

2. ip route get TARGET 检查选路。

3. ss -lntup 检查服务监听。

4. dig/getent 检查名称解析。

5. pingtracepathnc 分层测试。

6. nft list ruleset 检查过滤与 NAT。

7. tcpdump -ni any 在入口、出口观察请求与回包。

抓包可能包含敏感数据,应限制保存、访问和保留时间。

## 安全基线

- DNS 仅向授权客户端开放递归。

- zone transfer 只允许指定从服务器。

- 管理接口不暴露公网。

- NAT 规则使用明确源、目标、协议和端口。

- 变更前导出当前规则,并准备带外回滚。

- 重启后验证配置持久化。

参考:https://ubuntu.com/server/docs/how-to/networking/install-dns/

原创

Linux DNS 与网络实践:BIND9、dnsmasq、SNAT、DNAT 和排障

本文链接: Linux DNS 与网络实践:BIND9、dnsmasq、SNAT、DNAT 和排障

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录