我已经像这样设置了 iptables:
# iptables -L -nv
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
13925 8291K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
8153 2431K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 22,25,53,80,443
482 98621 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
5057 3382K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
但我无法从这台机器发出请求。DNS、HTTP,我从这台机器发起的任何操作都失败了。传入流量仍然正常,SSH 和 Web 服务器仍然可以从外部访问。如果我将输入策略更改为 ACCEPT(并删除最后一个 DROP 规则,它只是为了测试而存在的),一切都会正常。看起来没有传入的 ESTABLISHED/RELATED 流量通过,请注意该行开头的零。我做错了什么?
答案1
由于某种原因,连接跟踪无法正常工作(事实表明,输入中没有一个数据包被基于 conntrack 的规则处理)。这是因为您在某处设置了 NOTRACK(唯一允许这样做的地方是原始表,所以这样做iptables -t raw -nvL
),或者因为您没有在内核中加载 conntrack 模块,或者您已通过其他方式禁用它。您可以通过设置如下规则来验证这一点:
iptables -t filter -I INPUT 1 -m conntrack --ctstate UNTRACKED -j LOG
这将为您提供所有未被 conntrack 跟踪的数据包的数据包计数器(不会影响其他任何内容)。不要让该选项打开太久,因为它会将数据发送到系统日志(但在这种情况下,这是非决定性规则的最佳选择)。
我不相信 iptables 会允许您在未加载 conntrack 的情况下指定基于 conntrack 的规则,但您可以通过执行lsmod | grep conntrack
并查找以下模块来验证这一点:
nf_conntrack_ipv4
nf_conntrack
否则你可能遇到了内核错误或者其他问题。
还值得一提的是,DNS查询通常是通过udp/53而不是tcp/53进行的。但是,您接受related,established
输入数据包的规则应该能够满足您的DNS查询需求。