要限制外部对内网DNS服务的访问,核心思路是只允许特定内网IP段访问53端口,通过zone绑定(如将DNS网卡绑定到internal区域)、移除public区域的dns服务、添加富规则精确控制源IP,并重载配置生效。

确认 DNS 服务已启用且绑定到正确区域
默认情况下,dns 服务会开放 TCP/UDP 53 端口。但若它被错误地加在 public 或 external 区域,就会对外暴露。应确保 DNS 仅对可信网络生效:
- 查看当前活跃区域及接口绑定:
firewall-cmd --get-active-zones - 查默认区域:
firewall-cmd --get-default-zone(生产环境建议设为public) - 将提供 DNS 服务的网卡(如
ens192)绑定到内部可信区域(如internal):firewall-cmd --permanent --zone=internal --add-interface=ens192 - 设置
internal区域允许 DNS:firewall-cmd --permanent --zone=internal --add-service=dns
禁止其他区域(如 public)访问 DNS
即使 DNS 未显式添加到 public,某些系统模板可能默认包含它。主动移除更稳妥:
- 从 public 区域移除 DNS 服务:
firewall-cmd --permanent --zone=public --remove-service=dns - 检查是否残留端口开放:
firewall-cmd --permanent --zone=public --list-ports | grep 53,如有则清除:firewall-cmd --permanent --zone=public --remove-port=53/tcpfirewall-cmd --permanent --zone=public --remove-port=53/udp
用富规则精确控制来源 IP
若需进一步细化(例如只允许 192.168.10.0/24 访问 DNS),可在 internal 区域中添加富规则,或在 public 区域中显式拒绝非授权访问:
- 在
internal区域允许指定子网访问 DNS:firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="dns" accept' - 在
public区域拒绝所有 DNS 请求(兜底防护):firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" service name="dns" reject'
重载并验证配置
所有 --permanent 操作后必须重载才能生效:
- 执行重载:
firewall-cmd --reload - 检查 internal 区域是否含 DNS 及来源规则:
firewall-cmd --zone=internal --list-all - 从外网机器测试:
dig @your-server-ip example.com应超时或被拒;
从内网机器测试应正常返回结果


















