我正在阅读有关连接跟踪的 Iptables 文档这里我在计算以下部分时遇到了困难,我强调了这一点:
tcp 6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \
dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \
dport=32775 [ASSURED] use=2
此示例包含 conntrack 模块维护的所有信息,以了解特定连接处于哪种状态。首先,我们有一个协议,在本例中为 tcp。接下来,是正常十进制编码中的相同值。 [...]最后,我们看看我们对返回数据包的期望。该信息详细说明了源 IP 地址和目标 IP 地址(两者都是颠倒的,因为数据包将被定向回我们)。连接的源端口和目标端口也是如此
我不明白为什么跟踪预期的 IP 和端口(如果它们只是颠倒)会有用。当数据包到达时,只需使用一对 IP 和端口即可完成查找,如果没有找到,则可以使用相同的字段但相反的字段来完成查找。保留这些信息是某种优化还是我错过了一些用例,这是实现某些目标的唯一方法?
谢谢
答案1
跟踪当前和预期状态很有用。当预期的 IP 和端口不只是反向反转时,它最有用。例如,当使用 NAT 时,或者当反向不完全相同时,就会发生这种情况。它还将在相关时验证状态转换是否得到遵守(例如:对于 TCP)一些示例:
从 192.0.2.2 进行简单 ping 后,预计回复将具有 ICMP 类型 0(回显回复),而不是初始类型 8(回显请求):
icmp 1 12 src=192.0.2.2 dst=8.8.8.8 type=8 code=0 id=26387 src=8.8.8.8 dst=192.0.2.2 type=0 code=0 id=26387 mark=0 use=1
主动(而不是被动)FTP 会话(通过 跟踪conntrack -E
)从位于公共 IP 198.51.100.32 的 NAT 路由器后面的主机 10.1.2.3 到 FTP 服务器 203.0.113.47。请注意,在回复中,需要路由器的 ip,而不是经过 NAT 处理(并且不可通过互联网路由)的 ftp 客户端的 ip。期望的创建被 SNAT(或 MASQUERADE)规则更改:
[NEW] tcp 6 120 SYN_SENT src=10.1.2.3 dst=203.0.113.47 sport=47800 dport=21 [UNREPLIED] src=203.0.113.47 dst=198.51.100.32 sport=21 dport=47800 helper=ftp
[UPDATE] tcp 6 60 SYN_RECV src=10.1.2.3 dst=203.0.113.47 sport=47800 dport=21 src=203.0.113.47 dst=198.51.100.32 sport=21 dport=47800 helper=ftp
[UPDATE] tcp 6 432000 ESTABLISHED src=10.1.2.3 dst=203.0.113.47 sport=47800 dport=21 src=203.0.113.47 dst=198.51.100.32 sport=21 dport=47800 [ASSURED] helper=ftp
ls
在期望条目与从客户端的 ftp PORT 命令计算出的目的地以及先前的 conntrack 条目(带有 nat)由 ftp 帮助程序添加到期望表中后,以允许流量通过(例如在进一步的帮助程序处理之前,使用防火墙中的相关规则。这可以在那里读取(但一旦匹配连接就会消失,这意味着这连接被看到,所以除非防火墙延迟,否则它实际上是不能被看到的):
# cat /proc/net/nf_conntrack_expect
295 l3proto = 2 proto=6 src=203.0.113.47 dst=198.51.100.32 sport=0 dport=41603 ftp
并由助手进一步更改(这里是 DNATed,仍然使用之前的 conntrack 条目来寻求帮助),最终获得这个新的跟踪连接:
[NEW] tcp 6 120 SYN_SENT src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 [UNREPLIED] src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20
[UPDATE] tcp 6 60 SYN_RECV src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20
[UPDATE] tcp 6 432000 ESTABLISHED src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20 [ASSURED]
[UPDATE] tcp 6 120 FIN_WAIT src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20 [ASSURED]
[UPDATE] tcp 6 60 CLOSE_WAIT src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20 [ASSURED]
[UPDATE] tcp 6 30 LAST_ACK src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20 [ASSURED]
[UPDATE] tcp 6 120 TIME_WAIT src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20 [ASSURED]
[DESTROY] tcp 6 src=203.0.113.47 dst=198.51.100.32 sport=20 dport=41603 src=10.1.2.3 dst=203.0.113.47 sport=41603 dport=20 [ASSURED]
这些期望条目都用于跟踪流量 (conntrack),例如,通过删除未跟踪的内容,可以轻松拥有状态防火墙(如果没有进行初始 icmp echo ping,则不要让 icmp echo 回复通过)之前使用相同的 id)并记住如何转换 IP/端口(如果使用 nat)。