【Day 77】Linux-iptables防火墙
一、防火墙介绍
防火墙是加强业务发访问安全性,是网络安全的核心组件,通过制定规则对进出网络的数据包进行过滤和控制,实现网络访问的精细化管理。
1. 类型
- 硬件防火墙:以独立硬件设备形式存在,具备专用芯片和操作系统,处理性能强、稳定性高,适用于大型网络边界防护(如企业出口网关、数据中心边界)。华为、山石、飞宇星、深信服
- 软件防火墙:基于操作系统内核实现,通过软件模块(如 Linux 的 netfilter)提供防护功能,成本低、配置灵活,适用于服务器单机或小型网络环境(如 CentOS 7 系统中的 iptables 和 firewalld)。
2. 作用
防火墙的核心作用是数据过滤,基于网络五元素(源 IP、目的 IP、源端口、目的端口、协议)制定规则,实现以下功能:
- 允许合法流量通过(如允许内部主机访问外部 HTTP 服务);
- 阻止非法流量入侵(如拒绝外部 IP 对内部 SSH 端口的暴力破解);
- 记录网络访问日志,用于审计和故障排查;
- 实现地址转换(如 NAT 功能,解决内网 IP 与公网通信问题)。
3.防火墙架设
架设位置 | 防护目标 |
---|---|
企业内网(LAN)与互联网(Internet)之间 | 外网恶意流量拦截 |
企业内网的 “不同职能区域” 之间 | 内网横向渗透防护 |
数据中心 “DMZ 区(非军事区)” 与 “内网核心业务区” 之间; 或 “外网业务区” 与 “核心数据库区” 之间。 | 核心业务与公开业务隔离 |
企业分支机构与总部的 “专线 / VPN 链路” 两端; 或分支机构内网与总部内网之间 | 跨地域 VPN 加密与身份验证 |
企业本地数据中心与公有云之间; “云内业务区” 与 “本地核心区” 之间(通过专线 / 云 VPN 互联) | 云 - 地流量加密与协同防护 |
Windows的软件防火墙
4. 防火墙功能的实现
- 内核模块:Linux 内核中的netfilter框架是防火墙功能的底层实现,负责在数据包流经内核的关键节点(如入站、出站、转发)对数据包进行拦截和处理。
- iptables:
- 操作 netfilter 的命令行工具,用于定义、管理和应用防火墙规则;
- iptables 规则被加载到内核的 netfilter 钩子点,重启后内核状态丢失(需手动保存);
- 管理方式:iptables 需手动编写复杂规则链;
- 适用场景:iptables 适合简单固定规则场景;
- firewall-cmd:
- firewall-cmd是 firewalld 服务的管理工具,为 iptables 提供了更高层的抽象接口。
- firewalld 提供图形化(firewall-config)和命令行工具,支持批量规则管理。
- firewalld 内部维护 “运行时规则” 和 “永久规则”,修改后通过
--reload
合并到运行时,无需像 iptables 那样重新加载整个规则集,避免中断现有连接。 - firewalld 规则存储在配置文件中,支持持久化保存。
- firewalld 更适合需要频繁修改规则、多区域隔离的复杂环境。
- iptables 是直接与 netfilter 交互的 “底层工具”,firewalld 则是在 iptables 之上封装的 “动态管理系统”,本质上仍通过 iptables 规则链生效。
二、iptables
(一)四表五链
iptables 是 CentOS 7 中基于 netfilter 内核模块的防火墙工具,通过 “表” 和 “链” 的结构组织规则,实现对数据包的分层处理。
五链(按数据包流经顺序划分)
netfilter(Linux 内核的防火墙框架)在 TCP/IP 协议栈的 5 个关键节点设置了 “钩子”函数(Hook),每个钩子对应一条默认链(Chain)。当数据包流经这些节点时,内核会触发对应的钩子,执行链中预设的规则(如 “允许”“拒绝”“转发”)。
简单理解:钩子是 “拦截位置”,链是 “该位置的规则列表”。
钩子函数 | 对应链 | 触发时机(数据包位置) | 核心作用 | 典型应用场景 |
PREROUTING | PREROUTING | 路由决策前 | 在路由前修改数据包(如修改目标 IP / 端口,实现端口映射、负载均衡)。 |
|
INPUT | INPUT | 数据包目标 IP 是本机;流经协议栈到达 “本机应用层” 前 | 控制 “哪些外部 IP / 端口可以访问本机服务”。 |
|
OUTPUT | OUTPUT | 本机应用层发出的数据包,从 “本机应用层” 流出到协议栈时 | 控制 “本机可以访问哪些外部资源”。 |
|
FORWARD | FORWARD | 需转发(目标非本机),在 “路由转发” 过程中 | 控制 “本机是否允许转发数据包”,即是否开启路由转发功能并限制转发规则。 |
|
POSTROUTING | POSTROUTING | 路由决策后 | 在数据包离开前修改(如修改源 IP,实现 NAT 地址转换)。 |
|
数据包在 Linux 内核中的流转路径决定了链的触发顺序:
PREROUTING
:路由前,数据包进入内核后首先经过,用于目标地址转换(nat 表)或标记(mangle 表);- 路由决策:
INPUT
:目标为本地的数据包经过此链,用于入站过滤(filter 表);FORWARD
:经过本机转发的数据包经过此链,用于转发过滤(filter 表);OUTPUT
:本机产生的数据包经过此链,用于出站过滤(filter 表)或地址转换(nat 表);
POSTROUTING
:路由后,数据包离开内核前最后经过,用于源地址转换(nat 表)。
每个链不止干一件事,比如有的要 “判断能不能过(过滤)”,有的要 “改地址(NAT 转换)”—— 这就需要不同的 “专项小组” 来负责,“四表” 就是这 4 个小组,各管一部分功能。
根据所能实现的功能不同,分为四表。
(1)filter 表:最常用的表,负责数据包过滤(允许 / 拒绝),是默认操作的表。包含 3 条链
[root@iptables ~] iptables -t filter -nL
Chain INPUT # 过滤流入本机的数据包(目标是本机 IP)
Chain FORWARD # 过滤经过本机转发的数据包(本机作为网关时生效)
Chain OUTPUT # 过滤从本机流出的数据包(源是本机 IP)
(2)nat 表:负责网络地址转换,实现内网与公网的通信。包含 3 条链:
[root@iptables ~] iptables -t nat -nL
Chain PREROUTING # 在数据包路由前修改目的地址(如端口映射 DNAT)
Chain INPUT # 当数据包的目标 IP是宿主机本身,且需要对这类数据包做地址转换时,才会经过 nat 表的 INPUT 链
# 宿主机有多个 IP,想让访问ip1的数据包,通过 DNAT 转换为访问ip2(目标都是宿主机,只是 IP / 端口转换),此时规则会加在 nat 表的 INPUT 链。
Chain OUTPUT # 处理本机产生的数据包的地址转换
Chain POSTROUTING # 在数据包路由后修改源地址(如源地址转换 SNAT)
示例场景1:nat
表如何实现 “内网访问公网”?
以常见的 “家庭路由器” 场景为例,理解 nat
表(尤其是 POSTROUTING
链)的工作流程:
-
内网设备发起请求:手机(192.168.1.5)访问百度(220.181.38.148),数据包源地址为 192.168.1.5,目的地址为 220.181.38.148。
-
路由判断:路由器收到数据包后,通过路由表判断 “目的地址是公网”,需从公网网卡(如 WAN 口,IP 为 123.123.123.123)发出。
-
POSTROUTING 链执行 SNAT:数据包进入 nat 表的 POSTROUTING 链,匹配到 “内网段(192.168.1.0/24)+ 出口网卡(WAN 口)” 的规则,将源地址从 192.168.1.5 改为路由器的公网 IP(123.123.123.123),同时记录 conntrack(标记 “192.168.1.5: 端口 ↔ 123.123.123.123: 映射端口”)。
-
公网响应返回:百度的响应数据包(目的地址 123.123.123.123)到达路由器,路由器通过 conntrack 找到对应的内网设备(192.168.1.5),将目的地址改为 192.168.1.5,最终转发给手机。
通过这个过程,私有 IP(192.168.1.5)借助 SNAT
伪装成公网 IP,实现了与公网的通信。
示例场景2:“公网访问内网 Web 服务器” 为例
-
网关(路由器)有公网 IP:
203.0.113.10
(WAN 口,网卡eth0
),内网 IP:192.168.1.1
(LAN 口,网卡eth1
)。 -
内网有 Web 服务器:
192.168.1.100:80
(仅内网可达)。 -
目标:让公网用户通过
203.0.113.10:8080
访问到内网服务器192.168.1.100:80
。
① 公网数据包到达网关,触发 PREROUTING
链的 DNAT 转换
公网用户发起请求:源地址=公网用户 IP:随机端口 → 目的地址=203.0.113.10:8080
。数据包进入网关后,先经过 nat
表的 PREROUTING
链,匹配到 DNAT 规则:
# iptables 规则:将公网 IP 的 8080 端口映射到内网服务器的 80 端口
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
-
规则作用:对从公网网卡(
eth0
)进入、目标端口为 8080 的 TCP 数据包,将其目的地址修改为 192.168.1.100:80。 -
转换后数据包:
源地址=公网用户 IP → 目的地址=192.168.1.100:80
。
② 路由判断与转发(需配合 filter
表放行)
DNAT 转换后,网关进行路由判断:“目的地址 192.168.1.100 属于内网,应从 LAN 口(eth1
)转发”。此时数据包进入 filter
表的 FORWARD
链,需配置规则允许转发(否则会被默认策略拦截):
# 允许从公网到内网服务器的 80 端口的转发
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
# 允许内网服务器的响应数据包返回公网(基于连接跟踪)
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport 80 -s 192.168.1.100 -m state --state ESTABLISHED,RELATED -j ACCEPT
③ 内网服务器响应,通过连接跟踪返回公网
内网服务器 192.168.1.100
收到请求后,生成响应数据包:源地址=192.168.1.100:80 → 目的地址=公网用户 IP
。响应数据包到达网关时,网关通过 conntrack
(连接跟踪)记录,自动将源地址从 192.168.1.100:80 还原为 203.0.113.10:8080(无需额外配置),最终返回公网用户。
(3)mangle 表:负责修改数据包的元数据(如 TTL、TOS 字段)、设置自定义标记。包含 5 条链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)。
(4)raw 表:控制 iptables 的连接跟踪机制,包含 2 条链(PREROUTING、OUTPUT)。
注意:
1、当数据包流经某一条链(如 INPUT、FORWARD 链)时,防火墙会 从链的第一条规则开始,逐条检查匹配条件:
- 一旦找到 第一条完全匹配 的规则(如 “允许 192.168.1.0/24 访问 22 端口”),就会执行该规则的动作(允许、拒绝、转发等),不再检查后续规则;
- 若遍历完所有规则都没有匹配项,则执行该链的 默认策略(通常是 “拒绝所有”
DROP
或 “允许所有”ACCEPT
,推荐默认DROP
以保证安全)。
2、数据包流转顺序 “PREROUTING→(INPUT/FORWARD/OUTPUT)→POSTROUTING” 中,本机产生的数据包(如本机 ping 外网)不会经过 PREROUTING 链,而是直接从 “应用层→OUTPUT 链→POSTROUTING 链→出本机”。比如:本机访问外网百度,数据包路径是「本机应用层 → OUTPUT 链(过滤 /nat 转换)→ POSTROUTING 链(SNAT 改源 IP)→ 外网」,跳过 PREROUTING。
(二)iptables 操作
在 CentOS 7 中,默认防火墙工具是firewalld,但如果要使用iptables,需要先禁用firewalld并启用iptables服务。
# 停止并禁用firewalld
systemctl stop firewalld
systemctl disable firewalld# 安装iptables服务(若未安装)
# 保存规则到文件,实现开机持久化:安装后可通过 service iptables save 将当前规则保存到 /etc/sysconfig/iptables
# 系统重启后规则会自动加载(否则临时规则重启后会丢失)
yum install -y iptables-services# 启动并设置iptables开机自启
systemctl start iptables
systemctl enable iptables
iptables 命令格式:iptables [-t 表名] 操作选项 [链名] [匹配条件] [-j 目标动作]
1. 查看规则
-
查看指定表的规则(默认 filter 表):
iptables -nL # 查看filter表所有链的规则(默认filter表) iptables -t filter -nL # 查看filter表所有链的规则(-n:IP不解析为域名,-L:列出规则) iptables -t nat -nL # 查看nat表所有链的规则iptables -nL --line-numbers # 显示规则行号(用于删除规则) iptables -nL --line-numbers -v # 显示详细信息(如数据包计数、网卡)iptables -t filter -nL INPUT --line-numbers # 查看INPUT链的默认策略(末尾的"policy"字段) # policy DROP:INPUT 链的默认策略为 DROP(未匹配任何规则的数据包会被
2. 删除规则
-
清空指定表的所有规则(默认 filter 表):
iptables -F # 清空filter表所有链的规则(-F:flush) iptables -D 链名 规则序号 # 方式1:通过规则在链中的序号删除 iptables -D 链名 规则内容 iptables -t nat -F # 清空nat表所有链的规则 [root@iptables ~] iptables -nL INPUT # DROP tcp -- 1.1.1.1 0.0.0.0/0 tcp dpt:80 # DROP tcp -- 1.1.1.2 0.0.0.0/0 tcp dpt:80 # DROP tcp -- 1.1.1.3 0.0.0.0/0 tcp dpt:80[root@iptables ~] iptables -D INPUT 1 [root@iptables ~] iptables -nL INPUT # Chain INPUT (policy ACCEPT) # target prot opt source destination # DROP tcp -- 1.1.1.2 0.0.0.0/0 tcp dpt:80 # DROP tcp -- 1.1.1.3 0.0.0.0/0 tcp dpt:80[root@iptables ~] iptables -D INPUT -p tcp -s 1.1.1.2 --dport 80 -j DROP [root@iptables ~] iptables -nL INPUT # Chain INPUT (policy ACCEPT) # target prot opt source destination # DROP tcp -- 1.1.1.3 0.0.0.0/0 tcp dpt:80
3. 编写规则
-
设置链的默认策略(如默认允许 / 拒绝):
iptables -P INPUT ACCEPT # 设置INPUT链默认策略为允许(-P:policy) iptables -P FORWARD DROP # 设置FORWARD链默认策略为拒绝
规则由 “匹配条件” 和 “目标动作” 组成,核心是通过网络五元素定义匹配条件,通过-j
指定动作(ACCEPT 允许、DROP 拒绝、REJECT 拒绝并返回信息等)。
iptables [-t 表名] [操作命令] [链名] [匹配条件] -j 目标动作
基本选项
-t
:表名- 操作命令
-I
:在链的开头插入规则(优先级高,先匹配);-A
:在链的末尾追加规则(优先级低,后匹配);-R
:替换
- 链名
- 匹配条件(网络五元素):
-s
:源 IP(支持单个 IP、网段,!-s 表示 “非”);-d
:目的 IP;-p
:协议(tcp/udp/icmp
);--sport
:源端口(需配合-p
使用);--dport
:目的端口(需配合-p
使用);--icmp type
:定义 “匹配什么类型的 ICMP 包
-i
:流入网卡(如-i ens33
,仅对 INPUT、FORWARD、PREROUTING 链有效);-o
:流出网卡(如-o ens33
,仅对 OUTPUT、FORWARD、POSTROUTING 链有效)。
-j
:动作(ACCEPT/
DROP/REJECT/SNAT/DNAT/MASQUERADE/LOG
)
常用规则示例
假设本机ip是192.168.140.10
-
仅允许特定 IP(192.168.140.1)通过 SSH访问本机,拒绝其他所有 IP 的 SSH 访问
iptables -I INPUT -s 192.168.140.1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP iptables -I OUTPUT -d 192.168.140.1 -p tcp --sport 22 -j ACCEPT
-
允许所有主机都能访问本机的 HTTP 服务(80 端口):
iptables -I INPUT -d 192.168.140.10 -p tcp --dport 80 -j ACCEPT
-
拒绝 10.0.0.5 访问本机的所有端口:
iptables -I INPUT -s 10.0.0.5 -j DROP # 插入到开头,优先匹配
-
允许本机 ping 其他主机(ICMP 协议):
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT # --icmp-type echo-request:指定 ICMP 报文类型为 echo-request(即 “ping 请求”,对应 ping 命令发送的数据包)。
-
允许外部主机 ping 本机:
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # echo-reply(ping 回应)
ICMP 数字类型 | 对应字符名称 | 功能说明 | 常用场景 |
---|---|---|---|
0 | echo-reply | ICMP 回显回应(即 “ping 的回复包”) | 本机回复其他主机的 ping 请求 |
8 | echo-request | ICMP 回显请求(即 “ping 的请求包”) | 其他主机向本机发起 ping 请求 |
-
仅允许 ens33 网卡接收来自 172.16.0.0/12 网段的 HTTPS(443 端口)流量:
iptables -A INPUT -i ens33 -s 172.16.0.0/12 -p tcp --dport 443 -j ACCEPT
-
要允许 “本机访问本机” 的所有流量通过(包括本地进程间通信、回环地址访问等)
# 允许所有通过回环接口(lo)的入站流量(本机接收的内部请求)
iptables -A INPUT -i lo -j ACCEPT# 允许所有通过回环接口(lo)的出站流量(本机发起的内部请求)
iptables -A OUTPUT -o lo -j ACCEPT
-
配置防火墙允许
yum
命令正常工作
# 注意双向通信:不仅要允许本机发起的出站请求,还要允许仓库返回的入站响应。
# 允许 DNS 服务器返回的入站响应(源端口是 53)
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# 允许 HTTP 仓库返回的入站响应(源端口是 80)
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
# 允许 HTTPS 仓库返回的入站响应(源端口是 443)
iptables -A INPUT -p tcp --sport 443 -j ACCEPT# 允许本机发起的 DNS 出站请求(访问 DNS 服务器的 53 端口)
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# 允许本机发起的 HTTP 出站请求(访问仓库 80 端口)
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
# 允许本机发起的 HTTPS 出站请求(访问仓库 443 端口)
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
(三)nat 表:地址转换
nat 表用于实现网络地址转换,解决内网 IP(如 192.168.0.0/16)与公网通信的问题,核心功能为 SNAT 和 DNAT。
1. SNAT(源地址转换)
作用:将内网主机的源 IP 转换为网关的公网 IP,使内网主机能访问公网。
场景:局域网内多台主机通过一个公网 IP 上网(如家庭路由器)。
示例:假设网关服务器有两块网卡(内网 ens33:192.168.1.1,公网 ens37:203.0.113.5),允许 192.168.1.0/24 网段通过公网 IP 访问外部:
# 开启内核转发功能(临时生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效:编辑/etc/sysctl.conf,添加net.ipv4.ip_forward=1,执行sysctl -p# 添加SNAT规则:内网流量通过公网网卡出站时,源IP转换为203.0.113.5
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j SNAT --to-source 203.0.113.5
# 允许内网 192.168.1.0/24 网段的流量通过网关转发到公网(出站)
iptables -A FORWARD -s 192.168.1.0/24 -o ens37 -j ACCEPT# 允许公网对内网的响应流量通过网关转发回内网(入站)
iptables -A FORWARD -d 192.168.1.0/24 -i ens37 -m state --state RELATED,ESTABLISHED -j ACCEPT
若公网 IP 是动态获取的(如拨号上网),可用MASQUERADE
自动适配 IP 变化:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j MASQUERADE
2. DNAT(目的地址转换 / 端口映射)
作用:将公网 IP 的指定端口映射到内网主机的 IP 和端口,使外部能访问内网服务。
场景:暴露内网 Web 服务器(192.168.1.10:80)到公网(203.0.113.5:80)。
注意:端口冲突!指公网端口被重复映射到不同的内网服务,导致外部请求无法正确转发到目标服务。
示例:将公网 IP(203.0.113.5)的 80 端口映射到内网 192.168.1.10 的 80 端口:
# 允许外部访问公网IP的80端口(filter表需放行)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT# 添加DNAT规则:公网流量通过PREROUTING链时,目的地址转换为内网主机
iptables -t nat -A PREROUTING -d 203.0.113.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
注意:DNAT 需配合 filter 表规则放行转发流量(若默认策略为 DROP):
iptables -A FORWARD -d 192.168.1.10 -p tcp --dport 80 -j ACCEPT
3、补充:Windows端口映射
前提:① 外部网络能访问到配置的公网 IP ② 公网 IP 所在的 Windows 主机能访问内网目标(内网网卡需接入内网网段或通过路由能到达内网网段)
# 添加端口映射:将外部端口(externalport)转发到内网 IP:端口(internaladdr:internalport)
# 当 Windows 主机有多个公网 IP 时,任意一个公网 IP 都可以作为 listenaddress(监听地址)
netsh interface portproxy add v4tov4 listenaddress=外部IP listenport=外部端口 connectaddress=内网IP connectport=内网端口
# 示例:将本机(公网IP 203.0.113.5)的 8080 端口转发到内网 192.168.1.10 的 80 端口
netsh interface portproxy add v4tov4 listenaddress=203.0.113.5 listenport=8080 connectaddress=192.168.1.10 connectport=80# 查看所有端口映射规则:
netsh interface portproxy show all
# 删除端口映射规则
netsh interface portproxy delete v4tov4 listenaddress=外部IP listenport=外部端口
# 示例:删除 203.0.113.5:8080 的映射
netsh interface portproxy delete v4tov4 listenaddress=203.0.113.5 listenport=8080清空所有规则:
netsh interface portproxy reset
二、firewalld 防火墙
firewalld 是 CentOS 7 默认的动态防火墙管理工具,基于 iptables 实现,支持动态更新规则(无需重启服务),引入 “zone(区域)” 概念简化配置。
1. 查看 firewalld 服务运行状态
systemctl unmask firewalld
systemctl start firewalld # 启动服务
systemctl enable firewalld # 开机自启
systemctl status firewalld # 查看状态(active/running为运行中)
systemctl stop firewalld # 停止服务
2. 配置工具
- firewall-cmd:命令行工具(推荐,支持动态配置);
- firewall-config:图形化工具(需安装
firewalld-config
包,适合桌面环境)。
3. zone(区域)
zone 是 firewalld 的核心概念,通过预设不同安全级别(如 public、trusted、dmz)的区域,快速适配不同网络环境。
常用区域(安全级别从高到低)
trusted
:允许所有流量;home
:允许家庭网络常用服务(如 SSH、HTTP、mDNS);public
:默认区域,仅允许 SSH、DHCP 等必要服务;dmz
:隔离区,仅允许指定服务(如对外提供的 Web 服务);drop
:拒绝所有流入流量,仅允许流出。
区域操作示例
(1)查看区域的详情
[root@firewalld ~] firewall-cmd --list-all
# --zone=区域 参数,不写则默认default
public (active)target: defaulticmp-block-inversion: nointerfaces: ens33sources: services: dhcpv6-client sshports: protocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules: # 查看当前区域允许的服务
firewall-cmd --list-services
(2)数据过滤
# 服务名(自动对应默认端口)
firewall-cmd --permanent --add-service=
# Display all 154 possibilities? (y or n)
firewall-cmd --permanent --add-port=端口号/协议(tcp/udp)# 示例:
# 开放 TCP 8080 端口(永久生效)
[root@firewalld ~] firewall-cmd --permanent --add-port=8080/tcp
# 开放 HTTP 服务(默认 80 端口)
[root@firewalld ~] firewall-cmd --permanent --add-service=http
# 在默认区域允许SSH服务(22/tcp)并限制源IP为192.168.1.0/24
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent# 重新加载规则使生效
[root@firewalld ~] firewall-cmd --reload# 查看已开放的服务
[root@firewalld ~] firewall-cmd --permanent --list-services# 查看已开放的端口
[root@firewalld ~] firewall-cmd --permanent --list-ports# 查看所有预定义服务及其对应的端口
[root@firewalld ~] firewall-cmd --get-services | xargs -I {} firewall-cmd --info-service={}
(3)SNAT
# 开启指定区域的 masquerade(永久生效)
# 需为包含公网网卡的区域开启 masquerade(通常是 external 或 public 区域):
# 为 external 区域开启 masquerade(推荐用于公网出口)
firewall-cmd --permanent --zone=external --add-masquerade# 重载规则使生效
firewall-cmd --reload
(4)DNAT
firewall-cmd --permanent --add-forward-port=port=源端口:proto=协议:toaddr=目标IP:toport=目标端口示例:将本地 80 端口(TCP)转发到内网 192.168.1.10 的 8080 端口# 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启(重启生效)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p # 立即生效# 添加转发规则(永久生效)
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080# 重载规则使生效
firewall-cmd --reload# 删除规则
firewall-cmd --permanent --remove-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080
firewall-cmd --reload
4. 自定义服务
firewalld 通过 “服务”(预定义端口和协议的集合)简化规则配置,支持自定义服务。
// 一个文件对应一个服务,随便打开一个查看一下定义的内容
创建服务配置文件:
vim /etc/firewalld/services/my-service.xml
内容:
<?xml version="1.0" encoding="utf-8"?>
<service><short>My Service</short><description>Custom service for port 10086/tcp</description><port protocol="tcp" port="10086"/>
</service>
重新加载配置并添加服务:
firewall-cmd --reload
firewall-cmd --zone=public --add-service=my-service --permanent