iptables
1. 概述
Iptables 是一个用于配置 Linux 内核防火墙的用户空间工具。它能够对进出服务器的网络数据包进行过滤、修改和转发等操作,是构建安全的 Linux 网络环境的关键组件。它通过一系列规则来决定如何处理数据包,这些规则可以基于源 IP 地址、目标 IP 地址、端口号、协议类型等多种条件。
2. 工作原理
-
表(Tables)
- Iptables 包含了 4 个主要的表,分别是
filter
,nat
,mangle
和raw
。- filter 表:这是最常用的表,主要用于过滤数据包,决定是否允许数据包通过(
ACCEPT
)、丢弃数据包(DROP
)或者拒绝数据包(REJECT
)。例如,你可以设置规则允许来自特定 IP 地址范围的 HTTP 流量(端口 80)通过,而丢弃其他未知来源的 HTTP 流量。 - nat 表:主要用于网络地址转换(NAT)操作。例如,在一个使用私有 IP 地址的局域网中,通过
nat
表可以将内部私有 IP 地址转换为外部公共 IP 地址,使得内部网络中的主机能够访问互联网。它包括源 NAT(SNAT
)和目的 NAT(DNAT
)。SNAT
用于修改数据包的源 IP 地址,通常在共享上网场景中使用;DNAT
用于修改数据包的目的 IP 地址,比如将外部访问服务器的某个公共 IP 地址的流量转发到内部不同服务器的私有 IP 地址上。 - mangle 表:这个表可以对数据包进行修改,如修改数据包的 TTL(生存时间)值、改变数据包的服务类型(TOS)等。例如,在一些对网络质量有特殊要求的环境中,可以通过
mangle
表调整数据包的优先级。 - raw 表:用于配置一些在连接跟踪之前的规则。它可以用于处理一些特殊的数据包,避免它们被连接跟踪机制处理,提高性能或者满足特殊的安全需求。
- filter 表:这是最常用的表,主要用于过滤数据包,决定是否允许数据包通过(
- Iptables 包含了 4 个主要的表,分别是
-
链(Chains)
-
每个表都包含了若干个链,链是规则的集合。主要的链有
INPUT
,OUTPUT
,FORWARD
等。
- INPUT 链:用于处理进入本机的数据包。例如,当外部主机尝试访问本地服务器上的服务(如 SSH 服务)时,数据包会经过
INPUT
链,在这里可以设置规则决定是否允许该访问。 - OUTPUT 链:处理从本机发出的数据包。比如,当本地服务器向外部发送一个 HTTP 请求时,数据包会经过
OUTPUT
链,在这里可以限制服务器主动发起的连接类型等。 - FORWARD 链:用于处理经过本机但目的不是本机的数据包,通常在路由器或者网关设备上使用。例如,在一个充当路由器的 Linux 服务器上,内部网络主机发往外部网络的数据包会经过
FORWARD
链,在这里可以进行转发规则的设置。
- INPUT 链:用于处理进入本机的数据包。例如,当外部主机尝试访问本地服务器上的服务(如 SSH 服务)时,数据包会经过
-
-
规则(Rules)
- 规则定义了如何处理数据包。一条规则通常包含匹配条件和动作。匹配条件可以是源 IP 地址、目标 IP 地址、端口号、协议类型等诸多因素。动作则是对匹配的数据包采取的操作,如
ACCEPT
(接受)、DROP
(丢弃)、REJECT
(拒绝并返回错误信息)、SNAT
(源地址转换)、DNAT
(目的地址转换)等。例如,下面是一条简单的规则:iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
,这条规则的意思是在INPUT
链中添加(-A
)一条规则,匹配源 IP 地址来自192.168.1.0/24
网段、协议为 TCP(-p tcp
)并且目标端口为 80(--dport 80
)的数据包,然后采取的动作(-j
)是接受(ACCEPT
)这些数据包。
- 规则定义了如何处理数据包。一条规则通常包含匹配条件和动作。匹配条件可以是源 IP 地址、目标 IP 地址、端口号、协议类型等诸多因素。动作则是对匹配的数据包采取的操作,如
3. 数据包处理流程与规则匹配顺序
- 当一个数据包进入 Linux 系统时,它会按照特定的顺序经过 Iptables 的规则链进行处理。首先,数据包会经过
raw
表,这里的规则主要用于决定是否对数据包进行连接跟踪。然后,根据数据包的流向,它会进入mangle
表,在这里可以对数据包进行标记、修改 TTL 等操作。接着是nat
表,用于进行网络地址转换。最后是filter
表,决定数据包是被接受还是被丢弃 - 规则的匹配是按照在链中的顺序进行的。一旦找到匹配的规则,就会执行相应的动作,并且不再继续匹配该链中的后续规则。例如,在
INPUT
链中,如果第一条规则就匹配并接受了一个数据包,那么就不会再检查INPUT
链中的其他规则来处理这个数据包。
4. 常用的匹配条件
- 基于 IP 地址的匹配
- 可以使用
-s
(源 IP 地址)和-d
(目标 IP 地址)选项来指定 IP 地址范围。例如,iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT
会接受来自192.168.0.0 - 192.168.255.255
这个网段的数据包。还可以使用具体的 IP 地址,如iptables -A INPUT -s 10.0.0.1 -j DROP
会丢弃来自10.0.0.1
这个 IP 地址的数据包。
- 可以使用
- 基于端口的匹配
- 对于 TCP 和 UDP 协议,可以使用
--dport
(目标端口)和--sport
(源端口)选项。例如,iptables -A INPUT -p tcp --dport 22 -j ACCEPT
会接受目标端口为 22(SSH 服务)的 TCP 数据包。同时,也可以指定端口范围,如iptables -A INPUT -p udp --dport 1024:65535 -j ACCEPT
会接受目标端口在1024 - 65535
之间的 UDP 数据包。
- 对于 TCP 和 UDP 协议,可以使用
- 基于协议的匹配
- 使用
-p
选项来指定协议,如 TCP、UDP、ICMP 等。例如,iptables -A INPUT -p icmp -j ACCEPT
会接受所有 ICMP 协议的数据包,这通常用于允许网络中的主机响应 ping 请求。
- 使用
5. 动作类型
- ACCEPT
- 这个动作表示允许数据包通过,让数据包继续在网络中传输。例如,当你想要允许本地服务器的 Web 服务(端口 80)接收外部访问时,就可以设置规则使用
ACCEPT
动作来允许 TCP 协议、目标端口为 80 的数据包进入。
- 这个动作表示允许数据包通过,让数据包继续在网络中传输。例如,当你想要允许本地服务器的 Web 服务(端口 80)接收外部访问时,就可以设置规则使用
- DROP
DROP
动作会直接丢弃数据包,并且不会向发送方返回任何信息。这在安全性方面比较有用,例如,当你检测到某个恶意 IP 地址频繁尝试访问服务器时,可以使用DROP
动作来阻止其数据包进入,这样恶意攻击者就无法得知其访问被拒绝是因为防火墙的原因。
- REJECT
- 与
DROP
不同,REJECT
动作会丢弃数据包并且向发送方返回一个错误信息,告知发送方连接被拒绝。例如,在某些需要友好地拒绝外部访问的情况下,可以使用REJECT
。
- 与
- LOG
LOG
动作主要用于记录数据包的信息。当数据包匹配到带有LOG
动作的规则时,Iptables 会将数据包的相关信息(如源 IP 地址、目标 IP 地址、协议等)记录到系统日志(通常是/var/log/messages
或者/var/log/kern.log
)中。这有助于管理员分析网络流量和检测潜在的安全问题。例如,iptables -A INPUT -p tcp --dport 80 -j LOG
会记录所有访问本地 Web 服务端口的 TCP 数据包的信息。
6. 基本命令
# 查看规则
iptables -L -v -n -t <table>
# 说明
# -L:列出规则。
# -v:详细输出。
# -n:数字形式显示地址和端口。
# -t <table>:指定表,默认为 filter。
# 添加规则
iptables -A <chain> -p <protocol> --dport <port> -j <action>
# 说明
# -A <chain>:追加规则到指定链。
# -p <protocol>:指定协议(如 tcp, udp)。
# --dport <port>:指定目的端口。
# -j <action>:指定动作(如 ACCEPT, DROP, REJECT)。
# 删除规则
iptables -D <chain> <rule-number>
# 说明
# <rule-number>:规则编号,从 1 开始。
# 删除所有规则
iptables -F -t <table>
7. 高级功能
- 连接跟踪(conntrack)模块
- Iptables 通过连接跟踪模块来跟踪网络连接的状态。这使得它能够根据连接的不同阶段(如 NEW、ESTABLISHED、RELATED)来制定规则。例如,在处理 TCP 连接时,对于一个新建立的连接(NEW),可以设置比较严格的规则进行检查;而对于已经建立的连接(ESTABLISHED),则可以相对宽松地允许数据包通过。一个典型的规则是允许已经建立的 TCP 连接的数据包通过,如
iptables -A INPUT -m conntrack -p tcp --ctstate ESTABLISHED -j ACCEPT
。这个规则使用了-m conntrack
来调用连接跟踪模块,--ctstate ESTABLISHED
指定只接受状态为已建立连接的 TCP 数据包。
- Iptables 通过连接跟踪模块来跟踪网络连接的状态。这使得它能够根据连接的不同阶段(如 NEW、ESTABLISHED、RELATED)来制定规则。例如,在处理 TCP 连接时,对于一个新建立的连接(NEW),可以设置比较严格的规则进行检查;而对于已经建立的连接(ESTABLISHED),则可以相对宽松地允许数据包通过。一个典型的规则是允许已经建立的 TCP 连接的数据包通过,如
- IPsets 模块
- IPsets 是 Iptables 的一个强大的扩展,它允许管理员将多个 IP 地址或端口等对象组合成一个集合,然后在 Iptables 规则中使用这个集合。例如,你可以创建一个包含多个恶意 IP 地址的 IPset 集合,然后在 Iptables 规则中使用这个集合来一次性丢弃来自这些恶意 IP 地址的数据包。创建一个 IPset 可以使用
ipset
命令,如ipset create blacklist hash:ip
用于创建一个名为blacklist
的 IPset,类型为hash:ip
(用于存储 IP 地址)。然后可以将 IP 地址添加到这个集合中,如ipset add blacklist 192.168.1.100
。在 Iptables 规则中可以这样使用:iptables -A INPUT -m set -j DROP --match - set blacklist src
,这条规则会丢弃来自blacklist
集合中 IP 地址的数据包。
- IPsets 是 Iptables 的一个强大的扩展,它允许管理员将多个 IP 地址或端口等对象组合成一个集合,然后在 Iptables 规则中使用这个集合。例如,你可以创建一个包含多个恶意 IP 地址的 IPset 集合,然后在 Iptables 规则中使用这个集合来一次性丢弃来自这些恶意 IP 地址的数据包。创建一个 IPset 可以使用