一、IPTABLES 防火墙基础
1.1 防火墙简介
- 定义 :防火墙是控制网络数据进出、按规则放行或拦截,防止非法访问与攻击的安全防护系统。
- 防火墙分为两大类:
- 硬件防火墙(类似于交换机)
- 软件防火墙
- 主机型软件防火墙(单主机防护,只保护本机,管控本机进出流量)
- 网络型软件防火墙(整机做网关,防护整个内网所有设备)
- Linux 常用防火墙
firewalld:底层依旧调用 IPTABLES 实现功能;IPTABLES:传统 Linux 包过滤防火墙。

防火墙的工作层级:
iptables 是基于内核 Netfilter 框架的防火墙工具,作用于 TCP/IP 协议栈的多个层级(主要在网络层和传输层),通过对数据包的过滤、修改和转发来实现网络安全策略。用户通过 iptables 命令配置规则,由 Netfilter 在内核态执行。
简单讲,iptables / Netfilter 主要工作在网络层(IP 层),但它同时具备感知和操作传输层(TCP/UDP)以及部分应用层信息的能力
1.2 停用 firewalld 并使用 IPTABLES
使用 IPTABLES 前需关闭 firewalld 服务,并禁止开机自启,相关操作命令如下:
bash
# 关闭 firewalld 服务
[root@localhost ~]# systemctl stop firewalld
# 设置 firewalld 禁止开机自启
[root@localhost ~]# systemctl disable firewalld
# 查看 firewalld 运行状态(确认已停止)
[root@localhost ~]# systemctl status firewalld
# 查看 firewalld 开机自启状态(确认已禁用)
[root@localhost ~]# systemctl is-enabled firewalld
1.3 IPTABLES 四表五链结构
核心架构:四表五链 ,是 IPTABLES 核心组成。
-
四张表:
raw状态跟踪表、mangle包标记表、nat地址转换表、filter过滤表(默认表,过滤的核心)。 -
五条链:
INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
(五条链是内核预先设置的钩子点,数据包走到对应节点时,就会匹配该链上你写的所有规则)
过滤可以在INPUT和OUTPUT设置,一般在INPUT设置最佳

四张表(优先级顺序:raw → mangle → nat → filter)
表的优先级代表数据包处理先后顺序,优先级越高越早处理。
- raw 表(连接跟踪表)
作用:关闭/开启连接跟踪,规避状态检测性能消耗,极少使用。
内置链:PREROUTING、OUTPUT - mangle 表(修改数据包标记)
作用:修改数据包TTL、TOS、MARK标记,用于路由策略、流量限速。
内置链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING(五链全覆盖) - nat 表(地址转换表)
作用:源地址转换SNAT、目的地址转换DNAT、端口映射。不做过滤 。
内置链:- PREROUTING:DNAT(入站端口映射)
- POSTROUTING:SNAT/MASQUERADE(内网上网伪装)
- OUTPUT:本机出站DNAT
- filter 表(过滤表,默认表)
作用:唯一能放行/丢弃数据包的表,做访问控制、防火墙策略。
内置链:INPUT、FORWARD、OUTPUT- INPUT:发给本机的包
- OUTPUT:本机发出的包
- FORWARD:跨主机转发的包(内网访问外网)
五条链(数据包流经的钩子点)
- PREROUTING
数据包刚到达网卡,还未路由判断。
适用:DNAT、打标记、关闭连接跟踪。 - INPUT
路由判断后,数据包目标是本机进程。
适用:本机防火墙拦截外部访问本机端口。 - FORWARD
路由判断后,数据包需要跨网卡转发(本机当网关)。
适用:内网设备上网、网段之间访问控制。 - OUTPUT
本机程序主动向外发送数据包。
适用:限制本机主动对外访问。 - POSTROUTING
数据包即将离开本机网卡,路由完成后。
适用:SNAT、地址伪装。
filter 过滤表 (最常用)
包含三条链:INPUT、OUTPUT、FORWARD。

1.4 包过滤匹配流程
- 规则链内的匹配顺序
- 按规则顺序比对 , 匹配即停止 (
LOG日志动作除外) - 若无任何匹配,则执行当前链的默认策略。
- 按规则顺序比对 , 匹配即停止 (
1.5 实验环境搭建
采用模板机链接克隆出 3 台虚拟机,搭配 WindTerm 远程连接,网络及主机规划如下:

二、IPTABLES 基本用法
Linux 系统默认自带 iptables 命令,可直接配置临时防火墙规则;若需要通过 systemctl 管理 iptables 服务、实现规则开机持久加载 ,CentOS/RHEL 系列必须手动安装 iptables-services 软件包
(但事实上临时的也足够使用,因为实际生产环境中服务器一般数年都不会重启)
2.1 通用注意事项
- 命令不指定表名时,默认使用 filter 表;
- 不指定链名时,默认作用于当前表的所有链;
- 无规则匹配时,执行链(防火墙)的默认规则;
- 规范:选项、链名、目标操作(-j 后的 target)用大写字母,其余参数小写;
- 程序路径:
/sbin/iptables。
2.2 命令通用格式
iptables [-t 表名] 选项 [链名] [匹配条件] [-j 目标操作]
(如果不指定表,则默认对filter表进行操作)
- proxy主机操作
bash
[root@proxy ~]# iptables -t filter -I INPUT -p icmp -j REJECT #拒绝icmp协议,-t 指定表名,-p指定数据包协议
[root@client ~]# ping 192.168.4.5 #client主机ping测试,不通
From 192.168.4.5 icmp_seq=1 Destination Port Unreachable
From 192.168.4.5 icmp_seq=2 Destination Port Unreachable
2.3 基本目标操作(规则动作)
| 动作 | 作用说明 |
|---|---|
| ACCEPT | 允许数据包通过、放行 |
| DROP | 直接丢弃数据包,不返回任何回应 |
| REJECT | 拒绝数据包通过,会返回拒绝提示信息 |
| LOG | 记录数据包日志,匹配后继续向下匹配下一条规则 |
使用DROP会直接丢弃数据包,不返回任何回应,可以节省资源,增加安全性
补充规则:除 LOG 外,其余动作匹配即停止规则匹配。
2.4 常用管理选项

注意!关于条件拒绝的条件一定要注意添加的方式(A/I)!拒绝范围越宽泛的规则应越靠底部
2.5 规则管理实操示例
2.5.1 添加规则
- 添加新的规则:
-A末尾追加-I开头插入
注意:只有-I(insert 插入)支持带数字位置 ;-A(append 追加)不支持跟数字,语法直接报错
bash
# filter表 INPUT 链末尾追加规则:允许所有 tcp 协议数据包
[root@proxy ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
# filter表 INPUT 链开头插入规则:允许所有 udp 协议数据包
[root@proxy ~]# iptables -I INPUT -p udp -j ACCEPT
# filter表 INPUT 链第2行位置插入规则:允许所有 icmp 协议数据包
[root@proxy ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
2.5.2 查看规则列表
-L:查看-n:以数字的形式展示--line-numbers:查看规则时间,标记序号
bash
# 查看 filter 表 INPUT 链规则(默认格式,会解析域名)
[root@proxy ~]# iptables -t filter -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
REJECT icmp -- anywhere anywhere reject-with icmp-port-unreachable
ACCEPT tcp -- anywhere anywhere
# 数字格式查看规则(不解析域名,推荐使用)
[root@proxy ~]# iptables -t filter -nL INPUT
Chain INPUT (policy ACCEPT)
#动作 协议 源地址 目标地址
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
# 数字格式 + 显示规则的序号(精准定位规则)
[root@proxy ~]# iptables -t filter -nL INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
2.5.3 删除、清空规则
--D:删除指定规则(-D 是删除单条规则,必须跟「行号」或「完整规则匹配条件」)
-F:清空(-F指定表和链,则清除链内所有规则;-F指定表不指定链,会清除表内所有规则;-F什么都不指定,默认清除filter表的所有规则)
bash
# 删除 filter 表 INPUT 链中第 3 条规则
[root@proxy ~]# iptables -D INPUT 3
#等同于:iptables -t filter -D INPUT 3
# 查看规则验证删除结果
[root@proxy ~]# iptables -nL INPUT --line-numbers
# 清空 filter 表所有链的规则
[root@proxy ~]# iptables -F
# 查看验证
[root@proxy ~]# iptables -nL
# 单独清空 nat 表所有规则
[root@proxy ~]# iptables -t nat -F
# 单独清空 mangle 表INPUT链的所有规则
[root@proxy ~]# iptables -t mangle -F INPUT
2.5.4 设置链默认规则
- 所有链初始默认规则均为
ACCEPT(默认规则优先级最低) - 通过 -P 选项可重置默认规则
- 若将
INPUT链默认规则设为DROP,会直接断开 SSH 远程连接。 - 注意!默认规则只能是
ACCEPT或者DROP,不可以是REJECT
- 若将
bash
# 将 INPUT 链默认规则设置为 DROP(拒绝所有未匹配数据包)
[root@proxy ~]# iptables -P INPUT DROP
#等同于:iptables -t filter -P INPUT DROP
# 查看 INPUT 链默认规则
[root@proxy ~]# iptables -nL INPUT | head -1
# 将 INPUT 链默认规则恢复为 ACCEPT
[root@proxy ~]# iptables -P INPUT ACCEPT
# 再次查看默认规则
[root@proxy ~]# iptables -nL INPUT | head -1
三、防火墙匹配条件
3.1 匹配条件分类
- 通用匹配 :可直接独立使用,不依赖其他条件,包含:协议、IP 地址、网卡接口等。如:
-p 协议名:协议匹配-s 源地址/-d 目标地址:地址匹配-i 入站网卡/-o 出站网卡:接口匹配
- 隐含匹配 :依赖前置匹配协议 ,包含:端口、ICMP 类型等。如:
--sport 源端口/--dport 目标端口:端口匹配--icmp-type ICMP 类型:ICMP 类型匹配
- 取反条件 :使用英文感叹号
!实现条件取反。
3.2 过滤规则实战示例
3.2.1 封禁指定 IP / 网段(黑名单)
bash
# 拒绝单个 IP:192.168.4.120 访问本机
[root@proxy ~]# iptables -A INPUT -s 192.168.4.120 -j DROP
# 拒绝整个网段:10.0.10.0/24 所有主机访问本机
[root@proxy ~]# iptables -A INPUT -s 10.0.10.0/24 -j DROP
# 查看规则
[root@proxy ~]# iptables -nL
3.2.2 保护指定服务(限制端口访问,黑白名单)
示例:仅指定网段可访问 22 端口(SSH),其余网段全部拒绝。
bash
# 允许 192.168.4.0/24 网段访问本机 22 目标端口
[root@proxy ~]# iptables -A INPUT -s 192.168.4.0/24 -p tcp --dport 22 -j ACCEPT
# 允许 192.168.8.0/24 网段访问本机 22 目标端口
[root@proxy ~]# iptables -A INPUT -s 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT
# 不指定IP地址就是拒绝所有其他网段访问本机 22 目标端口
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
-
**
--dport**指代目标端口。- INPUT链(别人访问本机):--dport 就是本机端口
- OUTPUT 链(本机访问外部):--dport 是对方机器端口。
-
**
--sport**指代源端口- 指代发出这个数据包的主机的端口,永远是发送端的端口,和本机 / 对方无关
3.2.3 禁 Ping 配置
ping的通信流程(A ping B):

可以看到ping请求的通信是双向的
Ping 基于 ICMP 协议,分为请求包(echo-request)和响应包(echo-reply)。
需求:本机可以 Ping 其他主机,其他主机无法 Ping 本机。
- 使用INPUT链或者OUTPUT均可
方式一:配置 INPUT 链(拦截入站 Ping 请求)
bash
# 拦截所有 ICMP 回显请求(外部主机 Ping 本机)
[root@proxy ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 放行其余 ICMP 数据包(本机 Ping 外部的响应包)
[root@proxy ~]# iptables -A INPUT -p icmp ! --icmp-type echo-request -j ACCEPT
原理就是:丢掉所有的外来的echo-request请求(因为INPUT进的就是请求),但是放行除了echo-request其他所有包,并且因为自己的ping走的是自己的OUTPUT,所以自己ping不受影响,但可以拒绝别的ping。
方式二:配置 OUTPUT 链(控制出站 ICMP)
bash
# 放行本机向外发送的 Ping 请求
[root@proxy ~]# iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
# 拦截其余出站 ICMP 数据包
[root@proxy ~]# iptables -A OUTPUT -p icmp ! --icmp-type echo-request -j DROP
这个的原理是:放行自己发出的echo-request,对方回应的包并不是echo-request类型,且OUTPUT 链只管本机发出去的包,不管别人发给本机的包,所以对方的回复不会被拦截,所以本机自己的ping从发送请求到接收回应都不会收影响。
第二个命令拦截所有出站、类型不是 echo-request 的 ICMP 报文,所以外部的ping能进来,但是本机的回复是echo-reply,会被拦截,出不去
测试结果:
proxy主动 Ping 其他主机:正常通信;client/web1Pingproxy:无法通信。
四、主机型 & 网络型防火墙
4.1 防火墙类型区分
- 主机型防火墙 :保护服务器自身,规则作用于本机 ,仅保护防火墙自身(使用
INPUT/OUTPUT链); - 网络型防火墙 :保护其他服务器,作为网关/路由 ,转发跨网段数据,保护内网其他服务器(核心使用
FORWARD链)。

4.2 开启内核 IP 转发(路由功能)
Linux 可作为软路由,跨网段转发数据包,网络型防火墙必须开启 IP 转发。

bash
# 写入配置文件,永久开启 IPv4 转发
[root@proxy ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
# 刷新内核配置,立即生效
[root@proxy ~]# sysctl -p
# 清空原有防火墙规则,准备配置网络策略
[root@proxy ~]# iptables -F
# 查看规则
[root@proxy ~]# iptables -nL
4.3 后端 Web 服务部署(web1 主机)
bash
# 安装 httpd 网站服务
[root@web1 ~]# dnf -y install httpd
# 编写测试网页
[root@web1 ~]# echo "test page" > /var/www/html/index.html
# 启动 httpd 服务
[root@web1 ~]# systemctl restart httpd
# 清空 web1 自身防火墙规则
[root@web1 ~]# iptables -F
4.4 网络型防火墙转发规则测试
- 未配置转发规则时,
client可正常跨网段访问web1(需提前配置 client 网关为 192.168.4.5)
bash
[root@client ~]# curl 192.168.8.100
test page
- 配置
FORWARD链规则,拦截client访问web1的 80 端口
bash
# 拒绝 192.168.4.100 访问 目标 TCP 80 端口(跨网段转发拦截)
[root@proxy ~]# iptables -I FORWARD -s 192.168.4.100 -p tcp --dport 80 -j DROP
# 查看 FORWARD 链规则
[root@proxy ~]# iptables -nL FORWARD
# 客户端再次访问,无响应(拦截生效)
[root@client ~]# curl 192.168.8.100
INPUT和OUTPUT防护的是本机,若要拦截经过本机路由转发、属于其他主机之间的流量,必须配置在 FORWARD 链。
注意!INPUT、OUTPUT 是 Linux netfilter 在OSI 三层(网络层 IP 协议栈) 设置的过滤关卡;它们可以读取四层传输层(TCP/UDP/ICMP)的信息作为匹配条件,但自身不属于四层
五、扩展规则匹配
5.1 扩展模块基础语法
依赖系统防火墙模块,格式:
bash
-m 扩展模块 --扩展条件 条件值
示例:-m mac --mac-source 00:0C:29:74:BE:21
5.2 常用扩展匹配类型

5.3 MAC 地址匹配
- 使用-m mac模块,不管其IP地址改为多少,根据mac地址封锁主机
- 适用于交换网络,针对源MAC地址
- proxy主机操作,禁止client主机的mac地址,每个人的mac地址不一样
根据物理 MAC 地址封锁主机,修改 IP 也无法绕过规则,适用于局域网。
bash
# 拦截指定 MAC 地址的主机访问本机
[root@proxy ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:7a:4c:ff -j DROP
# 清空规则
[root@proxy ~]# iptables -F
# 验证清空结果
[root@proxy ~]# iptables -nL
如何查看mac地址:使用ifconfig命令,其中ether后的一串数字就是mac地址:

5.4 多端口匹配(multiport)
一条规则放行多个端口,连续端口用冒号 : 分隔,离散端口用逗号 , 分隔。
bash
# 一次性放行 20-22、25、80、110、143、16501-16800 端口
[root@proxy ~]# iptables -A INPUT -p tcp -m multiport --dports 20:22,25,80,110,143,16501:16800 -j ACCEPT
# 查看规则
[root@proxy ~]# iptables -nL
5.5 IP 范围匹配(iprange)
精准控制一段连续 IP 地址的访问权限
示例:仅 192.168.4.1~192.168.4.3 可 SSH 登录,禁止从 192.168.4.0/24 网段其他的主机登录
bash
# 允许 192.168.4.1 ~ 192.168.4.3 访问 22 端口
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.4.1-192.168.4.3 -j ACCEPT
# 拒绝该网段其余所有主机访问 22 端口
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
注意:为什么这里
iptables -A INPUT -p tcp --dport 22 -s 192.168.4.0/24 -j DROP
和之前3.2练习的
iptables -A INPUT -s 192.168.4.0/24 -p tcp --dport 22 -j ACCEPT
指定ip的位置不一样?
因为iptables的匹配条件的逻辑是"与"关系,且iptables 的匹配顺序不影响逻辑。iptables允许在规则中以任意顺序指定匹配条件,只要语法正确,顺序不影响功能。
六、整体知识点总结
- 理解防火墙定义、分类,掌握 Linux 下 firewalld 关闭与 IPTABLES 切换操作;
- 熟记 IPTABLES 四表五链架构、filter 表作用与数据包匹配流程;
- 熟练使用 IPTABLES 基础命令:添加、查看、删除、清空规则、设置默认策略;
- 掌握四大基础动作:
ACCEPT、DROP、REJECT、LOG的区别; - 学会通用匹配、隐含匹配,实现封禁 IP、限制端口、禁 Ping 等常规策略;
- 区分主机型防火墙 和网络型防火墙,掌握 Linux 内核 IP 转发开启方式与 FORWARD 链使用;
- 掌握扩展模块用法:MAC 地址、多端口、IP 范围匹配,实现复杂防火墙规则配置。