4

谁能解释以下规则:

-A default-INPUT -p tcp -m tcp --sport 0:1023 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A default-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

我想我添加它们是为了防止 SYN 泛滥,但我不确定。

4

2 回答 2

23
-A default-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  • -A 输入
    • 将规则附加到 INPUT 链
  • -m 状态
    • 加载状态模块
  • --state 相关,已建立
    • 使用状态模块匹配相关或已建立的连接
  • -j 接受
    • 是到 ACCEPT 链的跳转,这意味着相关或先前建立的连接的流量被接受并允许通过防火墙。

现在执行下一个命令:

-A default-INPUT -p tcp -m tcp --sport 0:1023 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
  • -p tcp
    • 仅匹配 tcp 协议上的规则
  • -m tcp
    • 加载 tcp 模块(在文档中也称为“匹配扩展”)
  • --运动 0:1023
    • 匹配源端口范围 0-1023
  • !--tcp-flags FIN,SYN,RST,ACK SYN
    • [!] 反转比赛的感觉
    • [!] --tcp-flags 掩码补偿
    • 当 TCP 标志符合指定时匹配。第一个参数掩码是我们应该检查的标志,写成逗号分隔的列表,第二个参数 comp 是必须设置的标志的逗号分隔列表。标志是:SYN ACK FIN RST URG PSH ALL NONE
    • 因此命令:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
    • 只会匹配SYN设置了ACK, FIN and RST标志且未设置标志的数据包。
    • FIN,RST,ACK所以我相信这个规则在设置和未设置标志时匹配SYN;这是SYN设置的反向匹配并且FIN,RST,ACK未设置。

为了理解这个模块的使用,你需要对 TCP 段和它的 3 次握手有一点了解。

这是3次握手:

3路TCP握手
(来源:cisco.com

因此,TCP 段具有控制连接状态的标志。

  • URG(1 位)——表示紧急指针字段是重要的
  • ACK(1 位)——表示确认字段是重要的。客户端发送的初始 SYN 数据包之后的所有数据包都应设置此标志。
  • PSH(1 位)——推送功能。要求将缓冲的数据推送到接收应用程序。
  • RST(1 位)——重置连接
  • SYN(1 位)——同步序列号。只有从每一端发送的第一个数据包应该设置这个标志。其他一些标志基于此标志改变含义,有些仅在设置时有效,而另一些则在清除时有效。
  • FIN(1 位)——不再有来自发送方的数据

TCP 段:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我认为这不能防止SYN洪水,主要是因为我还没有尝试过。虽然这个会限制SYN洪水:

# Limit the number of incoming tcp connections
# Interface 0 incoming syn-flood protection
iptables -N syn_flood
iptables -A INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP
  • --limit 1/s:以秒为单位的最大平均匹配率
  • --limit-burst 3:要匹配的最大初始数据包数

取自:http ://www.cyberciti.biz/tips/howto-limit-linux-syn-attacks.html

于 2013-11-19T21:34:22.440 回答
5

第二行是防止无效数据包。

-A default-INPUT -p tcp -m tcp --sport 0:1023 ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT

拒绝所有设置了 SYN 位和任何其他标志的入站数据包。如果这是服务器,这是有道理的。

任何合法的入站连接都会发送一个设置了 SYN 位的初始数据包,但不会发送其他数据包。使用多个标志是 tcp 堆栈上的攻击媒介,需要丢弃。

另外两个攻击是NULL,没有设置任何标志,而圣诞树,所有标志都设置了。为了防止这些,使用

# Protect against common attacks
# Block tcp packets that have no tcp flags set.
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Block tcp packets that have all tcp flags set.
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
于 2016-07-26T15:19:06.280 回答