十一.管理网络安全
1.管理服务器防火墙
1.1防火墙架构概念(netfilter框架)
防火墙是网络安全的关键组件,用于隔离不同信任级别的网络区域(如内部网络和外部互联网),通过制定规则来控制流量的进出,实现网络安全隔离;
Linux 内核的 netfilter 框架用于实现数据包过滤、网络地址转换(NAT)、端口转换等功能;
核心机制:hook点
它在 Linux 网络协议栈中预设了多个拦截点(hook),比如数据包进入网卡接口时、路由决策前后、数据包离开服务器时等。当数据包流经这些 hook 点时,会触发预先定义的规则(如防火墙策略),从而实现对流量的 “拦截 – 检查 – 放行 / 拒绝” 操作。
作用:
所有 Linux 防火墙工具的底层支撑,所有网络流量的控制逻辑最终都依赖 netfilter 框架来执行。
1.2nftables框架
nftables框架是基于 netfilter 构建的新一代数据包分类与规则管理框架,在 RHEL 9 等现代 Linux 发行版中取代了老旧的 iptables,成为防火墙规则的核心实现。
优势:
|
特性 |
iptables 框架 |
nftables 框架 |
|
协议支持 |
IPv4、IPv6、ARP、以太网分别用iptables、ip6tables、arptables、ebtables 管理 |
一个 nft 工具统一管理所有协议流量 |
|
规则效率 |
多协议规则分散,大流量下性能开销较高 |
规则集更高效,支持批量操作,资源消耗更低 |
|
语法与易用性 |
语法相对繁琐,规则逻辑分散 |
语法简洁统一,支持更灵活的规则组合与批量配置 |
迁移兼容性:
为了平滑过渡,系统提供 iptables-translate 和 ip6tables-translate 工具,可将旧的 iptables 配置文件自动转换为 nftables 格式的配置,降低迁移成本。
1.3 firewalld
1.3.1 firewalld简介
firewalld 是基于 nftables的防火墙管理器,简化了防火墙的管理,让防火墙配置更简单。
firewalld的底层在 RHEL 9 及以后依赖 nftables,但对用户来说无需关注底层细节,只需通过firewalld 的逻辑(zone、服务)配置即可。
1.3.2 zone概念
firewalld引入了zone(区域)的概念,每个zone都是一组预定义的规则,根据数据包的源IP或传入网络接口,将流量分类到不同的zone,并应用相应规则;
zone 是一组预定义的防火墙规则集合,每个 zone 对应不同的 “信任级别”。例如,对完全可信的内部网络,可使用 trusted zone(允许所有流量);对不可信的公网,可使用 public zone(仅允许少数必要服务,如 SSH)。
1.3.2.1常规匹配:
(1)源IP匹配
服务器有trusted zone; 源IP:192.168.1.100

此时,来自 192.168.1.100 的所有流量,都会应用 trusted zone 的规则
(2)网络接口匹配
服务器网卡:ens33;绑定到public zone

所有从 ens33 接口进入的流量(无论源 IP),都会应用 public zone 的规则
1.3.2.2默认zone兜底
如果流量的源 IP 没绑定 zone,网络接口也没关联 zone,就会匹配默认 zone(firewalld 默认是 public zone)。
比如服务器有一个新网卡 ens34 未关联任何 zone,那么从 ens34 进入的流量会自动应用 public zone 的规则。
1.3.3核心流程:

1.4预定义zone
预定义 zone 是 firewalld 内置的一组预先配置好的 “区域 – 规则集合”,每个 zone 对应不同的信任级别和流量控制策略。管理员可直接使用这些预定义 zone,也可基于它们进行自定义修改,从而快速搭建防火墙策略。
通过将网络流量按“信任级别”(如“完全可信的内部网络”“不可信的公网”)归类到不同预定义 zone,简化防火墙规则的配置逻辑 —— 无需从零开始编写规则,只需选择合适的 zone 并微调即可。
预定义zone规则详解
|
区域名称 |
默认配置(传入流量规则) |
核心特点 |
|
trusted |
允许所有传入流量 |
信任级别最高,无任何流量限制 |
|
home |
除非与传出流量相关,或与ssh、mdns、ipp-client、samba-client、dhcpv6-client 预定义服务匹配,否则拒绝传入流量 |
面向家庭场景,放行文件共享(samba)、打印机(ipp)等家庭常用服务 |
|
internal |
除非与传出流量相关,或与 ssh、mdns、ipp-client、samba-client、dhcpv6-client 预定义服务匹配,否则拒绝传入流量(初始与 home 规则相同,可后续自定义差异) |
比home更偏向企业内部场景,可根据需求调整服务放行规则 |
|
work |
除非与传出流量相关,或与 ssh、ipp-client、dhcpv6-client 预定义服务匹配,否则拒绝传入流量 |
面向办公场景,放行办公打印机(ipp)、SSH 管理等服务,弱化家庭类的 mdns、samba 服务 |
|
public |
除非与传出流量相关,或与 ssh、dhcpv6-client 预定义服务匹配,否则拒绝传入流量;是新添加网络接口的默认区域 |
信任级别低,仅放行最必要的服务(SSH 用于远程管理、DHCPv6 用于 IPv6 地址获取) |
|
external |
除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝传入流量;通过此区域转发的 IPv4 传出流量会进行伪装(NAT) |
具备 NAT 功能,既能限制传入流量,又能让内部设备通过它安全访问公网 |
|
dmz |
除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝传入流量 |
仅放行对外服务的必要流量,同时通过 SSH 保留远程管理能力,平衡 “对外服务” 与 “安全隔离” |
|
block |
除非与传出流量相关,否则拒绝所有传入流量 |
对传入流量 “硬拒绝”,但会返回 ICMP 错误提示 |
|
drop |
除非与传出流量相关,否则丢弃所有传入流量(甚至不产生 ICMP 错误响应) |
对传入流量 “静默丢弃”,不返回任何响应,让攻击者难以判断目标状态 |
1.5预定义服务
预定义服务是 firewalld 内置“网络服务 – 端口 / 协议映射集合”。它将常见网络服务(如 SSH、DNS、文件共享)与对应的端口、协议(TCP/UDP)预先关联,让管理员无需记忆复杂的端口号,只需通过 “服务名称” 即可快速配置防火墙规则。
常见预定义服务
|
服务名称 |
配置详情 |
|
SSH |
本地 SSH 服务器,放行“22/tcp”流量 |
|
dhcpv6-client |
本地 DHCPv6 客户端,放行“fe80::/64 IPv6”网络中“546/udp”流量 |
|
ipp-client |
本地 IPP 打印服务,放行“631/udp”流量 |
|
samba-client |
本地 Windows 文件和打印共享客户端,放行“137/udp、138/udp”流量 |
|
mdns |
多播 DNS(mDNS)本地链路名称解析,放行“5353/udp”流量(指向“224.0.0.251”或“ff02::fb”多播地址) |
列出预定义服务:
firewall-cmd –get-services
如:

预定义服务的配置文件位置——/usr/lib/firewalld/services
文件的格式由firewalld.zone(5)定义(官方文档,定义规则与约束)
1.7从命令行配置防火墙
1.7.1概念
firewall-cmd 命令会与firewalld进行交互,所有防火墙的规则配置、zone 管理、服务启用等操作,都可通过它完成。
防火墙配置:
(1)runtime 配置:
临时生效的规则,服务器重启或 firewalld 服务重启后会丢失。
(2)permanent 配置:
永久生效的规则,需通过 firewall-cmd –reload 加载后才能在 runtime 中生效。
选项:
–zone=ZONE:
用于指定命令作用的区域(zone),若不指定则默认作用于 “默认 zone”(通常是 public)。
如果需要子网掩码,使用CIDR表示法,如192.168.1/24;
firewalld 配置架构图解:

1.7.2常见命令
|
功能分类 |
命令格式 |
作用说明 |
|
�� 查看信息类 |
firewall-cmd –get-zones |
列出系统所有预定义 zone |
|
|
firewall-cmd –zone=<ZONE> –list-all |
查看指定 zone 的所有规则(服务、端口、源 IP 等) |
|
|
firewall-cmd –get-services |
列出所有预定义服务 |
|
|
firewall-cmd –zone=<ZONE> –list-services |
查看指定 zone 已放行的服务 |
|
|
firewall-cmd –zone=<ZONE> –list-ports |
查看指定 zone 已放行的端口 |
|
⚙️ Zone 管理类 |
firewall-cmd –set-default-zone=<ZONE> |
设置系统默认 zone |
|
|
firewall-cmd –permanent –zone=<ZONE> –add-source=<CIDR> |
永久将源 IP 段 / CIDR 关联到指定 zone |
|
|
firewall-cmd –permanent –zone=<ZONE> –change-interface=<网卡名> |
永久将网卡关联到指定 zone |
|
|
firewall-cmd –permanent –zone=<ZONE> –remove-source=<CIDR> |
永久移除 zone 关联的源 IP 段 |
1.7.3标准操作步骤
(1)查看默认的zone
firewall-cmd –get-default-zone
(2)设置默认zone
firewall-cmd –set-default-zone=目标zone
(2)选择类型(临时/永久),添加服务, 在防火墙中永久放行“服务”
firewall-cmd –permanent \\
—service=服务
(3)重置防火墙配置
firewall-cmd –reload
(4)验证永久配置是否存储成功
firewall-cmd –permanent –list-services \\
–list-all
观察列出的zone所有规则是否有之前添加的内容。
完成配置后应进行完整的验证:

2.控制SELinux端口标记
2.1SELinux端口标记
SELinux(安全增强型 Linux)是 Linux 系统的强制访问控制(MAC)安全机制。
其中,“端口标记” 是 SELinux 控制网络流量的核心手段之一,它为每个网络端口(如 22/TCP、80/TCP)分配一个专属的安全标签(如 ssh_port_t、http_port_t),并通过策略规则限制 “哪些进程可以绑定哪些带标签的端口”。
工作机制:
当一个进程(如 SSH 服务、Web 服务)想要监听某个网络端口时,SELinux 会执行以下校验逻辑:
(1)进程的安全标签:
每个进程运行时会被赋予一个 SELinux 标签(如 SSH 进程的标签是 sshd_t)。
(2)端口的安全标签:
每个端口被标记为特定标签(如 22/TCP 是 ssh_port_t,80/TCP 是 http_port_t)。
(3)策略规则校验:
SELinux 会检查 “进程标签是否被允许绑定该端口标签”。只有策略明确允许的组合(如 sshd_t 绑定 ssh_port_t),进程才能成功监听端口;否则,SELinux 会拦截操作并记录拒绝日志。
2.2列出端口标签
如果在非标准端口上运行服务,SELinux会拦截此流量,必须更新SELinux端口标签
(1)获取所有当前端口标签分配信息;
semanage port -l

(2)通过服务名称过滤SELinux端口标签
semanage port -l | grep 服务名
如:
semanage port -l | grep http

(3)使用端口号过滤SELinux端口标签
semanage port -l | grep -w 端口号
如:
semanage port -l | grep -w 80
![]()
2.3管理端口标签
使用semanage命令可以分配新端口标签、删除端口标签或修改现有端口标签;
选项:
-a:添加
-d:删除
-m:修改
-t:类型
-p:协议
-C:查看对默认策略的修改
2.4删除端口标签
删除自定义端口标签的语法和添加标签语法相同,使用-d选项;
如:
semanage port -d -t gopher_port_t -p tcp 71
验证:
semanage port -l | grep -w 71
无输出则已经删除标签。

删除失败,该端口未绑定,无法删除不存在标签。
2.5修改端口标签
使用-m选项更改端口绑定,比删除旧的添加新的端口标签更高效;
如:
semanage port -m -t http_port_t -p tcp 71
验证:
semanage port -l | grep -w 71

修改成功。
2.6实例
访问网址失败,在Web服务器主机上配置防火墙和SELinux设置
(1)访问服务器
curl http://服务器IP:30080
(2)调查失败原因
检查服务状态:
systemctl status httpd(服务)

重启服务:
systemctl restart httpd

失败,调查原因
systemctl status httpd.service

SELinux限制导致无法绑定端口
(3)调整SELinux配置
查找端口正确的类型:
semanage port -l | grep “http”

为要求的端口分配类型
semanage port -a -t http_port_t -p tcp 30080 (端口)
重启服务
systemctl restart httpd.service
(4)验证
systemctl status httpd

或
curl http://服务器IP:30080
(5)对防火墙设置做出相应调整
添加端口到public区域:
firewall-cmd –add-port=端口/协议 \\
–zone=public \\
–permanent

重启防火墙配置:

验证public区域的开放端口:
firewall-cmd –zone=public –list-ports –permanent

网硕互联帮助中心






评论前必须登录!
注册