Linux----防火墙
一、网络安全
一、iptables 与 Netfilter
✅Netfilter:内核态框架(真正干活的)Linux 内核内置的数据包处理框架,在网络协议栈设置 5 个钩子 (Hook) 点位,数据包途经这些点位时可以被拦截、修改、丢弃、转发,提供防火墙、NAT、报文修改底层能力。
✅iptables:用户态命令工具(下发规则的)运行在用户空间的命令行程序,本身不处理数据包。作用:将管理员编写的防火墙规则,通过 Netlink 通信下发给内核的 Netfilter 框架执行。
通俗比喻: Netfilter = 大楼里 5 处安检关卡(内核); iptables = 前台填表窗口,你在这里写安检规则,交给关卡执行。
二、Netfilter 五大钩子(对应 iptables 五条链)
数据包在 Linux 内核网络通道上,有 5 个固定检查站,就是这 5 条链,数据包按固定顺序路过检查站接受规则检查
1. PREROUTING( prerouting 链)
📍位置:数据包刚从网卡进到内核,还没做路由判断,数据包刚进网卡,还没决定往哪送。
✅场景:别人发数据包到达本机网卡,第一站就是这里
💡能干啥:DNAT(目标地址转换)改数据包目标 IP,端口映射就在这
举例子:访问公网 IP:80,把流量转发到内网 192.168.1.100:8080,在这里改目标 IP
2. INPUT(input 链)
📍位置:路由判断后,确定数据包就是发给本机程序的
✅场景:外部流量访问本机上运行的服务(ssh、nginx)
💡能干啥:控制外部能不能访问本机端口,管别人能不能连我这台服务器(禁 22 端口)
举例子:禁止外网访问服务器 22 端口,就在 INPUT 链写 DROP 规则
3. FORWARD(forward 链)
📍位置:路由判断后,发现包不是给本机,要经过本机转发给别的机器。
✅场景:Linux 当作路由器 / 网关,流量跨网段转发
💡能干啥:过滤跨网段转发的流量
举例子:内网主机能不能访问外网,网关防火墙规则写在 FORWARD
4. OUTPUT(output 链)
📍位置:本机内部程序主动向外发包,刚生成数据包,还没路由
✅场景:服务器自己主动向外发起请求(curl、yum 更新)
💡能干啥:管控本机向外发起的流量
举例子:禁止服务器主动访问外部 80 端口
5. POSTROUTING(postrouting 链)
📍位置:数据包路由完成,即将离开网卡前最后一站
✅场景:所有要从本机网卡发出去的包(转发包、本机出站包)
💡能干啥:SNAT、MASQUERADE(源地址转换)
举例子:内网主机共享服务器公网 IP 上网,在这里修改数据包源 IP 为公网地址
1、两条完整数据流路线对照图
路线 A:外部主机 → 访问本机服务
网卡 →PREROUTING→ 路由查询 →INPUT→ 用户空间程序
路线 B:外部主机 → 经由 Linux 网关转发到另一台主机
网卡 →PREROUTING→ 路由查询 →FORWARD→POSTROUTING→ 网卡发出
路线 C:本机程序主动向外发包
用户程序 →OUTPUT→ 路由查询 →POSTROUTING→ 网卡发出
2、超简短记忆版
进网卡先
PREROUTING包是给本机 →
INPUT包要转给别人 →
FORWARD本机主动发包 →
OUTPUT出网卡最后一关
POSTROUTING
3、DNAT / SNAT 一句话分清
DNAT:改目标地址,别人找进来的时候用(PREROUTING)外网用户访问网关公网 IP,我把数据包的目标 IP 偷偷换成内网服务器地址,流量就拐进内网机器。外网流量拐进内网
SNAT:改源地址,内网机器往外跑的时候用(POSTROUTING)内网电脑上网,出去的时候把数据包源 IP 换成网关公网 IP,外网只能看到网关,不知道内网机器真实地址。内网机器借用网关公网 IP 上网
前置提醒
使用 iptables 前:关闭并 mask firewalld,安装 iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
yum install -y iptables-services
systemctl start iptables
systemctl enable iptables
使用 firewalld 前:停止 iptables,解除 firewalld 锁定
systemctl stop iptables
systemctl disable iptables
systemctl unmask firewalld
systemctl start firewalld
systemctl enable firewalld
三、iptables命令
命令通用格式
iptables [-t 表名] 操作指令 [链名] [匹配条件] -j 动作
-t 表名不写默认是filter 表(过滤)表:filter(防火墙)、nat(地址转换)、mangle、raw
1、核心操作参数
| 参数 | 全称 | 大白话含义 | 重点提醒 |
|---|---|---|---|
-L | list | 列出所有规则 | 搭配-n不解析域名,速度快iptables -L -n |
-v | verbose | 显示详细信息(流量统计) | -Lnv标准查看组合 |
-A | append | 追加规则,加到链最后一行 | 匹配顺序从上往下!越靠后优先级越低 |
-I | insert | 插入规则,默认放到第一行 | 紧急封禁用这个,优先匹配 |
-D | delete | 删除一条规则 | 写法要和创建时一模一样,或者按行号删 |
-F | flush | 清空所有规则⚠️谨慎! | 不要随便在远程服务器执行,容易断连接 |
| --line | 显示出每条规则在相应链中的序号 | ||
-R | replace | 修改某一条规则 |
|
| -P | 设置整条链的默认策略 | 默认策略不属于链内规则!iptables -F清空规则不会重置-P默认策略! |
2、匹配条件
| 参数 | 人话解释 | 示例 |
|---|---|---|
-s ip | 源 IP:数据包是谁发出来的 | -s 192.168.1.0/24 |
-d ip | 目标 IP:数据包要发给谁 | -d 203.0.113.10 |
-p tcp/udp/icmp | 匹配协议 | -p tcp |
--dport 端口 | 目标端口(别人访问本机的端口) | --dport 22 |
--sport 端口 | 源端口(对方发起连接的端口) | --sport 80 |
-i 网卡 | 数据包从哪个网卡进来 | -i eth0 |
-o 网卡 | 数据包从哪个网卡出去 | -o eth0 |
| --to-ports 目标端口 | 跳转目标端口 |
3、-j 动作(匹配成功后干什么)
ACCEPT:放行,允许数据包通过DROP:直接丢掉,不回复对方(对方一直转圈等待)REJECT:拒绝,返回 “连接拒绝” 提示- REDIRECT:端口重定向,只能在本机内部转发(仅在nat表使用)
- DNAT =目标网络地址转换作用:修改数据包的【目标 IP / 目标端口】
- SNAT:源网络地址转换作用:修改数据包的【源 IP 地址】一般配合 DNAT 使用,解决跨机器端口转发回程不通的问题。
- DNAT 负责去程改目标,SNAT 负责去程改源
- DNAT 和 SNAT 成对使用,缺一不可(跨机器转发场景)
- REDIRECT 本质可以理解成特殊的 DNAT,强制目标为本机,不能指定其他 IP
💡人话区分 DROP 与 REJECT:
DROP = 假装没看见包裹,直接扔垃圾桶;
REJECT = 收到包裹,明确回信告诉你不收。
4、常用基础命令
1. 查看规则
# 查看filter表规则(默认表) iptables -L -n -v # 查看nat表规则(SNAT/DNAT用) iptables -t nat -L -n -v2. 放行 / 封禁本机端口(INPUT 链,别人访问本机)
# 允许所有人访问本机22端口ssh iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 禁止 192.168.1.5 访问本机80端口 iptables -A INPUT -s 192.168.1.5 -p tcp --dport 80 -j DROP # 在最顶部插入规则,优先封禁某个IP iptables -I INPUT -s 10.0.0.10 -j DROP3. 本机主动向外访问(OUTPUT 链)
# 禁止本机主动访问外网80端口 iptables -A OUTPUT -p tcp --dport 80 -j DROP| 参数 | 含义 | 做题口诀 |
|---|---|---|
-s IP | 数据包从这个 IP 发出 | 出发 IP 写 - s |
-d IP | 数据包要去到这个 IP | 目标 IP 写 - d |
--dport 端口 | 接收方的端口 | 被访问端口一律 dport |
--sport 端口 | 发送方的端口 | 对方自带端口 sport |
四、iptables 端口转发(必须用 nat 表)
| 类型 | 表 | 链 | 作用 | 典型命令关键字 |
|---|---|---|---|---|
| REDIRECT(本机端口转发) | nat | PREROUTING | 本机端口转向本机另一个端口 | -j REDIRECT --to-port |
| DNAT 端口映射 | nat | PREROUTING | 改目的 IP,外网访问内网服务器 | -j DNAT --to‑destination ip:port |
| SNAT 静态源地址转换 | nat | POSTROUTING | 改源 IP,内网固定 IP 上网 | -j SNAT --to‑source |
| MASQUERADE 地址伪装 | nat | POSTROUTING | 动态外网 IP 内网上网 | -j MASQUERADE |
1、Linux 开启 IPv4 内核转发(端口转发前置配置)
1. 修改配置文件 vim /etc/sysctl.conf 在文件内添加 / 修改这一行:net.ipv4.ip_forward = 1 ⚠️ 注意:如果该行前面有#注释,需要删掉# 2. 加载生效配置(必须执行) sysctl -p /etc/sysctl.conf 3. 验证是否成功开启 cat /proc/sys/net/ipv4/ip_forward 返回 1 ✅:转发已开启(截图中就是成功状态) 返回 0 ❌:转发关闭2、临时生效方案(重启失效)
echo 1 > /proc/sys/net/ipv4/ip_forward
适合临时测试,服务器重启后会重置为 0。
前置知识
nat表:专门处理地址转换,分三条核心链
PREROUTING:数据包刚进网卡、路由判断之前(外网 / 别的机器访问本机流量走这里)
OUTPUT:本机自己访问本机产生的数据包
POSTROUTING:数据包准备离开机器、往外发的时候两大转发模式:本地端口转发、远程端口转发(跨机器 DNAT)
3、本地端口转发(本机内部端口跳转)
作用:别人访问这台机器的【端口 A】,自动转给同一台机器上的【端口 B】
例子:访问本机:4444→ 转到本机:22
① 外部 / 其他机器访问本机 4444(走 PREROUTING)
iptables-tnat-APREROUTING-ptcp--dport4444-jREDIRECT--to-ports22
数据包从外面进来,目标端口是 4444,直接重定向到本机 22 端口。
②本机自己访问本机 4444(必须加 OUTPUT 规则!大坑)
iptables-tnat-AOUTPUT-ptcp--dport4444-jREDIRECT--to-ports22
⚠️重点: 外部机器连本机走PREROUTING;本机 curl 127.0.0.1:4444这种流量不走 PREROUTING,只走OUTPUT链,不加这条本地访问会失效!
REDIRECT:只能用于本机内部端口跳转,不能把流量转给另一台服务器。
4、远程端口转发(跨机器转发 DNAT)
场景:流量到达机器 A (192.168.1.100:5555),转发给内网另一台机器 B (192.168.1.200:80)
需要两条配套规则同时生效,缺一不可!
规则 1 DNAT(PREROUTING:改目标地址)
iptables-tnat-APREROUTING-ptcp--dport5555-jDNAT--to-destination192.168.1.200:80
别人访问 192.168.1.100:5555,把数据包目标 IP + 端口改成 192.168.1.200:80,数据包路由发往 B 机器。
规则 2 SNAT(POSTROUTING:改源地址)
iptables-tnat-APOSTROUTING-ptcp-d192.168.1.200--dport80-jSNAT--to-source192.168.1.100
B 机器收到请求后要回包,如果不做 SNAT,B 会直接把响应包发给原始客户端,客户端不认这个连接直接断开。 SNAT 强制把请求来源 IP 伪装成转发服务器 A (192.168.1.100)。 B 回复数据只发给 A,A 再原路转发给客户端,链路闭环。
通俗链路全过程
客户端 → 【A:5555】
- A 收到包,DNAT:目标改成 B:80 → 包发给 B
- B 收到请求,看见来源 IP 是 A(SNAT 效果)
- B 把返回数据发给 A
- A 再把响应传回原始客户端
| 类型 | 使用模块 | 用到链 | 适用场景 | 能不能跨机器 |
|---|---|---|---|---|
| 本地端口转发 | REDIRECT | PREROUTING + OUTPUT | 同一台机器端口互转 | ❌ 只能本机 |
| 远程跨机转发 | DNAT+SNAT 组合 | PREROUTING + POSTROUTING | 流量转发到其他服务器 | ✅ 支持跨机器 |
五、firewalld 命令
一、九大区域(zone)优先级 & 作用
firewalld 区域本质:一套预设规则模板,网卡 / 来源地址绑定区域后,就使用该区域策略;匹配顺序:source 来源 > interface 网卡 > 默认区域。
| 区域 | 安全等级 | 核心用途 | 默认放行服务 | 理解 |
|---|---|---|---|---|
| trusted | 最低信任(最宽松) | 全部流量允许,内网信任服务器 | 所有流量✅ | 完全不设防,谁来都放行;只用于百分百可信机器,生产慎用 |
| home | 低 | 家庭内网,信任其他设备 | ssh, mdns, samba‑client, dhcpv6‑client | 家里 WiFi 环境,信任家里其他电脑、手机,开放较多局域网相关服务 |
| internal | 低 | 内部局域网,同 home | ssh, mdns, samba‑client, dhcpv6‑client | 公司内网,信任内网设备,和 home 规则几乎一模一样 |
| work | 中等 | 办公局域网 | ssh, dhcpv6‑client | 办公室网络,信任办公设备,开放服务比 home 少一点 |
| public | 中等(系统默认区域) | 公网服务器通用默认模板 | ssh, dhcpv6‑client | 系统默认 zone,外网环境;不信任外网,至少保留 ssh 方便远程登录管理机器 |
| external | 较高 | 作为路由器外网网卡,开启地址伪装 masquerade | ssh | Linux 充当路由器,做 NAT 共享上网;内网主机可以通过这台机器访问外网 |
| dmz | 高(隔离区) | 外网可访问的堡垒机、对外服务器,仅必要端口 | ssh | 对外放网站 / 服务的隔离区;默认只开 ssh,其他全部需要手动放行,就算外网访问你的服务,也不相信访问者 |
| block | 很高 | 所有入站拒绝,返回 icmp 拒绝消息 | 无任何放行 | 别人连你直接收到拒绝报错,明确告诉对方:不给访问 |
| drop | 最高(最严格) | 所有入站直接丢弃,不回应 | 无任何放行 | 悄咪咪扔掉数据包,不给对方任何回复;对方只会一直超时,仿佛这台机器不存在 |
重点:区域只是模板!策略生效前提:网卡 / 源地址绑定到该 zone
二、区域切换操作(网卡归属 zone 修改)
1. 查询信息
# 查看网卡当前所在区域 firewall-cmd --get-zone-of-interface=ens33 # 查看活跃区域(网卡绑定在哪,哪个就是active) firewall-cmd --get-active-zones # 查看系统默认区域(不绑定网卡的流量走这里) firewall-cmd --get-default-zone2. 切换网卡所属区域(两种方式)
临时生效(重启防火墙丢失) firewall-cmd --zone=dmz --change-interface=ens33 永久生效(推荐实验) firewall-cmd --permanent --zone=dmz --change-interface=ens33 # 重载配置生效 firewall-cmd --reload3. 修改系统全局默认区域
firewall-cmd --permanent --set-default-zone=public firewall-cmd --reload| 查询 (get) | 设置 (set) | 功能 |
|---|---|---|
--get-default-zone | --set-default-zone=xxx | 查询 / 设置全局默认 zone |
--get‑zone‑of‑interface=ens33 | --change‑interface=ens33 | 查询 / 修改网卡所属 zone(注意这里不用 set!) |
--get‑active‑zones | — | 查看当前激活 zone,没有 set 版本 |
三、基础规则:放行服务 / 端口(普通规则)
语法统一:--permanent永久配置 +firewall-cmd --reload重载
1. 放行预定义服务(推荐,使用 services 目录 xml)
预定义服务 xml 模板目录:
/usr/lib/firewalld/services/。用户自定义存放目录:
/etc/firewalld/services/。拿系统现成 xml 当模板,复制到 /etc/firewalld/services 下面改端口
1.复制http模板,新建myweb服务
cp /usr/lib/firewalld/services/http.xml /etc/firewalld/services/myweb.xml
2.编辑
vim /etc/firewalld/services/myweb.xml<?xml version="1.0" encoding="utf-8"?>
<service>
<short>myweb</short>
<description>自定义8080服务</description>
<port protocol="tcp" port="8080"/>
</service>
自己写出协议和端口号
⚠️坑:不要直接修改 /usr/lib 下面的 xml,升级软件会把你的修改冲掉。
# dmz区域放行http服务(临时去掉--permanent) firewall-cmd --permanent --zone=dmz --add-service=http # 删除服务 firewall-cmd --permanent --zone=dmz --remove-service=http2. 放行自定义端口 / 协议
# 放行tcp 8080端口 firewall-cmd --permanent --zone=dmz --add-port=8080/tcp # 放行端口范围 firewall-cmd --permanent --zone=dmz --add-port=3000-4000/tcp # 删除端口 firewall-cmd --permanent --zone=dmz --remove-port=8080/tcp3. 查询区域全部规则
firewall-cmd --zone=dmz --list-all四、富规则 rich-rule(高级规则,细粒度控制,重点考点)
普通规则:只能全局放行端口,无法限制来源 IP富规则:可精准控制【源地址、目标地址、端口、协议、动作(允许 / 拒绝)、日志】
通用模板
firewall-cmd --permanent --zone=dmz --add-rich-rule='规则内容'
| 参数 | 含义 |
|---|---|
firewall-cmd | firewalld 防火墙管理工具 |
--permanent | 永久配置,写入配置文件;不立即生效,需要执行firewall‑cmd --reload重载才会真正启用;不加此参数只在内存临时生效,服务重启丢失 |
--zone=dmz | 这条富规则作用于dmz 区域,只对归属 dmz 的网卡流量生效(你机器 ens33 就在 dmz) |
--add-rich-rule='xxx' | 添加一条富规则(rich‑rule)。富规则可以实现更精细控制,普通--add‑service做不到按源 IP 限制;单引号包裹完整规则内容 |
高频实验示例
示例 1:仅允许 192.168.42.0/24 访问 ssh (22 端口),其他 IP 禁止 ssh
firewall-cmd -permanent --zone=dmz --add-rich-rule='rule family="ipv4" source address="192.168.42.0/24" service name="ssh" accept'| 片段 | 解释 |
|---|---|
rule | 富规则的起始关键字,代表定义一条规则 |
family="ipv4" | 协议族,作用于IPv4 流量;写ipv6就匹配 ipv6 数据包 |
source address="192.168.42.0/24" | 源地址,只匹配来自192.168.42.0/24网段的数据包;/24子网掩码 255.255.255.0 |
service name="ssh" | 匹配 ssh 服务,对应 22 端口;也可以用port protocol="tcp" port="22"写法 |
accept | 动作:允许通过;其他动作:reject拒绝回复报错、drop丢弃不回复 |
示例 2:拒绝指定 IP 访问 80 端口
firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port protocol="tcp" port="80" reject'| 片段 | 含义 |
|---|---|
rule | 富规则起始标记,代表定义一条规则 |
family="ipv4" | 匹配 IPv4 协议的数据包 |
source address="10.0.0.5" | 源 IP 地址:只匹配来自主机10.0.0.5的流量 |
port protocol="tcp" port="80" | 匹配目标端口:TCP 协议的 80 端口(http) |
reject | 动作:拒绝,返回错误应答包给对方。对比:drop直接丢弃数据包,不给任何回应 |
示例 3:允许单个 IP 访问 3306 数据库端口
firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" source address="192.168.42.100" port protocol="tcp" port="3306" accept'示例 4:带日志记录访问行为
firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8080" protocol="tcp" log prefix="http-access:" accept'| 片段 | 含义 |
|---|---|
rule | 富规则开始标记,定义一条规则 |
family="ipv4" | 只匹配 IPv4 数据包 |
source address="192.168.1.0/24" | 源网段:来自192.168.1.0/24整个网段的主机 |
port port="8080" protocol="tcp" | 匹配本机目标端口TCP 8080 |
log prefix="http-access:" | 日志记录;匹配该规则的数据包写入系统日志,日志行开头打上标记http-access:,方便过滤查看日志 |
accept | 动作:允许数据包通过防火墙 |
五、富规则管理
# 列出zone内所有富规则 firewall-cmd --zone=dmz --list-rich-rules # 删除富规则(复制完整规则字符串替换) firewall-cmd --permanent --zone=dmz --remove-rich-rule='完整规则文本' # 重载生效 firewall-cmd --reload实验必背操作流程总结
- 查看防火墙状态
systemctl status firewalld- 确认网卡所在 zone
firewall-cmd --get-active-zones- 将网卡切换至目标区域 dmz(永久)
- 添加基础放行规则 / 编写富规则限制来源 IP
firewall-cmd --reload重载配置--list-all校验规则
常见排错点
- 添加规则忘记加
--permanent,重启丢失;- 未指定
--zone=,操作默认 public,网卡在 dmz 导致规则无效(你截图报错场景);- 添加规则后没有执行 reload;
- 富规则引号:外层单引号,内部参数双引号,符号不能写错。
firewall‑cmd 常用参数总表
提示:带--permanent写入配置,需--reload才生效;不带为内存临时规则,重启丢失
| 分类 | 参数 | 功能说明 |
|---|---|---|
| 全局基础 | --permanent | 设置为永久配置,写入配置文件,不立即生效 |
--reload | 重载防火墙,加载永久配置,已有连接不中断 | |
--complete‑reload | 完全重启防火墙,断开全部现有连接 | |
--get‑zones | 列出 firewalld 全部 9 个区域 | |
--get‑active‑zones | 查看活跃区域(绑定网卡的 zone) | |
--get‑default‑zone | 查询系统全局默认区域 | |
--set‑default‑zone=<zone> | 设置系统全局默认区域 | |
| 网卡接口 | --get‑zone‑of‑interface=ens33 | 查询指定网卡所属 zone |
--change‑interface=ens33 --zone=<zone> | 修改网卡归属 zone,自动从旧 zone 移出 | |
区域查看(需配合--zone=xxx) | --list‑all | 输出该 zone 完整配置(服务、端口、富规则等) |
--list‑services | 查看 zone 放行的预定义服务 | |
--list‑ports | 查看 zone 放行端口 | |
--list‑rich‑rules | 查看 zone 下所有富规则 | |
| 预定义服务 | --add‑service=<服务名> --zone=<zone> | 在指定 zone 放行某服务 |
--remove‑service=<服务名> --zone=<zone> | 移除 zone 的服务放行规则 | |
--get‑services | 列出全部可用预定义服务 | |
| 端口操作 | --add‑port=端口/协议 --zone=<zone> | 放行指定端口,例:80/tcp |
--remove‑port=端口/协议 --zone=<zone> | 删除端口放行规则 | |
| 富规则 rich‑rule | --add‑rich-rule='规则内容' --zone=<zone> | 添加精细控制富规则 |
--remove‑rich-rule='规则内容' --zone=<zone> | 删除富规则,规则字符串必须与添加完全一致 | |
| NAT / 转发 | --add‑masquerade --zone=<zone> | 开启地址伪装(SNAT 共享上网) |
--remove‑masquerade --zone=<zone> | 关闭地址伪装 | |
--add‑forward‑port=port=80:proto=tcp:toaddr=IP:toport=xxx --zone=<zone> | 配置端口转发 |
高频考点备注
--change‑interface自动解绑网卡旧区域,无需单独执行移出命令。--set‑default‑zone仅修改全局默认,不会改变已经绑定网卡的 zone。- 删除富规则,引号内部文本必须一字不差,否则删除失败。
- NAT 转发功能,内核
net.ipv4.ip_forward=1必须开启,否则转发无效。
六、firewalld IP 转发、limit 限流、云安全组
1、IP 转发(开启转发,值为 yes)
Linux 内核 IP 转发开关,必须开启才能做 NAT / 端口转发
临时开启(内存,重启失效) echo 1 > /proc/sys/net/ipv4/ip_forward 永久开启 编辑 /etc/sysctl.conf -----> net.ipv4.ip_forward = 1 生效命令:sysctl -p ✅验证是否开启: sysctl net.ipv4.ip_forward #输出 net.ipv4.ip_forward = 1 → yes,转发已激活 注意:firewalld 做 SNAT、DNAT、端口转发,内核 ip_forward 必须打开,否则转发不工作。类比:家里路由器,得开启转发,手机的流量才能经过路由器上网。
firewall-cmd端口转发
语法模板:
--add-forward-port=port=外部端口:proto=协议:[toaddr=目标IP:toport=目标端口]
- 不写
toaddr→本机端口转发(REDIRECT)- 写上
toaddr→DNAT 端口映射,转发到别的机器- 永久配置:
--permanent,执行完必须firewall‑cmd --reload
① 本机端口转发:访问本机 8080 → 本机 80
# 添加 firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80 firewall-cmd --reload # 删除 firewall-cmd --permanent --remove-forward-port=port=8080:proto=tcp:toport=80 firewall-cmd --reload② DNAT 端口映射:访问本机 9000 → 内网 192.168.184.100:80
# 添加 firewall-cmd --permanent --add-forward-port=port=9000:proto=tcp:toaddr=192.168.184.100:toport=80 firewall-cmd --reload # 删除 firewall-cmd --permanent --remove-forward-port=port=9000:proto=tcp:toaddr=192.168.184.100:toport=80 firewall-cmd --reload查看端口转发规则
firewall-cmd --list-forward-ports知识点总结
port=:本机对外监听端口proto=:协议 tcp /udptoport=:目标端口toaddr=:目标 IP;省略 toaddr 就是本机端口重定向 REDIRECT- 端口转发同时会自动放行对外端口,不需要额外
--add‑port对比 iptables:
- 无 toaddr → iptables
-j REDIRECT --to‑port- 有 toaddr → iptables
-j DNAT --to‑destination IP:port
2、limit 模块 限流策略(防范恶意刷量、低频攻击)
firewalld 富规则可以使用limit做连接频率限制,限制每秒 / 每分钟请求次数,抵御扫描、恶意刷访问。
#允许ssh,最多3次/分钟,超出拒绝 firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" service name="ssh" limit value="3/m" accept' firewall-cmd --reloadlimit value="3/m":m=minute 分钟;s=second 秒;h=hour 小时10/s:每秒最多 10 个新连接20/m:每分钟最多 20 个新连接
逻辑:匹配的流量,在频率限额内 accept 放行;超过频率则不匹配本条规则,交由 zone 默认策略处理(一般拒绝)。 作用:防暴力破解、恶意刷量、低频扫描攻击。
类比:门禁,一分钟最多允许 3 个人刷卡,再来的人直接拦在门外。
3、云服务器防火墙注意点(安全组)
云服务器(阿里云 / 华为云等)存在两层防火墙
- 系统内部防火墙:firewalld /iptables(操作系统层面)
- 云平台安全组(云防火墙)(云厂商外网网关层面,在实例外面)
⚠️关键考点: 即使 Linux 系统 firewalld 已经放行端口,如果云平台安全组没有开放对应端口,外部依然访问不到服务。
- 入方向:开放外部进来的端口(80、22、8080 等)
- 出方向:控制服务器向外访问
排查思路:外部访问不通,依次检查 ①云安全组是否放行端口 → ②系统 firewalld 是否放行 → ③服务本身是否监听 0.0.0.0,不是 127.0.0.1
类比:你家房门打开了,但是小区大门锁死,外人还是进不来。
简答版
- IP 转发:内核参数
net.ipv4.ip_forward=1,值为 1 (yes) 代表 IP 转发开启,NAT、端口转发依赖该功能。修改/etc/sysctl.conf,sysctl -p永久生效。IP 转发 = 路由器功能,不开就不能转发数据包。 - limit 限流模块:在 rich‑rule 富规则中配置
limit value="次数/单位",限制新连接频率,防范暴力破解、恶意刷量攻击。limit 限流 = 限速,短时间访问次数太多直接拦住,防恶意攻击。 - 云服务器双防火墙:除操作系统 firewalld,还有云平台安全组;只有安全组与系统防火墙同时放行端口,外部才能正常访问服务。云服务器:安全组 + 系统防火墙两个都要放端口,外部才能连上。
