我有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流量通过,注意该行开头的零.我做错了什么?
解决方法
由于某种原因,连接跟踪对您不起作用(由输入中基于conntrack的规则没有处理单个数据包的事实证明).这是因为你已经在某处设置了NOTRACK(唯一允许的是原始表,所以iptables -t raw -nvL也是如此),或者因为你没有在你的内核中加载conntrack模块,或者你已经禁用了它另一种方式.您可以通过设置如下规则来验证这一点:
iptables -t filter -I INPUT 1 -m conntrack --ctstate UNTRACKED -j LOG
这将为您提供所有未通过conntrack跟踪的数据包的数据包计数器(不会影响其他任何内容).不要将其保留太长时间,因为它会将数据发送到syslog(但在这种情况下,它是非决定性规则的最佳选择).
我不相信iptables会允许你在没有加载conntrack的情况下指定基于conntrack的规则,但你可以通过执行lsmod来验证这一点. grep conntrack并寻找这些模块:
nf_conntrack_ipv4 nf_conntrack
否则你可能有内核错误或其他什么.
值得一提的是,通常DNS查询是通过udp / 53而不是tcp / 53进行的.但是,您在输入中接受相关的已建立数据包的规则应该考虑您的DNS查询需求.