iptables:build立的stream量被丢弃

我有这样的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,我从这台机器发起的任何事情都失败了。 传入stream量仍然很好,SSH和Web服务器仍然可以从外部访问。 如果我将input策略更改为ACCEPT(并删除最后一个DROP规则,这只是为了testing),一切正常。 它看起来没有传入的ESTABLISHED / RELATEDstream量正在通过,注意在该行的开始处的零。 我做错了什么?

出于某种原因,连接跟踪对您来说不起作用(如通过您的基于conntrack的规则在input中没有处理单个数据包的事实所certificate的那样)。 这是因为你已经在某个地方设置了NOTRACK(唯一允许的地方就是原始表,所以iptables -t raw -nvL ),或者你没有在你的内核中加载conntrack模块,或者你禁用了它另一种方式。 你可以通过设置这样的规则来validation它:

 iptables -t filter -I INPUT 1 -m conntrack --ctstate UNTRACKED -j LOG 

这会给你所有没有被追踪的数据包的包计数器(不影响别的)。 不要把这个数据发送到系统日志太久,但在这种情况下,这是最好的select。

我不相信iptables会允许你指定基于conntrack的规则,而不用加载conntrack,但是你可以通过执行lsmod | grep conntrack lsmod | grep conntrack并寻找这些模块:

 nf_conntrack_ipv4 nf_conntrack 

否则,你可能会有一个内核错误或什么的。

另外值得一提的是,通常DNS查询是通过udp / 53而不是tcp / 53来进行的。 但是,您的规则接受related,established在input数据包应该照顾您的DNS查询需求。