一、iptables 是什么?
iptables
是 Linux
系统中一个强大的防火墙工具,它实际上是一个命令行实用程序,用于配置 Linux 内核防火墙 netfilter
。而 netfilter
是内核中的一个框架,负责网络数据包的过滤、修改和转发。如果把 netfilter
看作是防火墙的“骨架”,而 iptables
则是用来控制这个骨架的“工具”。
简单来说,iptables
允许你定义规则,决定如何处理进出你计算机或网络的网络流量。这些规则可以基于各种标准,例如源 IP 地址、目标 IP 地址、端口号和协议。
二、概念解析
1、iptables 的表和链
iptables
使用表 tables
和链 chains
来组织规则,主要有五个表,每个表都有其特定的用途:
filter
表: 这是最常用的表,用于过滤数据包。它决定哪些数据包允许通过,哪些数据包被拒绝或丢弃。filter
表包含三个内置链:INPUT
链: 处理进入系统的数据包。OUTPUT
链: 处理从系统发出的数据包。FORWARD
链: 处理从一个接口转发到另一个接口的数据包。
nat
表: 用于网络地址转换 (Network Address Translation, NAT)。它修改数据包的源或目的 IP 地址和端口号,实现地址掩蔽、端口映射等功能。 nat 表包含三个内置链:PREROUTING
链: 在路由决策之前处理数据包,用于目的 NAT (DNAT)。POSTROUTING
链: 在路由决策之后处理数据包,用于源 NAT (SNAT)。OUTPUT
链: 处理从系统发出的数据包,用于本地出站 NAT。
mangle
表: 用于修改数据包的头部信息,例如修改 TTL (Time To Live) 值、TOS (Type of Service) 值等。 这通常用于 QoS (Quality of Service) 控制或其他网络管理任务。 mangle 表包含五个内置链:PREROUTING
链: 在路由决策之前处理数据包。INPUT
链: 处理进入系统的数据包。FORWARD
链: 处理从一个接口转发到另一个接口的数据包。OUTPUT
链: 处理从系统发出的数据包。POSTROUTING
链: 在路由决策之后处理数据包。
raw
表: 用于在连接跟踪之前处理数据包。 它主要用于控制哪些数据包需要进行连接跟踪,哪些数据包不需要。 raw 表包含两个内置链:PREROUTING
链: 在路由决策之前处理数据包。OUTPUT
链: 处理从系统发出的数据包。
security
表: 这个表与 SELinux 安全模块集成,用于强制执行基于 SELinux 的安全策略。它包含三个内置链,与 filter 表的链名称相同:INPUT
链: 处理进入系统的数据包。OUTPUT
链: 处理从系统发出的数据包。FORWARD
链: 处理从一个接口转发到另一个接口的数据包。 这个表只有在 SELinux 启用时才可用。
2、iptables 的规则
规则是 iptables 的核心。每个规则指定一个匹配条件和一个目标 (target)。
- 匹配条件:定义规则应用于哪些数据包。例如,你可以指定源 IP 地址、目标端口或协议。
- 目标 (target):指定匹配规则的数据包应采取的操作。常用的目标有:
- ACCEPT:允许数据包通过。
- DROP:丢弃数据包。
- REJECT:拒绝数据包,并向发送方发送一个错误消息。
3、数据包在 iptables 中的流向
一个网络数据包在进入或离开你的 Linux 系统时,会按照特定的顺序经过不同的表和链。这个顺序非常重要,因为它决定了规则的应用顺序,也决定了不同表之间的规则如何“相互作用”。
以下是数据包在 iptables
中的典型流向:
- 进入本机 (目标地址为本地主机):
raw
表: 数据包首先进入raw
表的PREROUTING
链。 此链主要用于设置连接跟踪标记,决定是否对该数据包进行连接跟踪。 如果设置了NOTRACK
标记,则跳过连接跟踪。mangle
表: 接下来,数据包进入mangle
表的PREROUTING
链。 此链用于修改数据包的头部信息,例如 QoS (Quality of Service) 标记、TTL (Time To Live) 值等。nat
表: 然后,数据包进入nat
表的PREROUTING
链。 此链用于进行源 NAT (SNAT) 或目的 NAT (DNAT)。SNAT
用于修改数据包的源 IP 地址,通常用于隐藏内部网络的 IP 地址;DNAT
用于修改数据包的目的 IP 地址,通常用于将外部请求转发到内部服务器。filter
表: 数据包进入filter
表的INPUT
链。 此链用于根据各种条件过滤入站数据包,决定是否允许数据包进入系统。security
表 (如果启用): 如果启用了SELinux
,数据包将进入security
表。 此表用于基于SELinux
安全策略进行访问控制。
- 从本机发出 (源地址为本地主机):
raw
表: 数据包进入raw
表的OUTPUT
链。 与入站数据包类似,此链用于设置连接跟踪标记。mangle
表: 数据包进入mangle
表的OUTPUT
链,用于修改数据包头部信息。nat
表: 数据包进入nat
表的POSTROUTING
链。 此链用于进行源 NAT (SNAT),将内部 IP 地址转换为外部 IP 地址。filter
表: 数据包进入filter
表的 OUTPUT 链,用于过滤出站数据包。security
表 (如果启用): 如果启用了SELinux
,数据包将进入security
表。
- 通过本机转发 (FORWARD 链):
raw
表: 数据包进入raw
表的FORWARD
链。mangle
表: 数据包进入mangle
表的FORWARD
链。nat
表: 数据包进入nat
表的PREROUTING
链 (用于目的 NAT) 和POSTROUTING
链 (用于源 NAT)。filter
表: 数据包进入filter
表的FORWARD
链。security
表 (如果启用): 如果启用了 SELinux,数据包将进入security
表。
三、使用方法
可以用
-t
选项指定表名,如果不指定默认为filter
表
1、基本操作命令
iptables -L -v --line-number
:列出filter
表的规则,-v
参数显示更详细的信息,例如数据包计数器和字节计数器,--line-number
显示行号,方便其他命令指定规则。iptables -F
:清空指定表的所有规则。例如,iptables -F filter
清空 filter 表的所有规则。不指定表名则清空所有表的规则。iptables -X
:删除用户自定义的链。iptables -Z
:将所有链的计数器清零。iptables -P <链名> <策略>
:设置指定链的默认策略。策略可以是ACCEPT
(接受)、DROP
(丢弃)或REJECT
(拒绝并发送错误信息)。例如,iptables -P INPUT DROP
将 INPUT 链的默认策略设置为丢弃所有进入的数据包。iptables -E <旧链名> <新链名>
:重命名用户自定义的链。
2、规则管理命令
iptables -A <链名> <规则>
:在指定链的末尾添加一条规则。iptables -I <链名> [规则编号] <规则>
:在指定链的开头或指定编号处插入一条规则。例如,iptables -I INPUT 2 <规则>
将规则插入到 INPUT 链的第二条。iptables -D <链名> <规则编号>
或iptables -D <链名> <规则>
:删除指定链中的一条规则。可以通过规则编号或完整规则来删除。iptables -R <链名> <规则编号> <新规则>
:替换指定链中指定编号的规则。
3、规则匹配选项
以下是一些常用的规则匹配选项:
-p <协议>
:指定协议,例如tcp
、udp
、icmp
。-s <源地址>
:指定源 IP 地址或网络地址。例如,192.168.1.100
或192.168.1.0/24
。可以使用!
取反,例如! 192.168.1.0/24
表示除了 192.168.1.0/24 网络之外的所有地址。-d <目标地址>
:指定目标 IP 地址或网络地址,用法同-s
。--sport <源端口>
:指定源端口号或端口范围。例如,22
或1024:65535
。--dport <目标端口>
:指定目标端口号或端口范围,用法同--sport
。-i <网络接口>
:指定数据包进入的网络接口。例如,eth0
。-o <网络接口>
:指定数据包发出的网络接口。例如,eth0
。-m <模块名>
:加载额外的匹配模块,例如state
、conntrack
、multiport
等。
4、目标(Target)选项
以下是一些常用的目标选项:
-j ACCEPT
:接受数据包。-j DROP
:丢弃数据包。-j REJECT
:拒绝数据包,并向发送方发送一个错误信息。可以使用--reject-with <类型>
指定拒绝类型,例如icmp-port-unreachable
。-j LOG
:记录数据包信息到日志。可以使用--log-prefix <前缀>
指定日志前缀。-j MASQUERADE
:用于 NAT,将私有网络地址伪装成公网 IP 地址。-j SNAT --to-source <IP地址>
:源地址转换。-j DNAT --to-destination <IP地址>
:目标地址转换。
5、常用组合示例
- 允许 SSH 流量:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 阻止来自特定 IP 的流量:
iptables -A INPUT -s 192.168.1.100 -j DROP
- 允许来自本地网络的流量:
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
- 允许 ping:
iptables -A INPUT -p icmp -j ACCEPT
- 记录被丢弃的数据包:
iptables -A INPUT -j LOG --log-prefix "Dropped packets: "
- 将80端口转发到目标地址的8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
- 将80端口重定向到本地的8080(端口映射)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
6、保存和恢复规则
iptables-save
:保存当前规则到文件。通常保存到/etc/sysconfig/iptables
(CentOS/RHEL)或/etc/iptables/rules.v4
(Debian/Ubuntu)。iptables-restore <文件名>
:从文件恢复规则。
7、重要提示:
- 规则的顺序非常重要,iptables 会按顺序检查规则。
- 在修改 iptables 规则之前,最好先备份当前的规则。
- 测试新的规则时要小心,以免意外阻止了重要的网络连接。
iptables
命令是即时生效的,但重启后会失效。需要使用iptables-save
和iptables-restore
命令来持久化规则。