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. ping、tracepath、nc 分层测试。
6. nft list ruleset 检查过滤与 NAT。
7. tcpdump -ni any 在入口、出口观察请求与回包。
抓包可能包含敏感数据,应限制保存、访问和保留时间。
## 安全基线
- DNS 仅向授权客户端开放递归。
- zone transfer 只允许指定从服务器。
- 管理接口不暴露公网。
- NAT 规则使用明确源、目标、协议和端口。
- 变更前导出当前规则,并准备带外回滚。
- 重启后验证配置持久化。
参考:https://ubuntu.com/server/docs/how-to/networking/install-dns/