我们在 Debian Lenny 系统上运行了带有 iptables 的防火墙。我仅向您展示了防火墙的相关条目。
Chain INPUT (policy DROP 0 packets, 0 bytes)
target prot opt in out source destination
ACCEPT all -- lo * 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
ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
target prot opt in out source destination
ACCEPT all -- * lo 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
LOGDROP all -- * * 0.0.0.0/0 0.0.0.0/0
每天都会有一些数据包被丢弃,并出现如下日志消息:
2 月 5 日 15:11:02 host1 内核:[104332.409003] 丢弃 IN= OUT=eth0 SRC=<OWN_IP> DST=<REMOTE_IP> LEN=1420 TOS=0x00 PREC=0x00 TTL=64 ID=18576 DF PROTO=TCP SPT=80 DPT=59327 WINDOW=54 RES=0x00 ACK URGP=0
出于隐私原因,我用 <OWN_IP> 和 <REMOTE_IP> 替换了 IP 地址
这没什么好担心的,我只是想了解发生了什么。Web 服务器尝试向客户端发送一个数据包,但防火墙不知何故得出结论,认为该数据包与任何先前的流量“无关”。
我已经将内核参数 ip_conntrack_ma 设置为足够高的值,以确保 iptables 状态模块跟踪所有连接:
sysctl -w net.ipv4.netfilter.ip_conntrack_max=524288
有趣的是,我每 20 分钟就会断开一次连接:
06:34:54
06:52:10
07:10:48
07:30:55
07:51:29
08:10:47
08:31:00
08:50:52
09:10:50
09:30:52
09:50:49
10:11:00
10:30:50
10:50:56
11:10:53
11:31:00
11:50:49
12:10:49
12:30:50
12:50:51
13:10:49
13:30:57
13:51:01
14:11:12
14:31:32
14:50:59
15:11:02
这是今天的情况,但在其他日子也看起来像这样(有时比率会有所不同)。
可能是什么原因呢?
非常感谢您的帮助。 问候 Janning
答案1
我在自己的系统上看到了非常类似的问题,并且我可能知道发生了什么。
显然,TCP 允许客户端发送 FIN 数据包,并允许您确认该 FIN 数据包,但仍保持您这端的连接打开并通过它推送更多数据,并在将来的某个时间发送您自己的 FIN 数据包。我记得读到过这是在内核 2.6 中的某个时刻实现的,尽管我对这一点的记忆可能不准确/不相关。
许多防火墙(包括 IPTables)似乎尚未实现此功能或错误地实现了此功能,只要看到 FIN 后跟 ACK,就会认为连接已关闭。结果就是,我的服务器时不时会向客户端发送一个数据包,而防火墙认为该数据包不是已建立连接的一部分,也不是新数据包,因此会将其丢弃。
实际上,我没有在最后丢弃的几个数据包中看到任何重要数据,因此其效果是一些额外的重置数据包被丢弃,一些额外的连接处于 FIN_WAIT 状态,但没有损坏或半加载的页面。
我不知道您看到的 20 分钟计时,但我猜测它是某种客户端,每 20 分钟定期运行一次,并发出请求,导致您的服务器执行 FIN ACK PSH FIN RST 序列。
这篇文章可能会提供有关 IPTables 丢弃这些数据包的具体原因的更多信息:http://lists.netfilter.org/pipermail/netfilter/2005-August/062059.html
按照 Chris Brenton 的说法,这是由于客户端、服务器和防火墙在单侧关闭状态下对数据包的超时不匹配造成的。
答案2
原始/源 IP 是否显示在日志输出中?如果是,该 IP 是否在 http 日志中显示任何有效请求?也许某种监控系统正在检查您服务器上的 http,因为您说它是以一致的间隔进行的。只是随便说说而已。
答案3
如果有人试图通过发送 ACK 数据包来扫描您,并且您的防火墙需要 STATE(已建立的连接),它将被丢弃。
无状态防火墙仅丢弃传入的 SYN 数据包并让 ACK 通过。这意味着即使端口被阻止,您也可以在防火墙后面进行扫描。如何扫描?由于无法识别 ACK,系统将正常运行并发送 RST(RESET)数据包,告诉您我们没有连接。您现在知道有东西正在监听该端口。
查看您提供的信息,确实有一个 ACK 数据包被丢弃。
您可以使用以下方法确认nmap(从外部系统):
nmap -sA -p80 your_ip
答案4
我不明白的是:为什么 iptables 日志消息会显示数据包被丢弃,而传出,而后一个日志显示数据包丢失进入?
我怀疑你可能有两个不同的问题。也许有人试图欺骗你的地址,因此 iptables 捕获了与(欺骗地址)无关的回复并将其丢弃。这将覆盖传出的丢弃。
关于传入丢包,20 分钟的时间间隔很可疑。也许是 ARP?某种 DHCP 身份验证。20 分钟是 1200 秒;也许有 3 个单独的链正在进行,每个链加起来为 3600(默认 DHCP 租约时间),但您只能看到单个数据包。只是一个提示。