2

测试环境为:

2 操作系统 ubuntu server 10.04 安装在 VirtualBox 上

iptables v1.4.4

已加载 ip_conntrack 模块

这些是我的测试规则:

    $IPTABLES -A INPUT -p TCP -m state --state NEW -j LOG --log-prefix "[-IPT-]NEW:"
    $IPTABLES -A INPUT -p TCP -m state --state ESTABLISHED -j LOG --log-prefix "[-IPT-]ESTABLISHED:"
    $IPTABLES -A INPUT -p TCP -m state --state RELATED -j LOG --log-prefix "[-IPT-]RELATED:"
    $IPTABLES -A INPUT -p TCP -m state --state INVALID -j LOG --log-prefix "[-IPT-]INVALID:"

使用

hping3 -c 1 192.168.0.1 -p 80 [flags combination]

我得到:

no flag     INVALID
syn         NEW
ack         NEW
rst         INVALID
fin         INVALID
syn ack INVALID
syn rst INVALID
syn fin INVALID
ack rst INVALID
ack fin INVALID
rst fin INVALID
syn ack rst INVALID
syn rst fin INVALID
ack rst fin INVALID
syn ack rst fin INVALID

我读过更多的教程说netfilter看到的第一个数据包必须是新的(在用户领域)。我不明白我的电脑中是否有什么东西不能工作。

然后,在互联网上,有很多规则可以同时考虑连接状态和 tcp 标志。这些都是错的吗?原因很简单:如果他们丢弃了匹配 new 和 ! --syn,结果很痛苦……很多数据包通过“防火墙”(如果可以这样命名的话)

新版本的 iptables 是否有可能有不同的行为?

请问,如果你在你的电脑上得到同样的结果,你能确认我吗?thx,我会很感激的!

4

1 回答 1

3

看看你的结果,它们几乎是我所期望的。一些决定是基于conntrack模块做出的,其他的我相信是基于TCP RFC中允许的行为(即标志组合) 。

当没有标志时,根据 RFC,这是完全无效的。

我相信您知道原因SYN被归类为NEW,这非常符合预期:)

ACK被归类为新模块,因为conntrack模块 (afaik) 直到 3 次握手的第三步才开始跟踪连接。

两者RSTFIN仅作为实时的当前 TCP 连接的一部分有效,因此此拒绝基于在conntrack此处跟踪连接的模块。

当您将 TCP 标志组合为“新”数据包时,在某些情况下(例如,ere 应该是以前的连接),而在其他情况下,根据 RFC,它们都只是明显无效的组合(再次)。例如,一个 TCP 段不应该设置RSTandFIN标志,因为ACKRST要设置应该有一个当前的 TCP 连接已经建立,以便拆除某些东西(再次提到conntrack模块正在跟踪这里的连接)。

您是否尝试过在 Ubuntu 12.04 或 RHEL 上运行相同的测试?我会看看我是否可以稍后再试,但我相信您的计算机正在按预期工作。不错的测试虽然:)

然后,在互联网上,有很多规则可以同时考虑连接状态和 tcp 标志。这些都是错的吗?

我不这么认为,我认为每个人的用例都是不同的,通过将两者结合起来,人们通常会保持谨慎。然而,大多数人没有像你那样做那么多的测试(赞),也不是所有人都理解。

新版本的 iptables 是否有可能有不同的行为?

不,据我所知。

于 2012-08-23T11:11:49.487 回答