【十一、Linux管理网络安全】
十一、Linux管理网络安全
- 1. 管理服务器防火墙
- 1.1 防火墙架构概念
- 1.2 nftables 框架
- 1.3 firewalld 简介
- 1.4 预定义 zone(区域)
- 1.5 预定义服务
- 1.6 配置 firewalld 的方法
- 1.7 从命令行配置防火墙(`firewall-cmd`)
- 1.8 使用 Web 控制台配置防火墙服务
- 2. 控制 SELinux 端口标记
- 2.1 SELinux 端口标记的核心作用
- 2.2 列出 SELinux 端口标签
- 2.3 管理 SELinux 端口标签(添加标签)
- 2.4 删除 SELinux 端口标签
- 2.5 修改 SELinux 端口标签
1. 管理服务器防火墙
1.1 防火墙架构概念
- netfilter 框架:由 Linux 内核提供,是网络流量操作的核心框架,支持数据包过滤、网络地址转换(NAT)、端口转换等功能。
- 核心机制:包含内核模块的“钩子(hook)”,当网络数据包遍历系统网络堆栈时,钩子会拦截数据包并触发相关处理(如执行防火墙规则)。
- 作用:作为底层支撑,为上层防火墙工具(如 nftables、firewalld)提供数据包交互能力。
NAT:虚拟机网络适配器,NAT:共享主机地址,将虚拟机地址转化成主机地址,可上网。
防火墙:允许谁进,不允许谁进,端口,白名单,针对TCP协议。socket用于机器内部。
1.2 nftables 框架
- 定位:基于 netfilter 框架构建的数据包分类框架,是 RHEL 9 系统防火墙的核心,已取代传统的 iptables 框架。
- 相比 iptables 的优势:
- 多协议统一管理:单条规则可同时应用于 IPv4 和 IPv6 流量(双栈),无需为不同协议单独配置。
- 工具简化:仅通过
nft一个用户空间工具管理所有协议(iptables 需iptables、ip6tables、arptables等多个工具)。 - 规则集更高效:减少规则冗余,提升数据包匹配效率。
- 兼容性支持:可通过
iptables-translate和ip6tables-translate工具,将传统 iptables 配置文件转换为 nftables 格式,实现平滑迁移。
1.3 firewalld 简介
- 定位:nftables 框架的前端工具(通过
nft命令与内核交互,管理),是 RHEL 9 中推荐的防火墙管理器;在 nftables 之前,曾作为 iptables 服务的替代方案直接操作 iptables。 - 核心特性:基于 zone 的管理:
- 将所有网络流量按“信任级别”划分为不同 zone(区域),每个 zone 有独立的防火墙规则(允许/拒绝的端口、服务),简化复杂网络环境的防火墙配置。
- 流量匹配逻辑:
- 优先匹配数据包源 IP 地址所属的 zone,应用该 zone 规则;
- 若源 IP 无对应 zone,匹配传入网络接口所属的 zone,应用该 zone 规则;
- 若接口也无对应 zone,应用 默认 zone 规则。
- 默认配置:
- 默认 zone:
public(新添加的网络接口默认归属此 zone); - 特殊接口映射:
lo(回环接口)默认归属trustedzone(允许所有流量); - 流量处理原则:仅允许与“传出流量相关”或“匹配 zone 内允许的端口/服务”的流量通过,其余流量默认拒绝(
drop/blockzone 除外)。
- 默认 zone:
1.4 预定义 zone(区域)
firewalld 提供 9 个预定义 zone,每个 zone 有默认的信任级别和流量规则,支持自定义修改。所有 zone 默认允许“与传出流量相关的传入流量”,差异主要在于额外允许的服务/端口。一般会自己定义zone。
| 区域名称(zone name) | 默认配置(允许的传入流量) | 适用场景 |
|---|---|---|
trusted | 允许所有传入流量 | 完全信任的网络(如本地测试环境、内部安全网络) |
home | 允许 ssh、mdns、ipp-client、samba-client、dhcpv6-client 服务 | 家庭网络(信任度高,需文件共享、打印等功能) |
internal | 允许 ssh、mdns、ipp-client、samba-client、dhcpv6-client 服务(与 home 初始配置一致) | 内部办公网络(信任度较高,支持协作相关服务) |
work | 允许 ssh、ipp-client、dhcpv6-client 服务 | 工作网络(信任度中等,仅开放必要办公服务) |
public | 允许 ssh、dhcpv6-client 服务 | 公共网络(如互联网、外部非信任网络,新接口默认归属此 zone) |
external | 允许 ssh 服务;IPv4 传出流量会伪装(NAT),使流量看起来来自传出接口 IP | 作为网关的服务器(对外提供有限服务,同时转发内部流量) |
dmz | 允许 ssh 服务 | 隔离区(DMZ,部署对外服务的服务器,如 Web 服务器,限制与内部网络交互) |
block | 拒绝所有传入流量(仅允许与传出流量相关的) | 高安全需求场景(拒绝所有外部主动连接,仅响应内部发起的请求) |
drop | 丢弃所有传入流量(不响应 ICMP 错误,无任何回复) | 最高安全级别场景(完全隐藏主机,避免被探测) |
1.5 预定义服务
firewalld 内置多个预定义服务,每个服务包含“端口+协议”的组合配置,无需手动查询服务对应的端口,直接引用服务名即可完成防火墙规则配置。
常用预定义服务及配置
| 服务名称(service name) | 配置(端口/协议) | 功能说明 |
|---|---|---|
ssh | TCP:22 | 远程登录服务(默认允许,几乎所有 zone 必备) |
dhcpv6-client | UDP:546(仅 fe80::/64 IPv6 网络) | DHCPv6 客户端服务(获取 IPv6 地址) |
ipp-client | UDP:631 | IPP 打印客户端服务(连接打印机) |
samba-client | UDP:137、138 | Windows 文件/打印共享客户端服务(访问 Samba 共享) |
mdns | UDP:5353(指向 224.0.0.251 IPv4 / ff02::fb IPv6 多播地址) | 多播 DNS 服务(本地链路名称解析,如局域网内设备发现) |
查看预定义服务
- 列出所有预定义服务:
[root@host-]# firewall-cmd --get-services # 输出示例:RH-Satelite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps ...(省略其余服务) - 服务配置文件路径:
/usr/lib/firewalld/services/(文件格式遵循firewalld.zone(5)规范)。
1.6 配置 firewalld 的方法
firewalld 支持两种主流配置方式,满足图形化和命令行管理需求:
firewall-cmd命令行工具:命令行交互,支持脚本自动化,适合服务器远程管理或批量配置。
(kmangd)- Web 控制台(Cockpit):图形化界面,操作直观,适合新手或可视化管理场景。
1.7 从命令行配置防火墙(firewall-cmd)
核心命令规则
filewall-cmd命令会与firewalld进行交互。防火墙机制:底层是netfilter网络过滤器,在此之上就是防火墙白名单(nftables),前端管理是firewalld,是一个守护进程,管理的命令行是firewalld-cmd。
- 配置生效范围:默认操作仅作用于 runtime(运行时) 配置,重启
firewalld或服务器后失效;添加--permanent选项可改为 永久配置(需执行firewall-cmd --reload激活)。 - zone 指定:通过
--zone=<ZONE>选项指定操作的 zone,未指定时默认操作当前默认 zone。 - IP 格式:如需指定子网,使用 CIDR 表示法(如
192.168.1.0/24)(192.168.1/24 子网掩码最后一位0省略)。
常用配置示例
将默认zone设置为dmz,将来自192.168.0.0/24网络的所有流量都分配给internal zone,并在internal zone 上打开mysql服务端口。
-
设置默认 zone:
[root@host-]# firewall-cmd --set-default-zone=dmz -
为 zone 绑定源 IP 段(永久配置):
设定子网:# 将 192.168.0.0/24 网段的流量分配给 internal zone [root@host-]# firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24 -
在 zone 中允许预定义服务(永久配置):
# 在 internal zone 中允许 mysql 服务(需先确保 mysql 是预定义服务) [root@host-]# firewall-cmd --permanent --zone=internal --add-service=mysql -
激活永久配置:
[root@host-]# firewall-cmd --reload # 重新加载配置,使永久配置生效(不中断现有连接) -
查看 zone 配置:
# 查看 internal zone 的所有配置(包括源 IP、允许的服务/端口) [root@host-]# firewall-cmd --zone=internal --list-all
1.8 使用 Web 控制台配置防火墙服务
步骤1:登录 Web 控制台并获取管理员权限**
- 访问服务器的 Web 控制台(默认端口 9090,如
https://<服务器IP>:9090),通过“Limited access”或“Turn on administrative access”按钮升级为特权权限(需输入 root 或 sudo 用户密码)。
步骤2:进入防火墙配置页面**
- 点击左侧导航菜单的 Networking 选项,在“Firewall”部分点击 Edit rules and zones 按钮,进入防火墙配置主页面。
步骤3:查看当前 zone 及允许的服务**
- 页面显示“活动 zone”(如
public)及该 zone 下允许的服务(如 ssh、dhcpv6-client),点击服务名称左侧的>可查看服务详情(端口、协议)。
步骤4:添加允许的服务**
- 点击“Firewall Allowed Services”页面右上角的 Add Services… 按钮,打开“Add services”弹窗;
- 弹窗支持两种添加方式:
- Services:选择预定义服务(可通过“Filter services”输入框搜索,如输入“http”快速定位
http服务); - Custom ports:手动输入自定义端口和协议(如 TCP:8080);
- Services:选择预定义服务(可通过“Filter services”输入框搜索,如输入“http”快速定位
- 勾选目标服务左侧的复选框,点击 Add Services 按钮完成添加。
步骤5:验证配置**
- 返回“Firewall Allowed Services”页面,可在服务列表中看到新添加的服务(如
http),表示配置生效。
2. 控制 SELinux 端口标记
2.1 SELinux 端口标记的核心作用
- SELinux 网络流量控制逻辑:通过“端口标记(Port Label)”实现对网络服务的访问控制——每个网络端口会被分配一个 SELinux 标签(如 22/TCP端口 对应
ssh_port_t),当进程要监听某个端口时,SELinux 会检查“进程标签”与“端口标签”是否匹配,仅匹配时允许进程绑定端口,防止恶意服务抢占合法服务的端口。 - 示例:
ssh进程的标签为sshd_t,仅允许绑定标签为ssh_port_t的端口(默认 22/TCP);httpd进程的标签为httpd_t,仅允许绑定标签为http_port_t的端口(默认 80/TCP、443/TCP)。
2.2 列出 SELinux 端口标签
如果打算在非标准端口上运行服务,SELinux几乎肯定会拦截此流量,在这种情况下,必须更新SELinux端口标签。
1. 查看所有端口标签分配
使用 semanage port -l 命令(semanage 是 SELinux 配置管理工具),输出所有端口的 SELinux 标签、协议及端口号:
[root@host-]# semanage port -l
# 输出示例:
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
# ...(省略其余端口标签)
2. 按服务/端口过滤查询
- 按服务名称过滤:结合
grep查找特定服务相关的端口标签(如查找 FTP 服务的端口标签):[root@host-]# semanage port -l | grep ftp # 输出示例: ftp_data_port_t tcp 20 ftp_port_t tcp 21, 989, 990 tftp_port_t udp 69 - 按端口号过滤:结合
grep -w精确查找某端口对应的标签(如查找 7 号端口的标签):[root@host-]# semanage port -l | grep -w 7 # 输出示例: gopher_port_t tcp 70 gopher_port_t udp 70
2.3 管理 SELinux 端口标签(添加标签)
当服务使用“非标准端口”时(如 httpd 用 8081/TCP 而非默认 80/TCP),需为该端口添加对应的 SELinux 标签,否则 SELinux 会拦截进程绑定端口。
samanage命令可以分配新端口标签,删除端口标签,修改现有端口标签,-a添加,-t类型,-p协议,-d删除,-m更改。
命令语法
格式:semanage port -a -t <端口标签> -p <协议(tcp/udp)> <端口号>
[root@host-]# semanage port -a -t <port_label> -p tcp|udp <PORTNUMBER>
示例:为 71/TCP 端口添加 gopher_port_t 标签
[root@host-]# semanage port -a -t gopher_port_t -p tcp 71验证添加结果(查看自定义修改的端口标签,-C 表示仅显示用户自定义的配置)
[root@host-]# semanage port -l -C
# 输出示例:
SELinux Port Type Proto Port Number
gopher_port_t tcp 71
2.4 删除 SELinux 端口标签
当不再需要某端口的自定义标签时,使用 -d 选项删除(语法与添加类似)。
命令示例:删除 71/TCP 端口的 gopher_port_t 标签
[root@host-]# semanage port -d -t gopher_port_t -p tcp 71
# 验证删除结果(自定义列表中无该端口)
[root@host-]# semanage port -l -C
2.5 修改 SELinux 端口标签
若需变更某端口的标签(如将 71/TCP 从 gopher_port_t 改为 http_port_t),使用 -m 选项直接修改,比“删除旧标签+添加新标签”更高效。
命令示例:将 71/TCP 端口的标签改为 http_port_t
[root@server-]# semanage port -m -t http_port_t -p tcp 71
# 验证修改结果
[root@server-]# semanage port -l | grep -w 71
# 输出示例:
http_port_t tcp 71, 80, 81, 443, ...(省略其余端口)
