IPTables,我不明白的2条规则

时间:2013-11-14 16:31:31

标签: iptables

有人可以解释以下规则:

-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

我想我添加了em来防止SYN泛滥,但我不确定了。

2 个答案:

答案 0 :(得分:20)

-A default-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  • -A INPUT
    • 将规则附加到INPUT链
  • -m state
    • 加载状态模块
  • - 状态RELATE,ESTABLISHED
    • 使用状态模块匹配相关或已建立的连接
  • -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 mask comp
    • 当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 way TCP handshake http://www.cisco.com/web/about/ac123/ac147/images/ipj/ipj_9-4/94_syn_fig1_lg.jpg

因此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
  • - 限制1 / s:最大平均匹配率(秒)
  • - limit-burst 3:匹配的最大初始数据包数

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

答案 1 :(得分: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