11.Linux 防火墙管理
Linux 防火墙管理
防火墙介绍
防火墙( FireWall ),工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,将希望外网访问的主机放在 DMZ(demilitarized zone)网络中。
Firewalld 区域
firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。
Firewalld 提供的区域
firewalld 防火墙提供了如下zone:
- trusted(信任区域):允许所有的传入流量。
- public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
- external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
- home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal(内部区域):默认值时与homel区域相同。
- work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区域):拒绝所有传入流量。
- drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则
数据包与zone匹配规则如下:
-
firewalld将数据包分配给与传入网络接口关联的区域,并应用该区域的规则。
-
如果接口未关联zone,该源地址被分配给特定区域, 则应用该区域的规则。
-
如果源地址未被分配给特定区域,0
-
如果以上都未匹配,firewalld将数据包分配给默认区域。
注意事项:
- firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域。
- 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝。
Firewalld 规则
对于所有区域,区域内规则的优先级是相同的。
区域内规则匹配优先级如下:
- 首先匹配为该区域设置的任何端口转发和伪装原则。
- 其次匹配该区域设置的任何允许规则。
- 最后匹配该区域设置的任何拒绝规则。
- 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
- 富规则中的规则优先级高于区域中其他规则。
- 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。
zone 管理
如果把 Linux 防火墙比作一个 “智能小区的安保系统”,那 zone(区域) 就是小区里划分的不同 “功能区”—— 每个区域有自己的 “安保规则”,你可以根据需求把 “人”(IP 地址)或 “门”(网络接口)分到不同区域,让他们自动遵守该区域的规矩。
用 “小区分区” 类比 zone 管理
想象一个大型小区,里面分了好几个区域,每个区域的安保严格程度完全不同:
public
区(公共区):相当于小区的 “大门口广场”,任何人都能进,但只能做些基础活动(比如查个路),想进楼里必须额外申请权限;trusted
区(信任区):相当于 “业主专属活动区”,里面的人随便逛,所有设施都能直接用,几乎没有限制;block
区(阻断区):相当于 “黑名单区”,只要被分到这里,不管想做什么都直接拦在外面,连小区门都进不来;dmz
区(隔离区):相当于 “快递柜区域”,允许外部人员(比如快递员)有限访问,但不能进居民楼,保障内部安全;home
/work
区:相当于 “小区内部生活区”,比public
宽松,比trusted
稍严格,适合熟人之间的互动。
具体操作(小区物业视角)
1. 查看所有区域:“查分区表”
# 列出所有区域及各自的规则
firewall-cmd --list-all-zones# 只看某个区域的详情(比如 public 区)
firewall-cmd --zone=public --list-all
→ 相当于物业翻 “小区分区手册”,看看每个区域有哪些门禁规则(开放哪些端口、允许哪些服务)、当前有哪些 “人”(source)或 “门”(interface)属于这个区。
2. 创建自定义区域:“新增一个功能区”
# 新建一个叫“game”的区域(比如给游戏服务器专用)
sudo firewall-cmd --new-zone=game --permanent# 新建后要重启防火墙让它生效
sudo firewall-cmd --reload
→ 相当于小区新划了一块 “电竞区”,专门给玩家用,之后可以给这个区单独定规则(比如开放 8080 游戏端口)。
3. 给区域加规则:“制定区域规矩”
# 允许 public 区访问 80 端口(网页服务)
sudo firewall-cmd --zone=public --add-port=80/tcp# 允许 trusted 区访问所有 SSH 服务(22 端口)
sudo firewall-cmd --zone=trusted --add-service=ssh
→ 相当于给 “大门口广场”(public 区)开了个 “问询窗口”(80 端口),给 “业主区”(trusted 区)配了 “专属通道”(SSH 服务)。
4. 设置默认区域:“定个小区主规则”
# 把 public 设为默认区域
sudo firewall-cmd --set-default-zone=public
→ 相当于小区规定:如果一个人(IP)或一个门(接口)没被分到任何区域,就默认进入 “大门口广场”(public 区),按这里的规矩来。
5. 删除区域:“撤销某个功能区”
# 删除之前创建的“game”区(先确保没人或门属于这个区)
sudo firewall-cmd --delete-zone=game --permanent
sudo firewall-cmd --reload
→ 相当于小区取消了 “电竞区”,之前属于这里的人或门,会自动回到默认区域。
核心逻辑(一句话总结)
zone
是防火墙规则的 “打包容器”—— 你不用零散地给每个 IP 或接口写规则,而是先给不同区域制定好 “套餐规则”,再把对象分到对应的区,实现 “一次配置,批量生效”。就像小区分好区后,只要知道某人在哪个区,就知道他能做什么、不能做什么,管理起来既清晰又高效。
#查看zone清单
[root@server ~ 14:18:45]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看激活的zone清单,也就是分配了interface和source的zone
[root@server ~ 14:45:10]# firewall-cmd --get-active-zones
publicinterfaces: ens33# 查看默认zone
[root@server ~ 14:45:54]# firewall-cmd --get-default-zone
public# 设置默认zone,例如设置为trusted,该操作同时设置永久态默认zone
[root@server ~ 14:47:38]# firewall-cmd --set-default-zone=trust
success
[root@server ~ 14:48:07]# firewall-cmd --set-default-zone=publi
success
source 管理
可以把 firewalld
的 source
管理,想象成 给服务器 “雇保镖,分门禁” 的过程,用生活化场景类比:
1. 区域(zone)= 不同 “门禁区域”
把服务器比作一栋大楼,firewalld
的 区域(zone) 就是大楼里的不同 “门禁区域”:
public
(公共区):像大楼的 “大堂”,默认对外部开放,但规矩多(规则严格);trusted
(信任区):像大楼的 “内部办公区”,对自己人完全开放,随便进;block
(阻断区):像大楼的 “黑名单区”,进来就赶出去,谁都别想停留。
2. source(IP / 网段)= “访客身份”
source
就是 访客的 “身份证”(IP 地址) :
- 单个 IP(如
192.168.1.100
):像具体某个人的身份证,能精准识别; - 网段(如
10.0.0.0/24
):像 “公司工牌”,同一公司(网段)的人共用一个身份规则。
3. 操作类比(生动版)
(1)查看 source:“查门禁记录”
firewall-cmd --list-all-zones | grep -E "zone|source"
→ 相当于保安查 “门禁登记本” :看看哪些 IP / 网段被分到了哪个 “门禁区域”,谁能进大堂、谁能进办公区。
(2)添加 source:“给访客办门禁”
# 单个 IP 进 public 区(大堂)
sudo firewall-cmd --zone=public --add-source=192.168.1.100
→ 相当于给 192.168.1.100
这个 “访客” 办一张 “大堂门禁卡” ,以后他来服务器大楼,默认走 “大堂” 的规矩(public
区域规则)。
# 网段进 trusted 区(办公区)
sudo firewall-cmd --zone=trusted --add-source=10.0.0.0/24
→ 相当于给 10.0.0.0/24
这个 “公司网段” 的人发 “内部办公区工牌” ,他们来服务器大楼,直接进 “办公区”,随便访问(trusted
区域规则宽松)。
(3)永久生效:“把门禁卡焊死”
sudo firewall-cmd --runtime-to-permanent
→ 服务器重启后,临时办的 “门禁卡” 会失效,所以要 “把门禁卡信息刻在登记本上” ,永久保存,重启后也认这些访客。
(4)移除 source:“收回门禁卡”
sudo firewall-cmd --zone=public --remove-source=192.168.1.100
→ 相当于访客 192.168.1.100
被列入 “黑名单”,保安 “收回他的大堂门禁卡” ,以后再来服务器大楼,按默认规矩(没特殊权限)处理,可能直接被拦在门外。
4. 总结(打工人视角)
- 你是服务器大楼的 “保安队长” ,
firewalld
是你的 “门禁系统”; zone
是不同 “门禁区域”(大堂、办公区、黑名单区);source
是访客的 “身份证 / 工牌”;- 你通过
firewall-cmd
给不同 “身份证” 分配 “门禁区域”,决定谁能进、进哪里、怎么进。
#来源于特定source的数据包交给特定zone处理
[root@server ~ 14:51:46]# firewall-cmd --add-source=10.1.8.0/24 --zone=home
success
# 查看source清单
[root@server ~ 15:04:40]# firewall-cmd --list-sources --zone=home
10.1.8.0/24
# 查看source属于哪个zone
[root@server ~ 15:05:07]# firewall-cmd --get-zone-of-source=10.1.8.0/24
home
# 查看source是否添加
[root@server ~ 15:05:47]# firewall-cmd --query-source=10.1.8.0/24 --zone=home
yes
# 变更source到其他zone
[root@server ~ 15:06:54]# firewall-cmd --change-source=10.1.8.0/24 --zone=public
success
# 删除zone中source
[root@server ~ 15:07:35]# firewall-cmd --remove-source=10.1.8.0/24 --zone=public
success
interface 管理
如果说 source
管理是给 “访客发门禁卡”,那 Linux 防火墙里的 interface(网络接口)管理 就像是给服务器大楼的 “大门挂牌匾”—— 给不同的物理 / 虚拟网卡(比如网线接口、无线网卡)分配 “专属区域”,让从这个门进来的流量自动遵守该区域的规矩。
用 “大楼大门” 类比 interface 管理
把服务器想象成一栋有多个大门的大楼:
- interface(网络接口) 就是大楼的各个 “大门”(比如正门、侧门、后门),对应服务器上的网卡(如
eth0
、wlan0
、ens33
等); - zone(区域) 还是之前的 “门禁区域”(大堂、办公区、黑名单区)。
interface
管理的核心就是:给某个大门挂个牌子,写明 “从这个门进来的人,默认进 XX 区域”,所有从该接口流入的流量,自动套用对应区域的规则。
具体操作(生动版)
1. 查看接口绑定:“查大门挂牌”
# 看所有大门挂了哪些区域的牌子
firewall-cmd --list-all-zones | grep -E "zone|interface"# 看指定大门(如 eth0)挂的牌子
firewall-cmd --get-zone-of-interface=eth0
→ 相当于保安查 “大门挂牌表”:正门(eth0
)挂着 “public 区” 的牌子,侧门(wlan0
)挂着 “trusted 区” 的牌子。
2. 绑定接口到区域:“给大门挂牌”
# 给正门(eth0)挂“public 区”的牌子
sudo firewall-cmd --zone=public --add-interface=eth0# 给侧门(wlan0)挂“trusted 区”的牌子
sudo firewall-cmd --zone=trusted --add-interface=wlan0
→ 从此,所有从 eth0
接口(正门)进来的流量,自动进入 “public 区”(大堂),遵守大堂的规矩;从 wlan0
(侧门)进来的,直接进 “trusted 区”(办公区),随便访问。
3. 更换接口绑定:“换牌子”
# 把正门(eth0)的牌子换成“block 区”
sudo firewall-cmd --zone=block --change-interface=eth0
→ 原本走正门的流量,现在被分到 “block 区”(黑名单区),进来就被拦,相当于 “正门暂时关闭,来人就赶”。
4. 移除接口绑定:“摘牌子”
# 摘掉正门(eth0)的牌子
sudo firewall-cmd --zone=public --remove-interface=eth0
→ 接口 eth0
不再属于任何区域,默认会归到 firewalld
的 “默认区域”(比如 public
),相当于 “临时摘牌,暂时按大楼默认规矩走”。
5. 永久生效:“把牌子钉死”
和 source
管理一样,临时操作在服务器重启后会失效,需要:
sudo firewall-cmd --runtime-to-permanent
→ 相当于 “用钉子把牌子钉死在门上”,下次重启大楼,牌子还在,规矩不变。
总结(保安视角)
你作为服务器大楼的保安:
- 每个
interface
是一个 “大门”,流量从哪个门进来,就先看这个门挂了哪个 “区域牌子”; - 你不用逐个检查每个访客,只要管好 “大门挂什么牌子”,就能让该门的所有流量自动遵守对应区域的规则;
- 比如给连接公网的
eth0
挂 “public 区”(严格安检),给内部局域网的eth1
挂 “trusted 区”(直接放行),省心又高效。
#看zone中interface
[root@server ~ 15:07:57]# firewall-cmd --list-interfaces
ens33 ens36
# 查看interface属于哪个zone
[root@server ~ 15:09:19]# firewall-cmd --get-zone-of-interface=ens33
public
[root@server ~ 15:09:58]# firewall-cmd --get-zone-of-interface=ens36
public
# 查看interface是否添加
[root@server ~ 15:10:02]# firewall-cmd --query-interface=ens33
yes
# 将interface变更到其他zone
[root@server ~ 15:10:28]# firewall-cmd --change-interface=ens32 --zone=home
success
# 删除zone中interface
[root@server ~ 15:11:02]# firewall-cmd --remove-interface=ens32 --zone=home
success
service 管理
# 查看放行服务列表
[root@server ~ 15:29:46]# firewall-cmd --list-services
dhcpv6-client ssh
# 添加放行服务
[root@server ~ 15:30:00]# firewall-cmd --add-service=http
success
# 删除服务
[root@server ~ 15:30:27]# firewall-cmd --remove-service=http
success
port 管理
#添加服务
[root@server ~ 15:30:49]# firewall-cmd --add-service=http
success
#将配置文件移走,导致不能正常访问
[root@server ~ 15:31:47]# mv /usr/lib/firewalld/services/http.xml ~
[root@server ~ 15:32:38]# systemctl reload firewalld.service
# 添加放行端口
[root@server ~ 15:33:55]# firewall-cmd --add-port=80/tcp
success
#能用端口正常访问
#删除端口
[root@server ~ 15:34:21]# firewall-cmd --remove-port=80/tcp
success
masquerade 管理
如果把服务器当成一个 “带多个门的房子”,那 masquerade
(地址伪装)就像是给房子装了个 “智能快递柜”,专门帮屋里的人收发外面的包裹,还会悄悄 “换标签”。
举个生活场景:
你家(内网)有三口人(设备 A:192.168.1.2,设备 B:192.168.1.3,设备 C:192.168.1.4),但房子对外只有一个门牌号(服务器公网 IP:203.0.113.5)。
- 当设备 A 想网购(访问外网),它写的收货地址是自己的房间号(192.168.1.2),但这个地址外面的快递员不认识(内网 IP 无法直接被外网识别)。
- 这时
masquerade
这个 “智能快递柜” 就发挥作用了:它会把包裹上的 “房间号标签” 换成房子的 “大门牌号”(203.0.113.5),再寄出去。 - 卖家发货(外网回信)时,包裹会寄到 “大门牌号”,快递柜收到后,会根据记录(类似快递柜的取件码),把包裹准确转交给设备 A。
整个过程中,外面的人永远只知道 “203.0.113.5” 这个门牌号,不知道屋里具体是谁在购物 —— 既让内网设备能正常上网,又藏起了它们的真实 “房间号”,这就是 masquerade
的核心作用。
开启它,就像给房子激活了 “共用门牌号” 功能;关闭它,内网设备就没法通过这个门对外寄东西了~
# 启动 masquerade
[root@server ~ 15:35:54]# firewall-cmd --add-masquerade
success
forward-port 管理
使用 port forward前,确保对应zone启用masquerade功能。
# 访问本机端口1022转发到本机22
[root@server ~ 16:01:00]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.11
success
#移除
[root@server ~ 16:07:27]# firewall-cmd --remove-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.11
success
登录root@10.1.8.10:1022自动转到10.1.8.11:22上
实例:
[root@server ~ 16:19:40]# firewall-cmd --add-forward-port=port=1080:proto=tcp:toport=80:toaddr=10.1.8.11
success
[root@server ~ 16:21:55]# firewall-cmd --remove-forward-port=port=1080:proto=tcp:toport=80:toaddr=10.1.8.11
#在10.1.8.11客户机上写入
[root@client ~ 16:20:35]# echo hello world from client > /var/www/html/index.html
#访问10.1.8.10:1080自动跳转到10.1.8.11:80上出现 ‘hello world from client’字样