跳转至

06 iptables扩展匹配条件之 tcp flags

iptables 扩展匹配条件之 -tcp-flags

前文之中已经对tcp 扩展模块进行过总结, 但是 只介绍了--dport--sport 的匹配, 并没有对 -tcp-flags进行总结, 下面来学习一下

在学习此章需要对tcp 协议有一定了解, 如tcp 报头, TCP 三次握手

-tcp-flags : 就是tcp 头中的标志位

看来,在使用iptables 匹配的过程中, 我们可以使用扩展匹配条件匹配tcp 报文头部的标识位, 然后根据标识位实际情况实现控制功能

回顾一下tcp 报头的结构, 如下图所示:

img

在使用iptables时,使用tcp扩展模块的–tcp-flags选项,即可对上图中的标志位进行匹配,判断指定的标志位的值是否为1;

在tcp建立协议的时候, 需要进行三次握手, 而三次握手刚好就依靠 tcp 头部的标志位进行

回顾一下tcp 建立连接的步骤: img

第一次握手: 客户端向服务端 发送报文头 SYN=1 的报文

第二次握手: 服务端接受到之后, 返回 SYN=1,ACK=1 的报文

第三次握手: 客户端再向服务端发送 ACK=1 的报文

根据这些步骤: 可以通过 iptables 匹配tcp 传输的相应握手步骤

# 第一次握手
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

# 第二次握手
iptables -t filter -I OUTPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT

# 第三次握手
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j REJECT

可以修改一下上述写法:

# 第一次握手
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT

# 第二次握手
iptables -t filter -I OUTPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN,ACK -j REJECT

# 第三次握手
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL ACK -j REJECT

针对匹配第一次握手, tcp 模块中也提供了一个参数来匹配

# 第一次握手
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

用途

使用-tcp-flags 匹配时, 可以有效防止 DDOS 攻击, 使用以下规则进行处理

iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A INPUT -p tcp --syn -j DROP

这些规则的作用如下:

  • 第一个规则将限制每秒钟只允许一个 SYN 数据包的到达,但在限制突发进程方面,允许最多三个数据包突发
  • 第二个规则丢弃所有剩余的 SYN 数据包,从而避免 DDOS 攻击