2个我不明白的iptables规则

问题描述 投票:3回答:2

任何人都可以解释以下规则:

-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泛滥,但不确定。

linux iptables
2个回答
20
投票
-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 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 way TCP handshake(来源: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
  • -极限1 / s:最大平均匹配率,以秒为单位
  • -极限突发3:要匹配的最大初始包数

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


5
投票

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

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

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

任何合法的入站连接都将发送一个初始数据包,该数据包的SYN位置1,但是没有其他任何一个。使用多个标志是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
© www.soinside.com 2019 - 2024. All rights reserved.