在 CentOS 8 中过滤坏的 tcp 标志数据包

在 CentOS 8 中过滤坏的 tcp 标志数据包

我正在使用 CentOS 8,并且想要删除错误的 tcp 标志数据包,就像在 CentOS 6 中使用 iptables tcp-flags 所做的那样。

下面是在 CentOS 6 中使用 iptables tcp-flags 完成的数据包丢弃示例

-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP

我可以看到 CentOS 8 中的 firewalld 服务不提供像上面那样的功能,除了 --direct access tounderlying iptables/nftables。我不想这样做。

CentOS 8 中的坏/假数据包丢失是否无关紧要?或者在CentOS 8中使用firewalld有不同的实现方式吗?

答案1

长话短说:在任何正确使用 Netfilter 的设置中使用这些规则都是多余的连线状态防火墙所需的设施。作为防火墙使用它,它已经被覆盖了。

应该使用此类规则的唯一情况是系统根本不使用状态防火墙:要么不启用,要么不使用连线根本没有,或者可能在将某些流标记为未追踪的

我认为在今天的博客和规则中经常看到这种冗余检查的最可能原因是它继承自现有的类似规则。ip链Linux 内核 2.2.x 的年龄(或在最初实现时连线在 Linux 2.4.x 中没有做如此彻底的检查),当时不存在这种具有扩展检查功能的状态防火墙设施,这在当时是有意义的。

更多详细信息如下。


网络过滤器连线在跟踪 TCP 数据包时已经检查了有效的 TCP 标志,如所示nf_conntrack_proto_tcp.c:

/* table of valid flag combinations - PUSH, ECE and CWR are always valid */
static const u8 tcp_valid_flags[(TCPHDR_FIN|TCPHDR_SYN|TCPHDR_RST|TCPHDR_ACK|
               TCPHDR_URG) + 1] =
{
  [TCPHDR_SYN]                = 1,
  [TCPHDR_SYN|TCPHDR_URG]         = 1,
  [TCPHDR_SYN|TCPHDR_ACK]         = 1,
  [TCPHDR_RST]                = 1,
  [TCPHDR_RST|TCPHDR_ACK]         = 1,
  [TCPHDR_FIN|TCPHDR_ACK]         = 1,
  [TCPHDR_FIN|TCPHDR_ACK|TCPHDR_URG]  = 1,
  [TCPHDR_ACK]                = 1,
  [TCPHDR_ACK|TCPHDR_URG]         = 1,
};

任意组合不是此表中的内容无效(即 32 个案例中的 23 个)。请注意,如果您好奇,请阅读以下来源:NF_ACCEPT=1因此-NF_ACCEPT是-1这意味着无效)。这包括OP的三个例子FIN,SYN,,,SYN,RSTFIN,RST连线不仅如此,还例如检查数据包是否在有效的 TCP 窗口内

所以当iptables在此类伪造数据包上使用这些匹配:

-m conntrack --ctstate NEW
-m conntrack --ctstate ESTABLISHED
-m conntrack --ctstate INVALID 

或同等的nftables表达式:

ct state new
ct state established
ct state invalid

只有最后一个:INVALID/invalid会匹配,并且应该被删除(使用足够的-j DROP/drop终端语句)。

注意 CentOS6 的内核2.6.18已经过滤了那些伪造的数据包(允许 15/64 情况,而不是今天的 9/32),所以这已经通过简单地通过丢弃此类数据包来处理-m state --state INVALID -j DROP


当然防火墙使用这样的匹配。

CentOS7已安装iptables规则何时防火墙正在运行的通常包括:

-A INPUT -m conntrack --ctstate INVALID -j DROP
-A FORWARD -m conntrack --ctstate INVALID -j DROP

CentOS8已安装nftables规则何时防火墙正在运行nftables启用的后端通常包括:

# nft list chain inet firewalld filter_INPUT |grep -A2 invalid
        ct state { invalid } drop
        reject with icmpx type admin-prohibited
    }
# nft list chain inet firewalld filter_FORWARD|grep -A2 invalid
        ct state { invalid } drop
        reject with icmpx type admin-prohibited
    }

所以在使用时已经处理了伪造的 TCP 标志防火墙


不使用时防火墙您应该确保在输入和转发路径中使用这种规则(这是一个肯定需要更多规则的示例,不应该按原样使用,缺少一些经常需要的规则和选项):

iptables:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

(并根据需要添加任何其他接受、删除或拒绝规则。对于具体原因,放置任何 REJECT 规则很重要规则... INVALID -j DROP

您可以对 OUTPUT 执行相同的操作,但通常人们会相信自己(并且精心制作的 RAW 数据包无论如何都会绕过防火墙)。

nftables.nft格式示例(也必须按照特定规则完成):

table inet mytable {
    chain myinput {
        type filter hook input priority 0; policy accept;
        ct state established accept
        ct state invalid drop
    }

    chain myforward {
        type filter hook forward priority 0; policy accept;
        ct state established accept
        ct state invalid drop
    }
}

答案2

CentOS 8 使用 nftables,因此您可以使用nft.

也许是nftables 维基会帮助你。

尽管 nftable 中有一个 iptables 兼容层,但不建议将其与本机 nftables 规则混合。

相关内容