Linux网络服务(六)——iptables 防火墙
Linux防火墙iptables采用netfilter内核子系统实现,包含四表(raw、mangle、nat、filter)五链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)结构。数据包按表优先级(raw→mangle→nat→filter)和链顺序(如入站:PREROUTING→INPUT)匹配规则,匹配即停止。配置时需先关闭firewalld,安装i
前言
在互联网环境中,企业通过部署各类应用系统为用户提供网络服务,包括Web网站、电子邮件系统、FTP服务器和数据库系统等。如何有效保护这些服务器,过滤不必要的访问请求和恶意入侵行为呢?
本文将从Linux系统中的防火墙——netfilter和iptables入手,介绍防火墙的基本架构、数据包匹配流程以及规则编写方法。
Linux防火墙主要工作在网络层,对TCP/IP数据包进行过滤和限制,属于典型的包过滤防火墙(或称网络层防火墙)。该防火墙体系基于内核编码实现,具有卓越的稳定性和高效的性能,因此在业界得到广泛应用。
一、iptables 概述
1.1 Netfilter
Linux 防火墙的核心组件是 Netfilter,它作为 Linux 内核的子系统直接运行在内核空间。自 Linux 2.4.x 版本开始,Netfilter 便成为新一代防火墙的实现基础。
Netfilter 采用模块化架构,具备出色的可扩展性,为各类网络服务提供了灵活的底层支持框架。该系统与 IP 协议栈是无缝契合,能够实现数据包过滤、地址转换及报文处理等功能。
Netfilter 官网文档:https://netfilter.org/documentation/
1.2 netfilter/iptables 关系
- netfilter/iptables:IP信息包过滤系统,实际上由两个组件 netfilter 和 iptables 组成。主要工作在网络层,针对 IP 数据包,体现在对包内的 IP 地址、端口等信息的处理。
- netfilter:属于“内核态”(又称内核空间,kernel space)的防火墙功能体系。是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
- iptables:属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。是一种用来管理 Linux 防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于
/sbin/iptables目录下。
netfilter/iptables 后期简称为 iptables。iptables 是基于内核的防火墙,其中内置了 raw、mangle、nat 和 filter 四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
二、iptables 的表、链结构
2.1 iptables 的四表五链结构介绍(重点)
iptables 是一个用于配置包过滤规则的工具,它通过设定不同的规则来指导 netfilter 对特定数据包进行处理。这些规则可以基于数据包的来源、目标地址或协议特征等条件来定义相应的处理方式。
为了更高效地组织和管理防火墙规则,iptables采用表和链的分层结构。该系统会分析数据包头信息,并依据预设规则进行匹配,从而决定是否允许数据包进入主机。
每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个表容器内又包括不同的规则链,根据处理数据包的不同时机划分为五种链。
2.1.1 四表五链基本概念
-
规则表:
- 表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
-
规则链:
- 规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据:处理数据包的不同时机
总结:表里有链,链里有规则。
2.1.2 四表
- raw:主要用来决定是否对数据包进行状态跟踪。包含两个规则链:OUTPUT、PREROUTING。
- mangle:修改数据包内容,用来做流量整形,给数据包设置标记。包含五个规则链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
nat:负责网络地址转换,用来修改数据包中的源、目标 IP 地址或端口。包含三个规则链:OUTPUT、PREROUTING、POSTROUTING。filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链:INPUT、FORWARD、OUTPUT。
注:在 iptables 的四个规则表中,mangle 表和 raw 表的应用相对较少。
2.1.3 五链
- INPUT:处理
入站数据包,匹配目标 IP 为本机的数据包。 - OUTPUT:处理
出站数据包,一般不在此链上做配置。 - FORWARD:处理
转发数据包,匹配流经本机的数据包。 - PREROUTING:在进行
路由选择前处理数据包,用来修改目的地址,用来做 DNAT。将公网IP的端口映射到内网服务器的IP和端口上,从而从外网访问内网服务。 - POSTROUTING:在进行
路由选择后处理数据包,用来修改源地址,用来做 SNAT。相当于内网通过路由器 NAT 转换功能实现内网主机通过一个公网 IP 地址上网。
2.2 数据包过滤的匹配流程
2.2.1 规则表匹配顺序
优先顺序:raw → mangle → nat → filter
2.2.2 规则链之间的匹配顺序
- 主机型防火墙:
- 入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING → INPUT → 本机的应用程序
- 出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序 → OUTPUT → POSTROUTING
- 网络型防火墙:
- 转发数据(需要经过防火墙转发的数据包):PREROUTING → FORWARD → POSTROUTING
2.2.3 规则链内的匹配顺序
自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG 策略例外,表示记录相关日志),要么放行要么丢弃。若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)。
注:按第一条规则……第二条规则的顺序进行匹配处理,遵循“匹配即停止”的原则,一旦某条规则匹配成功,系统将终止后续规则的检查;若全部规则均未匹配,则执行默认规则处理。
默认规则用 iptables -L 查看,规则链后面出现 (policy ACCEPT) 即是默认放行。默认策略不参与链内规则的顺序编排,使用 -F 清空链时,默认策略不受影响。
2.2.4 数据包在规则表、链间的匹配流程
- 入站数据流向:来自外界的数据包到达防火墙后,首先被
PREROUTING链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发往何处);如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传递给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如 httpd 服务器)进行响应。 - 转发数据流向:来自外界的数据包到达防火墙后,首先被
PREROUTING链处理,然后再进行路由选择;如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ 服务器),则内核将其传递给FORWARD链进行处理(允许转发或拦截、丢弃),最后交给POSTROUTING链(是否修改数据包的地址等)进行处理。 - 出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS 服务时),首先进行
路由选择,确定了输出路径后,再经由OUTPUT链处理,最后再交POSTROUTING链(是否修改数据包的地址等)进行处理。
三、编写防火墙规则
3.1 iptables 安装
CentOS 7 默认使用 firewalld 防火墙,没有安装 iptables。若想使用 iptables 防火墙,必须先关闭 firewalld 防火墙,再安装 iptables。
关闭 firewalld 防火墙:
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service # 查看防火墙状态
systemctl is-enabled firewalld.service # 查看防火墙开机自启状态

安装 iptables 防火墙:
yum -y install iptables iptables-services

设置 iptables 开机启动:
systemctl start iptables.service
systemctl enable iptables.service
# 查看状态
systemctl status iptables.service
systemctl is-enabled iptables.service


iptables 防火墙的配置方法:
- 使用 iptables 命令行。
- 使用 system-config-firewall(CentOS 7 不能使用,CentOS 6 可以使用)。
3.2 iptables 基本语法、数据包控制类型
语法构成:
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
- 表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用
filter表; - 管理选项表示 iptables 规则的操作方式,如插入、增加、删除、查看等;
- 匹配条件用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理;
- 控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。
注意事项:
- 不指定表名时,默认指
filter表。 - 不指定链名时,默认指表内的所有链。
- 除非设置链的默认策略,否则必须指定匹配条件。
- 管理选项、链名、控制类型使用大写字母,其余均为小写。
数据包的常见控制类型:
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给出任何回应信息。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
- LOG:在
/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。 - SNAT:修改数据包的源地址。
- DNAT:修改数据包的目的地址。
- MASQUERADE:伪装成一个非固定公网 IP 地址。
注:需要大写。防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助动作,并没有真正处理数据包。
3.3 添加、查看、删除规则等基本操作
3.3.1 iptables 命令的常用管理选项
| 管理选项 | 用法示例 |
|---|---|
-A |
在指定链末尾追加一条 iptables -A INPUT (操作) |
-I |
在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作) |
-P |
指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
-D |
删除 iptables -t nat -D INPUT (操作) |
-R |
修改、替换某一条规则 iptables -t nat -R INPUT (操作) |
-L |
查看 iptables -t nat -L (查看) |
-n |
所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名)iptables -L -n,iptables -nL,iptables -vnL (查看) |
-v |
查看时显示更详细信息,常跟 -L 一起使用 (查看) |
--line-number |
规则带编号 iptables -t nat -L -n --line-number / iptables -t nat -L --line-number |
-F |
清除链中所有规则 iptables -F (操作) |
| -X | 清空自定义链的规则,不影响其他链 iptables -X |
| -Z | 清空链的计数器(匹配到的数据包的大小和总和) iptables -Z |
| -S | 查看链的所有规则或者某个链的规则/某个具体规则后面跟编号 iptables -t nat -S、iptables -t nat -S POSTROUTING 1 |
iptables 各字段解读:
- pkts:对应规则匹配到的报文的个数。
- bytes:对应匹配到的报文包的大小总和。
- target:规则对应的 target,往往表示规则对应的“动作”,即规则匹配成功后需要采取的措施。
- prot:表示规则对应的协议,是否只针对某些协议应用此规则。
- opt:表示规则对应的选项。
- in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
- out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
- source:表示规则对应的源头地址,可以是一个 IP,也可以是一个网段。
- destination:表示规则对应的目标地址。可以是一个 IP,也可以是一个网段。
- packages:匹配到的包数量。
- bytes:匹配到的总字节数。
3.3.2 添加新的规则
添加新的防火墙规则时,使用管理选项-A、-I,前者用来追加规则,后者用来插入规则。
例如,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中 -p 协议名作为匹配条件)。
例 1:不允许任何主机 ping 本主机
iptables -t filter -vL # 查看filter表内容
iptables -t filter -A INPUT -p icmp -j REJECT # 不允许任何主机 ping 本主机


使用iptables -t filter -A INPUT -p icmp -j REJECT添加规则

但是,此时主机依然可以被ping通
因为规则链内的匹配顺序遵循匹配即停止的原则
如果想要我们添加的规则生效,可以使用iptables -t filter -I INPUT -p icmp -j REJECT将规则插入到首位
iptables -t filter -I INPUT -p icmp -j REJECT
iptables -t filter -nvL


例 2:允许通过 TCP 协议连接到系统的 22 端口(SSH)
# 允许通过 TCP 协议连接到系统的 22 端口(SSH)。
#规则被插入到 INPUT 链的第 2 个位置,确保它在其他可能存在的规则之前被处理。
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
插入前
插入后

其他示例:
iptables -t filter -A INPUT -p tcp -j ACCEPT // 允许任何主机 tcp
iptables -I INPUT -p udp -j ACCEPT // 允许任何主机 udp

3.3.3 查看规则列表
查看已有的防火墙规则时,使用管理选项-L,结合--line-numbers选项还可显示各条规则在链内的顺序号。
例如,查看 filter 表 INPUT 链中的所有规则,并显示规则序号:
iptables [-t表名] -n -L [链名] |[-- line-numbers]
或
iptables - [vn]L
# 注意:不可以合写为 -Ln
示例:
iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

当防火墙规则的数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在一定程度上加快命令执行的速度。
例如:以数字地址形式查看 filter 表 INPUT 链中的所有规则:
iptables -nL INPUT # "-n -L" 可合写为 "-nL"
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

3.3.4 删除、清空规则
删除一条防火墙规则时,使用管理选项-D。
例如,删除 filter 表 INPUT 链中的第五条规则:
iptables -L INPUT --line-numbers
iptables -D INPUT 5
iptables -L INPUT --line-numbers

第二种写法:
iptables -t filter -A INPUT -p icmp -j REJECT
iptables -L INPUT --line-numbers
iptables -t filter -D INPUT -p icmp -j REJECT


清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,清空 filter 表 INPUT 链中的所有规则:
iptables -F INPUT
iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination

注意:
- 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条。
- 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错。
- 按内容匹配删数时,确保规则存在,否则报错。
使用管理选项“-F”时,允许省略链名而清空指定表所有链的规则。例如,清空 filter 表、nat 表、mangle 表:
iptables -F # 清空 filter 表
iptables -t nat -F # 清空 nat 表
iptables -t mangle -F # 清空 mangle 表

使用以下代码查看filter、nat、mangle表中内容:
iptables -nL
iptables -t nat -nL
iptables -t mangle -nL



注意:
-F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改。-P设置了 DROP 后,使用-F一定要小心!防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决。- 如果不写表名和链名,默认清空 filter 表中所有链里的所有规则。
3.3.5 设置默认策略
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
iptables [-t表名] -P <链名> <控制类型>
例如,将 filter 表中 FORWARD 链的默认策略设为丢弃,OUTPUT 链的默认策略设为允许:
iptables -P FORWARD DROP
iptables -P OUTPUT ACCPET
例1:将filter表中INPUT链的默认策略设为丢弃,然后清空INPUT规则,尝试主机是否可以被ping通
iptables -P INPUT DROP
iptables -F INPUT

在INPUT链中加上允许icmp连接,再次尝试:
iptables -I INPUT -p icmp -j ACCEPT


一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为 DROP,并设置白名单。
示例:
iptables -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -P OUTPUT ACCEPT


需要注意的是,当使用管理选项-F清空链时,默认策略不受影响。因此若要修改默认策略,必须通过管理选项-P重新进行设置。另外,默认策略并不参与链内规则的顺序编排,因此在其他规则之前或之后设置并无区别。
3.4 规则的匹配条件
制定防火墙规则时,匹配条件的设置至关重要。通过精准定义匹配条件,防火墙才能正确识别需要处理的数据包,避免误判。单条规则可包含多个匹配条件,此时所有条件必须同时满足才能触发规则。根据数据包特性和iptables模块结构,匹配条件可分为三大类:通用匹配、隐含匹配和显式匹配。
3.4.1 通用匹配
通用匹配(又称常规匹配)是一种独立运行的匹配方式,无需依赖其他条件或扩展模块即可生效。其主要类型包括:协议匹配、地址匹配和网络接口匹配。
- 协议匹配:在配置 iptables 规则时,可通过
-p参数(或--protocol)指定网络协议类型,例如 tcp、udp、icmp 或 all(匹配所有 IP 数据包)。系统支持的协议类型定义在/etc/protocols文件中。
示例1:
# filter表INPUT链中非ICMP协议的连接接受
iptables -I INPUT ! -p icmp -j ACCEPT # 感叹号”!”表示取反
# filter表INPUT链中ICMP协议的连接丢弃
iptables -A INPUT -p icmp -j DROP

此时,服务器无法响应ping请求(ICMP协议),但允许其他协议的入站连接,例如通过TCP 22端口建立的SSH远程连接。

- 地址匹配:
-s源地址、-d目的地址,可以是IP、网段、域名、空(任何地址)
示例1:
# 源地址192.168.10.123的入站请求丢弃
iptables -A INPUT -s 192.168.10.123 -j DROP


- 接口匹配:
-i入站网卡、-o出站网卡
示例1:
# 源地址为192.168.10.0网段的对于网卡ens33的入站请求被丢弃
iptables -I INPUT -i ens33 -s 192.168.10.0/24 -j DROP

此时,来自192.168.10.0网段的入站请求在通过网卡ens33时被系统丢弃。

3.4.2 隐含匹配
隐含匹配要求以特定的协议匹配作为前提,包括端口、TCP 标记、ICMP 类型等条件。
- 端口匹配:
--sport源端口、--dport目的端口。可以是个别端口、端口范围。--sport 1000:匹配源端口是 1000 的数据包。--sport 1000:3000:匹配源端口是 1000-3000 的数据包。--sport :3000:匹配源端口是 3000 及以下的数据包。--sport 1000::匹配源端口是 1000 及以上的数据包。
注意:--sport 和 --dport 必须配合 -p <协议类型> 使用。
示例:
iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 -j DROP
iptables -A FORWARD -s 192.168.10.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.10.0/24 -p udp --sport 53 -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 53 -j ACCEPT
例如,执行iptables -A OUTPUT -p udp --dport 53 -j DROP命令会拦截所有出站UDP协议的53端口请求,这将导致DNS解析功能失效。

- TCP 标记匹配:
--tcp-flags TCP 标记(了解即可)。
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
# 丢弃 SYN 请求包,放行其他包
- ICMP 类型匹配:
--icmp-type ICMP 类型。可以是字符串、数字代码。(了解即可)Echo-Request(代码为 8) 表示请求。Echo-Reply(代码为 0) 表示回显。Destination-Unreachable(代码为 3) 表示目标不可达。
关于其它可用的 ICMP 协议类型,可以执行iptables -p icmp -h命令,查看帮助信息。
示例:
iptables -A INPUT -p icmp --icmp-type 8 -j DROP # 禁止其它主机 ping 本机
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT # 允许本机 ping 其它主机,先拒绝:iptables -A INPUT -p icmp -j DROP
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT # 当本机 ping 不通其它主机时提示目标不可达
# 此时其它主机需要配置关于 icmp 协议的控制类型为 REJECT
iptables -A INPUT -p icmp -j REJECT
3.4.3 显式匹配
显式匹配要求以-m 扩展模块的形式明确指出类型,包括多端口、MAC 地址、IP 范围、数据包状态等条件。
- 多端口匹配:
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
示例:
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
此时,允许目标端口为 80(HTTP)、22(SSH)、21(FTP控制)、20(FTP数据)、53(DNS)的 TCP 协议入站流量。允许目标端口为 53(DNS)的 UDP 协议入站流量。

- IP 范围匹配:
-m iprange --src-range IP 范围(源IP地址)、-m iprange --dst-range IP 范围(目的IP地址)
iptables -A INPUT -p icmp -m iprange --src-range 192.168.10.100-192.168.10.200 -j DROP
# 禁止入站源地址位于 192.168.10.100-192.168.10.200 的 icmp数据包

此时源地址位于 192.168.10.100-192.168.10.200 的主机无法ping通服务器。
- MAC 地址匹配:
-m mac --mac-source MAC 地址(源mac地址)、-m mac --mac-destination MAC 地址(目的mac地址)
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
# 禁止来自某 MAC 地址的数据包通过本机转发
iptables -A FORWARD -m mac --mac-destination xx:xx:xx:xx:xx:xx -j DROP
# 禁止目标某 MAC 地址的数据包通过本机转发
例如,我有一台主机的MAC地址是74:40:BB:56:B0:9F,我想禁止他的所有入站数据请求。
iptables -A INPUT -m mac --mac-source 74:40:BB:56:B0:9F -j DROP

此时,原自该mac地址的入站数据包都被禁止
- 状态匹配:
-m state --state 连接状态
常见的连接状态:- NEW(新的):与任何连接无关的,还没开始连接。
- ESTABLISHED(已建立):响应请求或者已建立连接的,连接态。
- RELATED(相关的):与已有连接有相关性的(如 FTP 主被动模式的数据连接),衍生态,一般与 ESTABLISHED 配合使用。
- INVALID(无效的):不能被识别属于哪个连接或没有任何状态。
示例:
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
# 禁止转发与正常 TCP 连接无关的非 --syn 请求数据包(如伪造的网络攻击数据包)
例1:可以通过配置以下4条规则实现 “默认拒绝,明确允许” 的安全策略:
iptables -I INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 对进来的包的状态进行检测。已经建立 tcp 连接的包以及该连接相关的包允许通过。
# 比如我和你做生意,我们谈成了生意,到了支付的时候,就可以直接调用与这笔生意相关的支付功能
iptables -P INPUT DROP
其中第三条规则iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT是服务器主动发起连接的关键,如果不加这条规则,,服务器无法访问外部网路。

原因很简单,当服务器主动向外发起连接(比如服务器访问外部 API、更新软件、同步数据等),对方的回应数据包会被视为 “已建立连接的相关流量(ESTABLISHED, RELATED)”。
如果没有这条规则,这些回应会被默认策略(DROP)拦截,导致服务器主动发起的连接无法正常完成。
3.5 规则的保存与加载
在 Linux 系统中,直接通过 iptables 命令修改的防火墙规则是临时的,当服务重启或系统重启后会丢失。因此需要通过保存和加载操作来持久化规则。
3.5.1 保存当前规则
使用 iptables-save 命令将当前生效的规则保存到文件:
# 保存规则到 /etc/iptables.rules
iptables-save > /etc/iptables.rules

3.5.2 加载已保存的规则
当需要恢复之前保存的规则时,使用 iptables-restore 命令:
# 从 /etc/iptables.rules 加载规则
iptables-restore < /etc/iptables.rules


3.5.3 恢复系统默认规则
如果需要恢复到系统初始配置,可加载系统默认规则文件(不同发行版路径可能不同):
# 恢复系统默认规则(CentOS/RHEL 示例)
iptables-restore < /etc/sysconfig/iptables
# Debian/Ubuntu 系统可能使用
# iptables-restore < /etc/iptables/rules.v4


3.5.4 设置开机自动加载规则
如果你担心服务器意外重启,并且为了实现开机自动加载自定义规则,可以创建一个 systemd 服务:
- 创建服务文件:
vim /etc/systemd/system/iptables-load.service
- 写入以下内容:
[Unit]
Description=Load iptables rules at startup
After=network.target
[Service]
Type=oneshot
# /etc/iptables.rules是保存规则的路径
ExecStart=/sbin/iptables-restore < /etc/iptables.rules
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

- 启用并启动服务:
# 重新加载 systemd 配置
systemctl daemon-reload
# 启用开机自启
systemctl enable iptables-load.service
# 立即加载规则
systemctl start iptables-load.service



通过以上步骤,你的 iptables 规则将在系统重启后自动加载,确保规则持久生效。
总结
本文详细介绍了 Linux 系统中的防火墙工具 iptables,包括其基本概念、表链结构、数据包匹配流程以及如何编写和管理防火墙规则。
通过学习,我们可以掌握如何使用 iptables 来保护服务器,过滤不必要的访问和恶意入侵,确保网络服务的安全稳定运行。
iptables 作为 Linux 系统中最常用的防火墙工具之一,具有强大的功能和灵活的配置方式,是系统管理员和网络安全工程师必备的技能之一。
更多推荐
所有评论(0)