iptables软件防火墙
Iptables基本介绍
什么是防火墙
- 过去,很长一段时期⾥,房屋都是草屋结构,如果一家失火,四邻也会跟着遭殃,所以为安全起见,古⼈就在自已居住地周围修筑高高的围墙,以阻挡外来的火势,保护自身的安全,这种墙就叫“防火墙”。
- 如今,“因特网” 把世界各地的计算机都紧密地连接在一起。如果不严加防卫,一旦网络被侵害,可能会出现不可预计的损失。那么在互联网上,我们会采用类似防火墙的⽅法,来保护我们的网络不受侵害、为此我们需要设定防火墙规则,确定哪些类型的数据包允许通过,哪些不允许通过。
- 那么具备这种功能的“设备或软件”就可以称之为“防火墙”。
防火墙种类
从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
- 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
- 软件防火墙:以软件的⽅式模拟防火墙功能,运行在操作系统上,性能不高,成本较低。
iptables属于什么
iptables 其实不是真正的防火墙,就是一个代理程序,用户通过 iptables 这个代理程序,将安全规则执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个安全框架叫 netfilter ,是内核代码中不可缺少的一部分; iptables 位于操作系统的用户空间,我们是通过 iptables 命令工具操作 netfilter 内核框架。
所以iptables的完整叫法应该是 netfilter/iptables ,它是 Linux 平台下的 “包过滤型防火墙”,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决⽅案,完成数据包的过滤、连接追踪、限速、网络地址转换 (NAT) 等功能。

包过滤防火墙是什么
包过滤防火墙它工作在 OSI 七层模型中的网络层和传输层,用来匹配对应数据包的 (header) :
- 1、将
Header与预先定义好的防火墙规则进行比对; - 2、与规则相匹配的包会被放行;
- 3、与规则不匹配的包则可能会被丢弃、也可能执行更复杂的动作;
由于包过滤防火墙工作在网络层,故也称”网络层防火墙“,它通过检查每一个数据包的:
- 源地址、目的地址;
- 源端口、目的端口;
- 协议类型
(TCP、UDP、ICMP)、等状态信息来判断是否符合规则;
即:通讯必须满足我设定的条件才行
包过滤防火墙如何实现
包过滤防火墙是由 Netfilter 来实现的,它是内核的一部分:
如果我们想要防火墙能够达到”防火”的目的,则需要在内核中设置关卡,所有进出的报文都要经过这些关卡进行检查:
- 将符合条件的放行;
- 不符合条件的阻止;
而这些关卡在 iptables 中不被称为”关卡”,而被称为”链”;
Iptables中链的概念
什么是链
在 iptables 中的关卡为什么被称作”链”呢?
防火墙的作用就在于对经过的数据报文进行”规则”匹配,然后执行规则对应的”动作”,所以当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一起的时候,就形成了”链”。
所以,每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作,如果没有则执行默认链的动作。

iptables中默认链的种类
当我们启用了防火墙功能时,报文需要经过很多关卡,也就是说,根据实际情况的不同,报文经过”链”可能不同,大体分为如下三类:
- 请求本机会经过哪些链
(PREROUTING-->INPUT-->Local Process); - 经过本机又会经过哪些链
(PREROUTING-->FORWARD-->POSTROUTING); - 从本机发出又会经过哪些链
(Local Process-->OUTPU-->POSTROUTING);
了解 Iptables 链的数据包流向;后期在设定规则时,能很清晰的知道将规则设定在哪个链上;

INPUT和OUTPUT构成了本机的进出逻辑。例如网站屏蔽等
PRE_ROUTING、FORWARD、POST_ROUTING构成在网络中的通信逻辑。例如转发、路由等任务
入站流量路径:
PREROUTING→ 路由 →INPUT→ 本地服务转发流量路径:
PREROUTING→ 路由 →FORWARD→POSTROUTING出站流量路径:本地进程 →
OUTPUT→POSTROUTING
数据包根据流向经过不同链,优先级从高到低:
| 链名称 | 触发时机 | 常用表 | 典型操作 |
|---|---|---|---|
| PREROUTING | 包刚进入网络栈 (路由决策前) | raw, mangle, nat |
DNAT、标记包 |
| INPUT | 包目标是本机进程 (路由后) | mangle, filter, security |
过滤入站流量 |
| FORWARD | 包需要转发到其他主机 | mangle, filter |
路由防火墙规则 |
| OUTPUT | 本机进程发出的包 | raw, mangle, nat, filter |
过滤出站流量 |
| POSTROUTING | 包离开网络栈前 (路由决策后) | mangle, nat |
SNAT、IP伪装 |
Iptables表的概念
我们对每个”链”上都放置了一串规则,但是这些规则有些很相似,比如:
- A类规则都是对IP或者端口的过滤;
- B类规则都是对报文进行修改的;
- C类规则都是进行地址转换的;
那么这个时候,我们是不是可以将实现相同功能的规则放在一起?
当我们把具有相同功能的规则集合在一起叫做”表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而 iptables 已经为我们定义了5种表,每种表对应了不同的功能。
表的功能
5个核心表(Tables),每个表负责特定类型的流量处理
| 表名称 | 核心功能 | 典型应用场景 | 包含的链 |
|---|---|---|---|
| filter | 默认表 • 包过滤(允许/拒绝流量) • 管理 INPUT/OUTPUT/FORWARD链• 负责过滤功能 | 防火墙基础规则 (如开放端口、IP黑白名单) | INPUT、OUTPUT、FORWARD |
| nat | 网络地址转换 • SNAT(源地址转换) • DNAT(目标地址转换) • MASQUERADE(动态IP伪装)• 负责网络地址转换功能 | 路由器网关 端口转发 负载均衡 | PREROUTING、INPUT、OUTPUT、POSTROUTING |
| mangle | 高级包修改 • 修改 IP 头信息(TTL、TOS) • 设置 MARK 标记 • 连接跟踪(conntrack)干预• 负责修改数据包内容 | QoS流量标记 VPN隧道处理 特殊路由策略 | INPUT,OUTPUT、 FORWARD、POSTROUTING、PREROUTING |
| raw | 连接跟踪豁免 • 绕过 Netfilter 连接跟踪机制 • 最高优先级处理• 关闭nat表上启用的连接追踪机制 | 高性能场景(如游戏服务器) 自定义跟踪逻辑 | PREROUTING、OUTPUT |
| security | 强制访问控制(MAC) • 集成 SELinux 安全上下文标记 | 多级安全系统 合规性审计(如金融、政府) | INPUT、OUTPUT、FORWARD |
实际使用中:filter 表和 nat 表占90%场景,mangle用于高级定制,raw/security较少使用。
表的优先级
四张表的优先级: raw –> mangle –> nat –> filter
注:防火墙规则遵从的是先匹配到谁选择谁。所以针对一个问题的两个相同规则。谁更靠前谁优先级越高,靠后的永远不会被执行到

几张表之间链存在重复。但两条链内容不相同,各自是独立的
表与链相关问题
问题1:来自
10.0.0.1的地址,访问本机的web服务请求不允许,应该在哪个表的哪个链上设定规则?很多同学会觉得是
PREROUTING链,但其实是INPUT链,因为我们要做的是过滤,而PREROUTING不能做过滤,所以是fliter表中的INPUT问题2:所有由本机发往 10.0.0.0/24 网段的 TCP 服务都不允许?
由本地发出会经过
OUTPUT、POSTROUTING、但由于POSTROUTING不⽀持做过滤,所以应该在fliter表中的OUTPUT规则链上配置。问题3:所有来自已本地内部的网络主机,像互联网发送
web服务器请求都允许?本地内部主机发送互联网经过
PREROUTING、FORWARD、POSTROUTING而能做过滤的只有FORWARD
Iptables规则管理
数据包的过滤是基于规则来实现的,而规则是由匹配条件+动作组成。那我们对规则的操作无⾮就是增删查改。
操作规则的语法: iptables [-t表名] 选项 [链名] [规则] [动作]
操作规则之前我们需要考量如下两个问题:
- 1)要实现什么功能:判断添加到哪个表上;
- 2)报文流经的路线:判断添加到哪个链上;
| iptables选项 | 含义 | 示例 |
|---|---|---|
| -t, –table | 指定要操作的表(默认filter) | iptables -t filter |
| -A, –append | 追加一条规则至链的末尾 | iptables -t filter -A INPUT |
| -I, –insert | 插⼊一条规则至链的顶部 | iptables -t filter -I INPUT |
| -D, –delete | 指定删除一条规则 | iptables -t filter -D INPUT 1 |
| -R, –replace | 替换选定链中的规则 | iptables -t filter -R INPUT |
| -S, –list-rules | 打印选定链中的所有规则 | iptables -t filter -S |
| -F, –flush | 清空链中的所有规则 | iptables -t filter -F |
| -Z, –zero | 将所有链中的数据包和字节计数器归零 | iptables -t filter -Z |
| -N, –new-chain | 创建自定义名称规则链 | iptables -N New_Rules |
| -E, –rename-chain | 给自定义链修改名称 | iptables -E Old_Rules New_Rules |
| -X, –delete-chain | 删除自定义链 | iptables -X Rules_Name |
| -P, –policy | 给链设定默认策略 | iptables -t filter -P DROP |
查看规则
1 | # 选项 |
添加规则
示例:允许其他任何主机 ping 通本机。
1 | [root@route ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT |
如何修改规则
示例:修改规则,拒绝其他任何主机 ping 通本机。
1 | [root@route ~]# iptables -t filter -R INPUT 1 -p icmp -j DROP |
如何删除规则
⽅法一:根据规则的编号去删除规则
⽅法二:根据具体的匹配条件与动作删除规则
1 | [root@route ~]# iptables -t filter -D INPUT 1 |
如何保存规则
1、默认 iptables 属于临时生效,所以需要将编写的规则永久存储起来;
1 | [root@route ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT |
2、清空 iptables 规则,然后恢复规则测试;
1 | [root@Route ~]# iptables -F |
Iptables基本匹配
我们前面在练习规则操作时,使用的”匹配条件”比较少,不够精准。我们可以通过 iptables 匹配更多的选项。
iptables匹配参数
| 条件参数 | 含义 |
|---|---|
| -p, –protocol protocol | 指明需要匹配的协议,如icmp、udp、tcp |
| -s, –source address[/mask][,…] | 指定匹配源地址,如有多个可以逗号分隔 |
| -d, –destination address[/mask][,…] | 指定匹配目标地址,如有多个可以逗号分隔 |
| –sport port[:port],–source-port | 指定源端口 |
| –dport port[:port],–destination-port | 指定目标端口 |
| -i, –in-interface name | 接收数据包的接口名称(网卡名) |
| -o, –out-interface name | 发送数据包的接口名称(网卡名) |
| -m, –match match | 执行需要使用的匹配项,属于扩展匹配 |
| -j, –jump target | 执行匹配规则后的动作、ACCEPT、DROP、REJECT等 |
匹配示例
1、仅允许 10.0.0.100 访问 10.0.0.20 服务器的 80 端口、其他地址全部拒绝。
1 | [root@route ~]# iptables -t filter -I INPUT -s 10.0.0.100 -d 10.0.0.20 -p tcp --dport 80 -j ACCEPT |
2、所有来访问本机的协议,属于 TCP 协议通通都放行;(像Chrony就不属于TCP)
1 | [root@route ~]# iptables -F |
3、凡是由本机发出的 TCP 协议报文,都允许出去,其他协议不行
1 | [root@route ~]# iptables -F |
4、禁止其他主机从 eth0 向本机发送 ping 请求
1 | [root@route ~]# dnf -y install net-tools |
5、允许从本机向外发送 ping 请求、以及允许 22/tcp 端口向外发送请求,除此外其他的协议和端口都不允许;
1 | [root@route ~]# iptables -t filter -I OUTPUT -p icmp -j ACCEPT |
Iptables扩展匹配
前面我们已经对 iptables 中的基本匹配条件有了基本的认识,接下来,我们来认识一些新的扩展模块。
multiport模块
multiport 模块可以一次添加多个不连续的端口; -m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]
1、示例 :允许 10.0.0.100 访问本机 20、21、80、443 ;
1 | [root@Route ~]# iptables -F |
iprange模块
iprange 模块可以指定 “一段连续的IP地址范围”;用于匹配报文的源地址或者目标地址, iprange 扩展模块中有两个扩展匹配条件可以使用。
[!] --src-range from[-to]: 原地址范围[!] --dst-range from[-to]: 目标地址范围
1、示例:如果 10.0.0.5-10.0.0.10 地址段 ping 本机,则拒绝;
1 | [root@route ~]# iptables -t filter -F |
string模块
string 模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则可以执行相应的动作。
--algo {bm|kmp}:字符匹配的查询算法;[!] --string pattern:字符匹配的字符串;
1、如果应用返回的报文中包含字符 “hello“ ,我们就丢弃当前报文,其余正常通过。
1 | [root@route ~]# iptables -F |
time模块
time 模块,可以根据时间段区匹配报文,如果报文到达的时间在指定的时间范围内,则符合匹配条件。 (该模块在RockyLinux9不⽀持,因为rocky9里的底层框架更改了)
--timestart hh:mm[:ss]:开始时间--timestop hh:mm[:ss]:结束时间[!] --monthdays day[,day...]:指定一个⽉的某一天[!] --weekdays day[,day...]:指定周一到周天--kerneltz:使用内核时区而不是UTC时间
示例:拒绝每天 8:30~12:30(00:30~04:30)、13:30~18:30(05:30~10:30) ,任何主机发送 icmp 协议;
注:无法接多个起始时间和结束时间。只能一个个时段分开写
1 | # utc时间,与本地快8小时,所以需要-8小时 |
icmp模块
icmp 模块:可以控制其他主机无法ping同本机,但本机可以ping同其他主机;
默认情况当禁止 ping 后,其他主机无法 ping 通本主机,本主机也无法 ping 通其他主机,现需要本主机可以 ping 通其他主机,而其他主机依然无法 ping 同本主机.
[!] --icmp-type {type[/code]|typename}ICMP类型,echo-request(请求)、echo-reply(回应)
1、配置icmp扩展模块
1 | # 常规做法不满足需求 |
connlimit模块
connlimit 扩展模块,限制每个客户端IP地址到服务器的并发连接数。
--connlimit-upto n:如果现有连接数小于或等于n,则匹配。--connlimit-above n:如果现有连接数大于n,则匹配。
DDOS 攻击脚本程序,模拟大量的并发数连接;下载flood_connect.c
设定Iptables规则(开启并发限制—对单个IP限制最大链接数)
1 | [root@Route ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP |
limit模块
limit 模块,限制单位时间内流⼊包的数量;可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。
- –limit rate[second|minute|hour|day] :平均匹配的速率
- –limit-burst number :超过限制速率的包,允许超过 burst 所设定值,默认可超出5个
1、限制主机每分钟接收 10个icmp 数据包,差不多6s会接收客户端一个数据包。
1 | [root@route ~]# iptables -t filter -F |
2、允许icmp瞬间通过10个数据包通过,超过的数据包每分钟仅能通过一个。
1 | [root@route ~]# iptables -t filter -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT |
3、限制主机传输时的带宽每秒不超过 500k ; (500k * 1000=500000字节/1500=333个包) 单位换算网站
- 500k指的是 500 KBps(千字节每秒)
- 500k是 500 KBps:500 * 1024 Bytes = 512,000 Bytes或有时按 1000算 500 * 1000 = 500,000 Bytes。
- 以太网标准的最大传输单元 (MTU) 通常是 1500 字节。这指的是 IP 数据包的最大载荷(不包括以太网帧头等开销)
- 为了达到 500,000 字节/秒的速率,如果每个包都满载 (1500 字节),那么每秒最多需要发送的包数就是:总字节速率 / 每个包的字节数 = 500,000 Bps / 1500 Bytes/packet ≈ 333.333 packets/s
- 所以,333 个包/秒是理论上的最大值。
1 | [root@route ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 300/second -j ACCEPT |
tcp-flags模块
使用 tcp 模块的 --tcp-flags 可以对 TCP 的标志位进行匹配,匹配指定标志位的值是否为”1”;
在tcp协议建立连接的过程中,需要先进行三次握手,而三次握手就要依靠tcp头中的标志位进行。
:::color2
TCP 报文头中有 6 个控制标志位:
- SYN (Synchronize):用于建立连接
- ACK (Acknowledgment):确认收到数据
- FIN (Finish):用于终止连接
- RST (Reset):重置连接
- PSH (Push):要求立即传递数据
- URG (Urgent):紧急数据
:::
- 第一次:客户端向服务端发起 TCP 连接,在 TCP 的 flag 标志位中, SYN,RST,ACK,FIN 等仅 SYN 为1,其他标志位为0。
- 第二次:服务端向客户端返回 ACK ,在 TCP 的 flag 标志位中, SYN,RST,ACK,FIN 等标志位仅 SYN、ACK 为1,其他标志位为0。
- 第三次:客户端向服务端返回 ACK ,在 TCP 的 flag 标志位中, SYN,RST,ACK,FIN 等标志位仅 ACK 为1,其他标志位为0。
我们可以通过 –tcp-flag 指明需要匹配哪些标志位,然后再指明这些标志位中,哪些必须为1,剩余的都必须为0。
所以当服务器接收新请求时,SYN标志位必须1,其他的标志位为0,而服务端响应这个连接时, SYN、ACK 标志位必须为1,其他的标志位为0。(这样可以避免木马程序通过端口主动向外发送新连接。)
示例:客户端连接服务端22端口第一次握手必须是客户端发起的,所以SYN必须为1,剩下全部为0。然后服务端可以通过22端口返回对应的报文。
1 | # 使用"--syn"选项相当于使用"--tcp-flags SYN,RST,ACK,FIN SYN" |
Iptables连接追踪state
什么是连接追踪
state(conntrack) 连接跟踪,顾名思义,就是跟踪(并记录)连接的状态。 如下图:是一台 IP 地址为 10.1.1.2 的 Linux 机器,我们能看到这台机器上有三条连接:
- 机器访问外部
HTTP服务的连接(目的端口 80) - 外部访问机器内
FTP服务的连接(目的端口 21) - 机器访问外部
DNS服务的连接(目的端口 53)
连接跟踪所做的事情就是发现并跟踪这些连接的状态;但这个追踪状态与TCP协议没有关系。
它是由内核 nefilter 在IP层实现,可IP层是无连接、无追踪的,那是如何知道这个IP是否存在;
当用户发送请求时,会将用户的请求信息存储在内存开辟的空间中,对应在 /proc/net/nf_conntrack 文件会记录源IP、目标IP、协议、时间、状态、等信息;当用户再次发起请求,就可以通过文件获取该用户是否来过,以此来实现连接追踪机制;
注意:该文件能存储的条目是受 /proc/sys/net/nf_conntrack_max 设定大小所限;