为什么某些 TCP 重置数据包会出现在我的 iptables 日志中?

tar*_*leb 6 iptables tcp

我开始在我的 Debian Jessie 服务器上添加一些基本的 iptables 规则。我的目标是过滤和记录网络流量(出于安全和学习目的)。不考虑 ICMP 数据包,这些是我正在使用的规则:

# INPUT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -j REJECT --reject-with tcp-reset

# OUTPUT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -m limit -j LOG --log-prefix "UNKNOWN_OUTGOING: " --log-level 5
Run Code Online (Sandbox Code Playgroud)

对于 INPUT 和 OUTPUT,策略都设置为 ACCEPT。

现在日志经常列出传出的RST数据包,通常是80端口。这里的SRC IP属于我的服务器,目的IP被部分编辑掉,不泄露其他人的活动。

Aug 14 11:48:37 reynholm kernel: [81795.100496] UNKNOWN_OUTGOING: IN= OUT=ifext SRC=89.238.65.123 DST=108.162.[edited] LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=3594 DPT=80 WINDOW=0 RES=0x00 RST URGP=0
Run Code Online (Sandbox Code Playgroud)

我不明白是什么原因造成的,除了 SSH 和 MTA 之外没有其他应用程序在运行。是不是因为我的输入拒绝规则?但是这些数据包不应该由输出状态规则处理吗?

下面是这些数据包之一的捕获以及显然触发它的连接尝试。在我的服务器之间和108.162.[edited]在此之前没有发送数据包。

11:48:37.860337 IP (tos 0x0, ttl 60, id 0, offset 0, flags [DF], proto TCP (6), length 44)
    108.162.[edited].80 > 89.238.65.123.3594: Flags [S.], cksum 0x79bb (correct), seq 79911989, ack 235561828, win 29200, options [mss 1460], length 0
        0x0000:  4500 002c 0000 4000 3c06 7342 6ca2 0000  E..,..@.<.sBl...
        0x0010:  59ee 417b 0050 0e0a 04c3 5c35 0e0a 6364  Y.A{.P....\5..cd
        0x0020:  6012 7210 79bb 0000 0204 05b4 0000       `.r.y.........
11:48:37.860408 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    89.238.65.123.3594 > 108.162.[edited].80: Flags [R], cksum 0x648e (correct), seq 235561828, win 0, length 0
        0x0000:  4500 0028 0000 4000 4006 6f46 59ee 417b  E..(..@.@.oFY.A{
        0x0010:  6ca2 0000 0e0a 0050 0e0a 6364 0000 0000  l......P..cd....
        0x0020:  5004 0000 648e 0000                      P...d...
Run Code Online (Sandbox Code Playgroud)

cas*_*sey 7

TCP RST 数据包的创建来自您的规则

-A INPUT -p tcp -j REJECT --reject-with tcp-reset
Run Code Online (Sandbox Code Playgroud)

默认策略(在您的情况下为 ACCEPT)仅适用于与您的链中的任何规则都不匹配的数据包。如果数据包符合上述规则与 REJECT 目标,它将不受默认策略的约束,并将被拒绝(并生成 TCP RST)而不是接受。

此 TCP RST 与您的规则不匹配:

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

因为它与另一个已建立的连接无关,也不是已建立的连接的一部分。它将继续通过您的规则和匹配

-A OUTPUT -m limit -j LOG --log-prefix "UNKNOWN_OUTGOING: " --log-level 5
Run Code Online (Sandbox Code Playgroud)

并最终出现在您的日志中。如果您不想记录这些 RST 数据包,请调整此规则以不匹配它们,或者插入较早的规则以匹配 RST 数据包等,以便在它们到达此处之前进行匹配。


我注意到的另一件事是,您记录的第一个数据包是来自远程网络服务器的 SYN/ACK 数据包,它看起来像是从远程网络服务器到您之前发送以开始连接到 SYN 数据包的响应数据包端口 80 上的远程主机。如果您没有发送初始 SYN,我认为该连接不会匹配“ESTABLISHED”,但是如果您确实发送了 SYN,那么我认为该连接应该是“ESTABLISHED”。这可能会弄乱您的 RST 最终匹配的规则。