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 → 路由查询 → FORWARDPOSTROUTING → 网卡发出

路线 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 修改某一条规则 iptables -R INPUT 2 xxx 修改第 2 条
-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 动作(匹配成功后干什么)

  1. ACCEPT:放行,允许数据包通过
  2. DROP:直接丢掉,不回复对方(对方一直转圈等待)
  3. REJECT:拒绝,返回 "连接拒绝" 提示
  4. REDIRECT:端口重定向,只能在本机内部转发(仅在nat表使用)
  5. DNAT = 目标网络地址转换 作用:修改数据包的【目标 IP / 目标端口】
  6. SNAT:源网络地址转换 作用:修改数据包的【源 IP 地址】 一般配合 DNAT 使用,解决跨机器端口转发回程不通的问题。
  1. DNAT 负责去程改目标 ,SNAT 负责去程改源
  2. DNAT 和 SNAT 成对使用,缺一不可(跨机器转发场景)
  3. REDIRECT 本质可以理解成特殊的 DNAT,强制目标为本机,不能指定其他 IP
    💡人话区分 DROP 与 REJECT:

DROP = 假装没看见包裹,直接扔垃圾桶;

REJECT = 收到包裹,明确回信告诉你不收。

4、常用基础命令

1. 查看规则

复制代码
# 查看filter表规则(默认表)
iptables -L -n -v

# 查看nat表规则(SNAT/DNAT用)
iptables -t nat -L -n -v

2. 放行 / 封禁本机端口(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 DROP

3. 本机主动向外访问(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 -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 22

数据包从外面进来,目标端口是 4444,直接重定向到本机 22 端口。

本机自己访问本机 4444(必须加 OUTPUT 规则!大坑)

iptables -t nat -A OUTPUT -p tcp --dport 4444 -j REDIRECT --to-ports 22

⚠️重点: 外部机器连本机走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 -t nat -A PREROUTING -p tcp --dport 5555 -j DNAT --to-destination 192.168.1.200:80

别人访问 192.168.1.100:5555,把数据包目标 IP + 端口改成 192.168.1.200:80,数据包路由发往 B 机器。

规则 2 SNAT(POSTROUTING:改源地址)

iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.200 --dport 80 -j SNAT --to-source 192.168.1.100

B 机器收到请求后要回包,如果不做 SNAT,B 会直接把响应包发给原始客户端,客户端不认这个连接直接断开。 SNAT 强制把请求来源 IP 伪装成转发服务器 A (192.168.1.100)。 B 回复数据只发给 A,A 再原路转发给客户端,链路闭环。

通俗链路全过程

客户端 → 【A:5555】

  1. A 收到包,DNAT:目标改成 B:80 → 包发给 B
  2. B 收到请求,看见来源 IP 是 A(SNAT 效果)
  3. B 把返回数据发给 A
  4. 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-zone

  1. 切换网卡所属区域(两种方式)

    临时生效(重启防火墙丢失)
    firewall-cmd --zone=dmz --change-interface=ens33

    永久生效(推荐实验)
    firewall-cmd --permanent --zone=dmz --change-interface=ens33

    重载配置生效

    firewall-cmd --reload

  2. 修改系统全局默认区域

    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=http
  1. 放行自定义端口 / 协议

    放行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/tcp

  2. 查询区域全部规则

    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

实验必背操作流程总结

  1. 查看防火墙状态 systemctl status firewalld
  2. 确认网卡所在 zone firewall-cmd --get-active-zones
  3. 将网卡切换至目标区域 dmz(永久)
  4. 添加基础放行规则 / 编写富规则限制来源 IP
  5. firewall-cmd --reload 重载配置
  6. --list-all 校验规则

常见排错点

  1. 添加规则忘记加--permanent,重启丢失;
  2. 未指定--zone=,操作默认 public,网卡在 dmz 导致规则无效(你截图报错场景);
  3. 添加规则后没有执行 reload
  4. 富规则引号:外层单引号,内部参数双引号,符号不能写错。

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> 配置端口转发

高频考点备注

  1. --change‑interface自动解绑网卡旧区域,无需单独执行移出命令
  2. --set‑default‑zone仅修改全局默认,不会改变已经绑定网卡的 zone
  3. 删除富规则,引号内部文本必须一字不差,否则删除失败。
  4. 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)
  • 写上toaddrDNAT 端口映射,转发到别的机器
  • 永久配置:--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

知识点总结

  1. port=:本机对外监听端口
  2. proto=:协议 tcp /udp
  3. toport=:目标端口
  4. toaddr=:目标 IP;省略 toaddr 就是本机端口重定向 REDIRECT
  5. 端口转发同时会自动放行对外端口,不需要额外--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 --reload
  • limit value="3/m":m=minute 分钟;s=second 秒;h=hour 小时
    • 10/s:每秒最多 10 个新连接
    • 20/m:每分钟最多 20 个新连接

逻辑:匹配的流量,在频率限额内 accept 放行;超过频率则不匹配本条规则,交由 zone 默认策略处理(一般拒绝)。 作用:防暴力破解、恶意刷量、低频扫描攻击。

类比:门禁,一分钟最多允许 3 个人刷卡,再来的人直接拦在门外。

3、云服务器防火墙注意点(安全组)

云服务器(阿里云 / 华为云等)存在两层防火墙

  1. 系统内部防火墙:firewalld /iptables(操作系统层面)
  2. 云平台安全组(云防火墙)(云厂商外网网关层面,在实例外面)

⚠️关键考点: 即使 Linux 系统 firewalld 已经放行端口,如果云平台安全组没有开放对应端口,外部依然访问不到服务

  • 入方向:开放外部进来的端口(80、22、8080 等)
  • 出方向:控制服务器向外访问

排查思路:外部访问不通,依次检查 ①云安全组是否放行端口 → ②系统 firewalld 是否放行 → ③服务本身是否监听 0.0.0.0,不是 127.0.0.1

类比:你家房门打开了,但是小区大门锁死,外人还是进不来。

简答版

  1. IP 转发 :内核参数net.ipv4.ip_forward=1,值为 1 (yes) 代表 IP 转发开启,NAT、端口转发依赖该功能。修改/etc/sysctl.confsysctl -p永久生效。IP 转发 = 路由器功能,不开就不能转发数据包。
  2. limit 限流模块 :在 rich‑rule 富规则中配置limit value="次数/单位",限制新连接频率,防范暴力破解、恶意刷量攻击。limit 限流 = 限速,短时间访问次数太多直接拦住,防恶意攻击。
  3. 云服务器双防火墙 :除操作系统 firewalld,还有云平台安全组 ;只有安全组与系统防火墙同时放行端口,外部才能正常访问服务。云服务器:安全组 + 系统防火墙两个都要放端口,外部才能连上
相关推荐
海兰1 小时前
【开源工具】BlueKing Lite —— AI 原生的轻量运维平台(二)
运维·人工智能·开源
秋田君2 小时前
QT_网络编程体系
网络·arm开发·qt
黄焖鸡能干四碗2 小时前
信息安全保障方案(Word文件)
大数据·网络·人工智能·架构·区块链
我星期八休息2 小时前
网络编程—NAT、代理服务与内网穿透
linux·服务器·网络·网络协议
RisunJan3 小时前
Linux命令-sysctl(运行时修改内核参数)
linux·网络·智能路由器
yunwei373 小时前
eBPF 教程:使用 fsession 追踪慢速 vfs_read 调用
linux·云原生
A_humble_scholar3 小时前
Linux 网络基础(三)下的 HTTP 核心详解:从请求响应到状态管
linux·网络·http
Lucis__3 小时前
如何实现长连接通信机制?Websocket的最佳实践
网络·websocket·网络协议
Albart5753 小时前
Docker Desktop最新版安装踩坑全记录(Windows_Mac_Linux)【2026 4.74.0 终版】
linux·windows·macos·docker·环境搭建·踩坑记录