我正在尝试将 iptables 配置为DNS服务器DROP
的默认策略,但是出现了问题。INPUT
OUTPUT
这是我的 iptables 脚本
iptables -P INPUT DROP
iptables -I INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -P OUTPUT DROP
iptables -I OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --sport 53 -j ACCEPT
有一些数据包丢失,因为依赖于此服务 dns 的计算机仅在 iptables 被清理后才进行导航。我哪里做错了?
答案1
如果您的策略是“仅允许对服务器进行入站 DNS 查询以及对 IPv4 服务器进行 DNS 应答”,则您的规则集看起来不错。但这可能不是您想要的。例如,该策略意味着您的 DNS 服务器有一个神奇的本地数据库,可用于应答所有 DNS 查询。
一些有根据的猜测可能导致了这些问题:
当您的 DNS 服务器尝试回答客户端的某个查询时,它是否需要执行递归 DNS 查询?如果是,则您应该允许这样做(从 DNS 服务器发出传出的 DNS 查询)。
您的一些客户端是否使用 IPv6 来查询 DNS。我假设您的服务器没有针对 IPv6 设置防火墙?
由于服务器以递归方式使用 IPv6 进行查询,因此您的某些客户端的 IPv4 查询是否能够正常工作?
您的接口是否比
eth0
和更多lo
?您的服务器是否因为 iptables 阻止而无法发送/接收某些 ICMP 错误消息?如果出于某种原因,某些客户端可能需要 IPv4 分段或存在 MTU 问题,您的客户端将无法解决此问题,因为您的服务器不会通过 ICMP 通知他们。
另外:您可能希望允许您的服务器获取系统更新。此外,您希望您的服务器能够响应某些 ICMP 请求,并且您肯定需要您的服务器能够处理 IPv6 的 ICMP。
编辑:尝试这个(你可能想要微调 icmp 处理):
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT
COMMIT