我正在管理的 Web 服务器显示奇怪的 iptables 拒绝来自目标端口 443 上的 IPv4 地址,尽管明确允许 HTTPS 流量。同一规则中也允许使用端口 80,但该站点仅支持 HTTPS,并且 nginx 会立即将 80 重定向到 443。
事情是:浏览网站的作品。您可以加载所有页面,所有资源都很好等等。但是这里显然有些不对劲,这可能会损害页面加载性能。
/var/log/iptables_deny.log
以下是分别针对端口 443 和 80登录的一些错误示例。tail -f
根据我在日志文件中的判断,这些可以单独出现,也可以突然出现。绝大多数用于端口 443:
iptables denied: IN=eth0 OUT= MAC=f2:3c:91:26:1e:1f:84:78:ac:0d:8f:41:08:00 SRC=(redacted IP) DST=(redacted IP) LEN=40 TOS=0x08 PREC=0x00 TTL=53 ID=61266 DF PROTO=TCP SPT=49264 DPT=443 WINDOW=0 RES=0x00 RST URGP=0
iptables denied: IN=eth0 OUT= MAC=f2:3c:91:26:1e:1f:84:78:ac:0d:8f:41:08:00 SRC=(redacted IP) DST=(redacted IP) LEN=40 TOS=0x00 PREC=0x00 TTL=115 ID=11186 DF PROTO=TCP SPT=58445 DPT=443 WINDOW=254 RES=0x00 ACK FIN URGP=0
iptables denied: IN=eth0 OUT= MAC=f2:3c:91:26:1e:1f:84:78:ac:0d:8f:41:08:00 SRC=(redacted IP) DST=(redacted IP) LEN=40 TOS=0x00 PREC=0x00 TTL=116 ID=16941 DF PROTO=TCP SPT=16278 DPT=80 WINDOW=255 RES=0x00 ACK FIN URGP=0
快速 grepping 说拒绝中的数据包类型至少可以是 ACK、ACK FIN、ACK RST、ACK PSH 和 RST。也许是其他人,但他们没有引起我的注意。
下面是 iptables -nvL 的输出。基本模式(首先允许所有相关和建立,然后允许 80 和 443 上的所有新流量)根据我所阅读的所有内容应该是可靠的。LOG & DROP 规则是 INPUT 链中的最后一个,它们应该是。
Chain INPUT (policy ACCEPT 1 packets, 391 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
8893 770K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * (redacted IP) 0.0.0.0/0 ctstate NEW tcp dpt:22
0 0 ACCEPT tcp -- * * (redacted IP) 0.0.0.0/0 ctstate NEW tcp dpt:22
0 0 ACCEPT tcp -- * * (redacted IP) 0.0.0.0/0 ctstate NEW tcp dpt:22
0 0 ACCEPT tcp -- * * (redacted IP) 0.0.0.0/0 ctstate NEW tcp dpt:22
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
63 3840 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 ctstate NEW multiport dports 80,443
0 0 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:137
0 0 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:138
0 0 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:139
0 0 DROP udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:445
1 40 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 15/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
1 40 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
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 1 packets, 65 bytes)
pkts bytes target prot opt in out source destination
7311 19M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
实际的相关规则,如果它们在该输出之后有任何用处:
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 80,443 -j ACCEPT
很明显,总的来说,这不是恶意流量。我从几个不同的 IP 地址浏览了该站点,虽然该站点加载看起来不错,但我的 IP 也出现在拒绝日志中,没有任何我可以辨别的模式,并且浏览器中没有任何用户可见的错误情况。
任何想法这背后可能是什么?
RST 和 ACK,FIN 数据包是 TCP 连接尾端的一部分。
我的理解是
iptables
,出于安全原因,连接跟踪引擎采用了一种非常强大的方法来删除状态表条目:一旦它看到连接的一端试图将其关闭,那么(知道这样的请求表示结束连接,因为它的一端现在认为连接已关闭)它会删除已允许该连接流量的状态表条目。如果其他一些类似的防火墙也在路径中,阻止 RFC 指定的其余整理数据包,那么等待更长的时间来执行此操作可能是不安全的;在看到状态表条目之前延迟获取状态表条目可能会在一段时间内将无效条目留在表中,这将带来潜在的漏洞。
但是 RFC 指定了一些更多的整理工作,你看到的是那些被拒绝的数据包。是的,这意味着连接中的端点将使用更多内存,等待连接老化而不是看到完全关闭并能够更快地释放连接内存;但提高安全性通常需要资源,这是其中一种权衡。
那些永远不会通过的数据包没有任何害处,因此您可以放心地忽略日志条目。
编辑:如果您不想在日志中看到它们,请在日志行之前处理它们,例如