iptables:已建立的流量被丢弃

iptables:已建立的流量被丢弃

我已经像这样设置了 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查询需求。

相关内容