linux – 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流量通过,注意该行开头的零.我做错了什么?

解决方法

由于某种原因,连接跟踪对您不起作用(由输入中基于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查询需求.

相关文章

1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...
1 删除0字节文件 find -type f -size 0 -exec rm -rf {} ...
## 步骤 1:安装必要的软件包 首先,需要确保系统已安装 `dh...