news 2026/9/26 7:18:11

Rocky Linux 9.1 生产级网络与安全配置实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rocky Linux 9.1 生产级网络与安全配置实战指南

1. 这不是一份“安装完就扔”的配置手册,而是一套能扛住生产环境拷问的 Rocky Linux 9.1 网络底盘

Rocky Linux 9.1 是 CentOS 停更后,企业级服务器领域最被寄予厚望的稳定替代方案。它不是 Red Hat Enterprise Linux 的简单复刻,而是由社区主导、完全开源、二进制兼容 RHEL 9 的“真·企业级发行版”。我接手过三套从 CentOS 7 升级到 Rocky 9.1 的核心业务系统——一套是金融行业的实时风控平台,一套是医疗影像的 PACS 存储网关,还有一套是制造业的 MES 数据采集中台。它们共同的痛点不是“装不上”,而是“配不稳”:NetworkManager 和传统 ifconfig 混用导致网络时断时续;firewalld 规则一重启就失效;SELinux 在启用后让 Nginx 报错“Permission denied”却查不出源头;DNF 更新时卡在 metadata 下载,或者误删了关键依赖包导致 sshd 直接崩掉。这些都不是理论问题,是凌晨三点你接到告警电话时,必须在 5 分钟内定位并解决的实战压力。

这篇指南,就是我把这三年在真实生产环境里踩过的所有坑、记下的所有参数、写下的所有检查脚本,全部掏出来整理成的一套可落地、可验证、可审计的 Rocky Linux 9.1 网络与系统配置方法论。它不讲“什么是 SELinux”,而是告诉你怎么用sealert -a /var/log/audit/audit.log三步定位一个被拒绝的 socket 绑定行为;它不罗列nmcli connection show的所有字段,而是教你用nmcli c mod "System eth0" ipv4.addresses "192.168.10.50/24"加上ipv4.gateway "192.168.10.1"再加ipv4.dns "8.8.8.8,114.114.114.114"一次性写死静态 IP,且确保重启不失效;它不泛泛而谈 firewalld,而是给出一套“先封死所有端口,再按服务白名单逐个放行”的最小权限策略模板,并附上firewall-cmd --permanent --add-service=http --add-service=https后必须执行firewall-cmd --reload的血泪教训。如果你正在部署一套需要连续运行 365 天无宕机的后台服务,或者正为新上线的 Kubernetes 集群节点网络稳定性发愁,又或者只是想把家里的 NAS 服务器从 Ubuntu 换成更稳的 Rocky,那你手里的这份指南,就是你打开系统底层控制权的第一把钥匙。它不承诺“一键搞定”,但保证每一步操作都有明确意图、可逆路径和验证手段。

2. 整体设计逻辑:为什么放弃“图形界面+向导式配置”,而选择命令行驱动的声明式管理?

Rocky Linux 9.1 的底层网络栈,本质上是一套高度模块化、分层清晰的协作体系。它不是单点工具,而是一个由 NetworkManager(负责连接生命周期管理)、systemd-networkd(轻量级替代方案)、firewalld(netfilter 的策略封装层)、SELinux(强制访问控制引擎)和 DNF(软件包与依赖关系的权威仲裁者)共同构成的“五边形防御阵型”。很多新手会本能地去/etc/sysconfig/network-scripts/ifcfg-eth0手动改 IP,结果发现 NetworkManager 自动覆盖了它;或者用iptables -A INPUT -p tcp --dport 22 -j ACCEPT加规则,却发现 firewalld 重启后全没了;又或者setenforce 0临时关闭 SELinux 解决了问题,却在第二天发现 audit.log 里堆满了被拒绝的 avc 日志,根本不知道哪个服务偷偷开了 root 权限。这些混乱,根源在于没有理解 Rocky 9.1 的设计哲学:它默认采用“声明式配置”而非“命令式操作”。

声明式,意味着你告诉系统“我要什么状态”,而不是“执行哪条命令”。比如,你不是说“把 eth0 的 IP 设成 192.168.10.50”,而是说“我声明名为 ‘Production LAN’ 的连接,其 IPv4 地址应为 192.168.10.50/24,网关为 192.168.10.1,DNS 为 114.114.114.114”。NetworkManager 会持续监控这个声明,并在网卡热插拔、DHCP 租约到期、甚至系统重启后,自动将底层设备拉回到你声明的状态。这种模式天然具备幂等性——你执行十次nmcli c mod,结果都一样;也天然具备可审计性——所有连接配置都存于/etc/NetworkManager/system-connections/下的加密文件中,ls -lZ一眼就能看出 SELinux 上下文是否正确。

所以,本指南彻底放弃 GUI 配置工具和零散的 shell 命令拼凑。我们只做三件事:第一,用nmcli或编辑.nmconnection文件,完成网络连接的“声明”;第二,用firewall-cmd的--permanent参数,完成防火墙策略的“持久化声明”;第三,用semanage和restorecon,完成 SELinux 上下文的“策略声明”。DNF 则作为整个系统的“契约执行者”,它下载的每一个 RPM 包,都附带了该包对 SELinux 类型、firewalld 服务定义、NetworkManager 配置片段的完整声明。当你运行dnf install nginx,它不只是复制文件,而是自动注册http服务到 firewalld,自动设置/usr/share/selinux/targeted/nginx.te策略模块,并在/etc/firewalld/services/下生成nginx.xml。这套机制,才是 Rocky Linux 9.1 稳定性的真正基石。你越早接受“声明即配置”的思维,就越少遇到“配置生效了但重启就丢”的幻觉。

2.1 NetworkManager:不是“替代 ifconfig”,而是“接管整个网络生命周期”

NetworkManager 在 Rocky 9.1 中已不再是可选组件,而是 systemd 服务NetworkManager.service的默认启动项。它的核心价值,远不止于“图形界面里点几下就能连 Wi-Fi”。它是一套完整的网络状态机引擎,管理着从物理网卡探测、链路层协商(LLDP/CDP)、IP 地址分配(DHCP/Static/IPv6 RA)、路由表维护、DNS 解析器配置(/etc/resolv.conf 的动态生成),到连接故障自动恢复(如主备网卡切换、Wi-Fi 信号弱时自动重连)的全链条。很多人误以为ifconfig或ip addr是“底层”,NetworkManager 是“上层包装”,这是致命误解。实际上,在 Rocky 9.1 中,ip addr显示的是 NetworkManager 的“当前执行结果”,而nmcli device status显示的是 NetworkManager 的“内部状态缓存”。两者不一致?那一定是 NetworkManager 的某个子模块出了问题,而不是ip命令错了。

举个典型场景:你用nmcli c add type ethernet con-name "Backup WAN" ifname eth1创建了一个新连接,但ip a s eth1里始终看不到 IP。这时别急着ip addr add,先看nmcli c show "Backup WAN"—— 如果GENERAL.STATE是unmanaged,说明 NetworkManager 根本没接管 eth1,可能因为/etc/NetworkManager/conf.d/99-unmanaged.conf里写了keyfile unmanaged-devices=interface-name:eth1;如果状态是disconnected,那就得查nmcli c show "Backup WAN" | grep ipv4.method,确认是不是auto(DHCP)但 DHCP 服务器没响应,还是manual但漏写了ipv4.addresses。这种排查路径,是ifconfig永远给不了你的。NetworkManager 的日志journalctl -u NetworkManager -f会实时输出类似device (eth0): state change: ip-config -> ip-check (reason 'none')的状态流转,这才是诊断网络问题的黄金线索。

提示:nmcli的所有修改,只要没加--temporary参数,都是永久生效的。nmcli c mod "MyConn" ipv4.addresses "10.0.0.100/24"这条命令,会直接写入/etc/NetworkManager/system-connections/MyConn.nmconnection文件。你可以用cat /etc/NetworkManager/system-connections/MyConn.nmconnection查看原始配置,里面ipv4.addresses=10.0.0.100/24这一行,就是你声明的“事实”。NetworkManager 启动时,会读取这个文件,并据此驱动内核网络栈。所以,备份这个目录,就等于备份了你所有的网络连接配置。

2.2 firewalld:不是“iptables 的图形界面”,而是“策略即代码”的安全中枢

firewalld 的本质,是一个运行在用户空间的策略编排器。它不直接操作 netfilter 规则,而是通过libnfnetlink库,将你声明的“服务”、“端口”、“富规则”翻译成一组标准化的、可复用的 iptables/nftables 规则链。它的核心优势在于“区域(zone)”模型。Rocky 9.1 默认有public、internal、trusted等 9 个 zone,每个 zone 都预定义了一套基础策略。比如publiczone 默认拒绝所有入站连接,只允许 SSH;internalzone 则允许 SSH、DHCPv6-client、mdns 等更多服务。你不需要记住iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT这种易错的语法,只需firewall-cmd --permanent --zone=public --add-service=http,firewalld 就会自动加载/usr/lib/firewalld/services/http.xml里定义的<port protocol="tcp" port="80"/>,并将其注入到publiczone 的规则集中。

更重要的是,firewalld 支持“运行时”和“永久”两个配置层。firewall-cmd --add-port=8080/tcp是运行时生效,重启 firewalld 服务就丢失;而firewall-cmd --permanent --add-port=8080/tcp是写入/etc/firewalld/zones/public.xml,下次firewall-cmd --reload或服务重启时才生效。这个分离设计,是防止误操作导致服务中断的关键。我见过太多人firewall-cmd --remove-service=ssh后忘了加--permanent,结果systemctl restart firewalld,SSH 连接直接断开,只能靠控制台硬重启。所以,我的铁律是:所有firewall-cmd操作,必须同时带上--permanent和--reload。firewall-cmd --permanent --add-service=https && firewall-cmd --reload,两步缺一不可。--reload不是“重新加载”,而是“原子性地切换到新配置”,旧规则瞬间清空,新规则瞬间生效,中间没有毫秒级的“无防护窗口”。

注意:firewall-cmd --list-all显示的是当前运行时的完整策略,包括所有--permanent和--add的叠加效果。而firewall-cmd --permanent --list-all只显示/etc/firewalld/下的持久化配置。两者不一致?说明你执行了--add但没--reload,或者执行了--reload但没--permanent。用firewall-cmd --state确认服务是否在运行,用firewall-cmd --get-active-zones确认网卡绑定的 zone,这是排查防火墙问题的起点。

2.3 SELinux:不是“鸡肋安全模块”,而是“进程行为的宪法”

SELinux 是 Rocky Linux 9.1 安全模型的基石,但它常被妖魔化为“麻烦制造者”。真相是:当它工作时,你感觉不到;当它报错时,你才意识到它一直在默默守护。它的核心是“类型强制(TE)”模型。每个进程、每个文件、每个端口,都被打上一个“安全上下文(security context)”标签,比如system_u:system_r:httpd_t:s0(Nginx 进程)、system_u:object_r:httpd_sys_content_t:s0(网站根目录/var/www/html)。SELinux 策略规定,httpd_t类型的进程,只能读取httpd_sys_content_t类型的文件,只能绑定http_port_t类型的端口(80/443),不能写入user_home_t类型的家目录。这种细粒度的控制,远超传统 Linux DAC(自主访问控制)的rwx权限。

所以,当你setenforce 0后 Nginx 能启动了,那不是 SELinux “错了”,而是它精准地拦截了一个非法行为。真正的解法,不是关掉它,而是修复上下文或策略。比如,你把网站文件放在/home/myuser/www,Nginx 就会因avc: denied { read } for ... scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0被拒。这时chcon -R -t httpd_sys_content_t /home/myuser/www就能修复。或者,你用semanage port -a -t http_port_t -p tcp 8080,就能让 SELinux 认可 8080 端口为 HTTP 服务端口。sealert -a /var/log/audit/audit.log是你的终极武器,它能把晦涩的 avc 日志,翻译成一句人话:“SELinux 阻止了 httpd 访问 /home/myuser/www/index.html。建议运行chcon -t httpd_sys_content_t '/home/myuser/www/index.html'”。这才是高效运维的正确姿势。

3. 核心实操:从裸机安装到高可用网络的七步闭环

Rocky Linux 9.1 Minimal ISO 安装后,系统处于一个“干净但脆弱”的状态。它没有图形界面,没有预装任何服务,网络默认是 DHCP 获取,firewalld 和 SELinux 都是启用状态。我们的目标,是把它变成一台随时可以上线的生产服务器。整个过程分为七个不可跳过的步骤,每一步都对应一个可验证的状态点。

3.1 步骤一:初始化系统与网络声明(5分钟)

安装完成后,首次登录,第一件事不是装软件,而是固化网络。Minimal ISO 默认启用 NetworkManager,但连接名是随机的(如Wired connection 1)。我们需要一个语义清晰、便于管理的连接名。

# 1. 查看当前所有连接 nmcli connection show # 2. 重命名默认连接(假设网卡名是 ens192) nmcli connection modify "Wired connection 1" connection.id "Prod-LAN" # 3. 声明静态 IP(替换为你的真实网段) nmcli connection modify "Prod-LAN" \ ipv4.method manual \ ipv4.addresses "192.168.10.50/24" \ ipv4.gateway "192.168.10.1" \ ipv4.dns "114.114.114.114,8.8.8.8" \ ipv4.ignore-auto-routes yes \ ipv4.ignore-auto-dns yes # 4. 关闭 DHCP 获取的 DNS 和路由,避免冲突 nmcli connection modify "Prod-LAN" ipv4.ignore-auto-routes yes ipv4.ignore-auto-dns yes # 5. 激活连接 nmcli connection up "Prod-LAN"

执行完,ip a s ens192应该显示inet 192.168.10.50/24,ip r应该有default via 192.168.10.1 dev ens192。ping -c 3 192.168.10.1和ping -c 3 114.114.114.114必须全通。这是整个网络的“锚点”,后续所有配置都基于此 IP 展开。如果失败,请立即journalctl -u NetworkManager | tail -30查看错误,常见原因是网卡名不对(用ip link show确认)或网关不可达。

3.2 步骤二:加固防火墙策略(3分钟)

Rocky 9.1 默认publiczone,只开放 SSH。我们必须显式声明所有需要的服务端口,其他一律拒绝。

# 1. 确保 firewalld 运行 systemctl enable --now firewalld # 2. 检查当前 active zone firewall-cmd --get-active-zones # 3. 将 Prod-LAN 连接绑定到 public zone(如果还没绑定) firewall-cmd --permanent --zone=public --change-interface=ens192 # 4. 开放必要服务(HTTP/HTTPS/SSH) firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --permanent --zone=public --add-service=https firewall-cmd --permanent --zone=public --add-service=ssh # 5. 如果需要自定义端口(如 Docker API 2376) firewall-cmd --permanent --zone=public --add-port=2376/tcp # 6. 重载防火墙(关键!) firewall-cmd --reload # 7. 验证 firewall-cmd --list-all

firewall-cmd --list-all输出中,services:行应该包含http https ssh,ports:行应该有你添加的自定义端口。此时,从外部telnet 192.168.10.50 80应该能连上(即使 Nginx 没装),telnet 192.168.10.50 22也能连上。telnet 192.168.10.50 3306(MySQL)则应该超时,证明默认拒绝策略生效。

3.3 步骤三:验证并调优 SELinux(2分钟)

SELinux 默认是enforcing模式,这是安全底线。我们不做关闭,只做验证和微调。

# 1. 确认状态 sestatus # 2. 查看当前上下文(以 root 为例) ls -Z /root # 3. 检查 audit.log 是否有近期 avc 拒绝(无输出表示一切正常) ausearch -m avc -ts recent | head -5 # 4. 如果有拒绝日志,用 sealert 分析(假设有日志) sealert -a /var/log/audit/audit.log | head -20

sestatus输出Current mode: enforcing和Mode from config file: enforcing是理想状态。ausearch无输出,说明没有新的 SELinux 拒绝事件。如果有,sealert会给出具体修复建议。这一步的意义在于建立基线:我们知道系统当前是“干净”的,后续任何服务安装引发的 SELinux 报错,都是那个服务本身的问题,而非系统配置错误。

3.4 步骤四:DNF 配置与基础软件安装(5分钟)

Rocky 9.1 的 DNF 源默认指向官方镜像,但在国内,速度可能很慢。我们使用阿里云镜像源,并启用 fastestmirror 插件自动选择最优节点。

# 1. 备份原 repo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak # 2. 替换 baseos 和 appstream repo(Rocky 9.1) sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/rocky*.repo sed -i 's|#baseurl=http://dl.rockylinux.org|baseurl=https://mirrors.aliyun.com/rocky|g' /etc/yum.repos.d/rocky*.repo # 3. 启用 fastestmirror sed -i 's/enabled=0/enabled=1/g' /etc/dnf/plugins/fastestmirror.conf # 4. 清理缓存并生成新元数据 dnf clean all && dnf makecache # 5. 安装基础工具(vim, wget, curl, htop, net-tools) dnf install -y vim-enhanced wget curl htop net-tools # 6. 验证安装 which vim && which htop

dnf makecache成功后,dnf repolist应该显示rocky-baseos和rocky-appstream两个仓库,status为enabled。dnf install完成后,vim --version应该输出版本号,证明包管理器工作正常。这一步看似简单,却是后续所有操作的基础。如果dnf卡住,90% 的原因是网络或镜像源问题,而不是 DNF 本身。

3.5 步骤五:配置时间同步(NTP/Chrony)(2分钟)

Rocky 9.1 默认使用chronyd作为 NTP 客户端,比老式的ntpd更精准、更省资源。我们只需确保它启用并同步。

# 1. 启用并启动 chronyd systemctl enable --now chronyd # 2. 查看同步状态 chronyc tracking # 3. 查看源服务器 chronyc sources -v # 4. 强制立即同步(可选) chronyc makestep

chronyc tracking输出中,System clock offset应该在-100ms到+100ms之间,Leap status应该是Normal。chronyc sources应该列出至少一个^*(当前主同步源)和几个^+(备用源)。时间不同步,会导致 SSL 证书校验失败、Kubernetes 节点无法加入集群、日志时间戳混乱等一系列连锁问题。这是最容易被忽视,却最致命的配置。

3.6 步骤六:创建标准运维用户(3分钟)

绝不使用 root 进行日常操作。我们创建一个具有 sudo 权限的普通用户,并禁用 root 密码登录。

# 1. 创建用户(替换 yourname) useradd -m -c "Ops Admin" yourname # 2. 设置密码 passwd yourname # 3. 将用户加入 wheel 组(sudo 权限组) usermod -aG wheel yourname # 4. 编辑 sudoers(推荐用 visudo,安全) visudo # 5. 确保以下行未被注释(Rocky 9.1 默认已存在) %wheel ALL=(ALL) ALL # 6. 禁用 root 密码登录(编辑 sshd_config) sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config systemctl restart sshd

su - yourname切换后,sudo whoami应该输出root。ssh yourname@192.168.10.50应该能成功登录,而ssh root@192.168.10.50应该被拒绝。这一步建立了最小权限原则的第一道防线。

3.7 步骤七:生成系统快照与配置清单(2分钟)

最后一步,不是安装软件,而是记录。我们生成一份可审计、可回滚的系统快照。

# 1. 记录网络配置 nmcli c show "Prod-LAN" > /root/config/network-prod-lan.txt # 2. 记录防火墙策略 firewall-cmd --list-all > /root/config/firewall-public.txt # 3. 记录 SELinux 状态 sestatus > /root/config/selinux-status.txt # 4. 记录已安装包(关键!) dnf list installed > /root/config/dnf-installed-list.txt # 5. 记录关键服务状态 systemctl list-unit-files --state=enabled > /root/config/enabled-services.txt # 6. 打包备份 tar -czf /root/config/rocky91-initial-snapshot-$(date +%Y%m%d).tgz /root/config/

这个rocky91-initial-snapshot-20240520.tgz文件,就是你这台服务器的“数字基因图谱”。它包含了所有声明式配置的原始状态。未来任何变更,你都可以用diff对比这个快照,快速定位是哪条nmcli命令、哪个firewall-cmd参数、哪次dnf update导致了问题。这才是专业运维的起点。

4. 高频问题排查与独家避坑技巧实录

在上百台 Rocky Linux 9.1 服务器的部署和维护中,我总结出一套“问题现象 → 排查路径 → 根本原因 → 修复命令”的速查表。这些不是教科书上的通用答案,而是我在现场掐表计时、反复验证后提炼出的“黄金组合”。

问题现象排查命令根本原因修复命令实操心得
nmcli c show显示连接unmanagednmcli device status
cat /etc/NetworkManager/NetworkManager.conf
NetworkManager 配置文件中unmanaged-devices项屏蔽了该网卡sed -i '/unmanaged-devices/d' /etc/NetworkManager/NetworkManager.conf
systemctl restart NetworkManager
避坑:Minimal ISO 安装后,有时会自动生成99-unmanaged.conf,专门屏蔽某些虚拟网卡。不要盲目删文件,先grep -r unmanaged /etc/NetworkManager/conf.d/找到具体文件再删。
firewall-cmd --list-all显示http服务,但curl http://localhost返回Connection refusedss -tlnp | grep :80
systemctl status nginx
防火墙放行了端口,但 Nginx 服务根本没启动,或监听地址不对(如只监听127.0.0.1:80)systemctl start nginx
echo "listen 0.0.0.0:80;" >> /etc/nginx/nginx.conf
避坑:firewall-cmd只管“门”,不管“屋里有没有人”。永远先确认服务进程在运行,再查防火墙。ss -tlnp比netstat更快、更准。
dnf update卡在Downloading Packages...dnf makecache
curl -I https://mirrors.aliyun.com/rocky/9/BaseOS/x86_64/os/repodata/repomd.xml
镜像源配置错误,或 DNS 解析失败,或网络策略阻止了 HTTPS 连接dnf clean all
dnf makecache
ping -c 3 mirrors.aliyun.com
避坑:dnf makecache失败时,dnf不会报错,只会静默退出。务必手动curl测试镜像源 URL 是否可达。国内云厂商 VPC 内,有时需额外开通公网 NAT 网关。
sestatus显示disabled,但/etc/selinux/config是enforcingcat /proc/sys/kernel/grsecurity/
ls /sys/fs/selinux/
内核启动参数selinux=0覆盖了配置文件,或系统使用了不支持 SELinux 的内核grubby --info /boot/vmlinuz-$(uname -r)
grep selinux /proc/cmdline
避坑:/etc/selinux/config只是“愿望”,/proc/cmdline才是“现实”。grep selinux /proc/cmdline是唯一权威判断。若输出selinux=0,需grubby --update-kernel=ALL --args="selinux=1"并重启。
sudo dnf install docker-ce报错No match for argument: docker-cednf search docker
dnf repolist --all | grep docker
Rocky 9.1 官方仓库不包含docker-ce,它被移到了crb(CodeReady Builder)仓库,需手动启用dnf config-manager --set-enabled crb
dnf install docker-ce
避坑:docker-ce不是 Rocky 的“核心”包,而是“开发工具”包,放在crb仓库。dnf config-manager是启用仓库的唯一正确方式,不要手动编辑 repo 文件。

4.1 独家技巧:用nmcli实现“网卡热备”的三行脚本

生产环境要求网络高可用。Rocky 9.1 原生支持 Bonding(链路聚合),但配置复杂。一个更轻量、更灵活的方案是用nmcli实现主备网卡自动切换。

# 创建主连接(eth0) nmcli c add type ethernet con-name "Primary-LAN" ifname eth0 nmcli c mod "Primary-LAN" ipv4.method manual ipv4.addresses "192.168.10.50/24" ipv4.gateway "192.168.10.1" ipv4.dns "114.114.114.114" # 创建备连接(eth1),不设网关,只设 IP(用于检测) nmcli c add type ethernet con-name "Backup-LAN" ifname eth1 nmcli c mod "Backup-LAN" ipv4.method manual ipv4.addresses "192.168.20.50/24" # 关键:设置主连接的 autoconnect-priority(越高越优先) nmcli c mod "Primary-LAN" connection.autoconnect-priority 100 nmcli c mod "Backup-LAN" connection.autoconnect-priority 50

NetworkManager 会自动监控Primary-LAN的链路状态。一旦eth0断开(网线拔掉),它会在几秒内自动down主连接,并up优先级更低的Backup-LAN。此时ip r会显示default via 192.168.20.1 dev eth1(前提是 eth1 网关已配置)。整个过程无需脚本,是 NetworkManager 内置的 failover 机制。这是我在线上用过的最稳定的“软切换”方案。

4.2 独家技巧:firewalld的“服务白名单”模板

为避免firewall-cmd --add-port造成端口泛滥,我制定了一套“服务白名单”模板。所有新服务,必须走这个流程:

  1. 定义服务文件:在/etc/firewalld/services/下创建myapp.xml
    <?xml version="1.0" encoding="utf-8"?> <service> <short>MyApp</short> <description>My Custom Application API</description> <port protocol="tcp" port="8080"/> <port protocol="tcp" port="8081"/> <destination address="192.168.10.0/24"/> </service>
  2. 重载 firewalld
    firewall-cmd --reload
  3. 在指定 zone 中启用
    firewall-cmd --permanent --zone=public --add-service=myapp firewall-cmd --reload

这样,myapp就成了一个可复用的、带描述的、带源地址限制的安全单元。firewall-cmd --list-services会显示myapp,firewall-cmd --info-service=myapp会显示其详细定义。比一堆--add-port命令清晰一万倍。

4.3 独家技巧:dnf的“安全更新”三步法

dnf update会升级所有包,风险极高。生产环境必须只升级安全补丁。

# 1. 列出所有可用的安全更新 dnf updateinfo list security all # 2. 查看某个包的安全详情(如 kernel) dnf updateinfo info security kernel # 3. 仅安装安全更新 dnf update --security

dnf update --security是 Rocky 9.1 的标配功能,它只拉取标记为security的 errata。dnf updateinfo list security的输出中,Critical和Important级别的更新,必须在 24 小时内完成。这是合规审计的硬性要求。

5. 后续演进:从单机配置到集群治理的平滑路径

这套 Rocky Linux 9.1 的配置方法论,其价值不仅在于单台服务器的稳定,更在于它为大规模集群治理铺平了道路。当你把nmcli、firewall-cmd、semanage的所有操作,都抽象成 YAML 声明(例如 Ansible 的nmcli模块、firewalld模块),你就拥有了基础设施即代码(IaC)的雏形。一个rocky91-base.ymlplaybook,可以秒级部署 100 台完全一致的节点。

更进一步,Rocky

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 7:18:07

Elasticsearch Java开发实战:从倒排索引原理到集群调优

先交代一句&#xff1a;这篇内容不是为了把某一条面试题背到手软&#xff0c;而是想让一个零基础的Java开发&#xff0c;从原理到实操、从安装到调优&#xff0c;把Elasticsearch这条线彻底打通。面试题只是引子&#xff0c;真正的价值在于搞清楚ES到底怎么工作、Java项目里怎么…

作者头像 李华
网站建设 2026/9/26 7:18:05

工控产线无桌面终端国密双因子落地:从安当SLA看操作系统登录双因素认证的工程实践

一、为什么无桌面工控场景必须上双因子 在工厂车间、轨交外场、军用指挥车、电力变电站这类环境里&#xff0c;操作终端通常只有一块串口屏、一个指示灯&#xff0c;甚至完全没有本地人机界面。这类“无桌面板”设备有几个共同特征&#xff1a; 终端常年在网运行&#xff0c;但…

作者头像 李华
网站建设 2026/9/26 7:17:23

Read the Docs 构建故障排查与性能优化实战指南

后端文档 【免费下载链接】readthedocs.org The source code that powers readthedocs.org 项目地址&#xff1a; https://gitcode.com/gh_mirrors/re/readthedocs.org 点击查看 免费下载 本篇技术指南以 readthedocs.org 官方文档中的"故障排查"&#xff08;Troubl…

作者头像 李华
网站建设 2026/9/26 7:17:01

CNSH通用翻译引擎:全语言互译、AI鉴定与来源追溯的工程实践

两年前我们接了一个跨境电商多语言客服的项目&#xff0c;被机器翻译的质量和不可追溯性折磨到怀疑人生。明明术语表里写着”退款”要翻译成”refund”&#xff0c;线上翻出来却变成”return”&#xff0c;客户工单来回折腾十几轮。更头疼的是&#xff0c;运营想知道这句译文到…

作者头像 李华
网站建设 2026/9/26 7:16:15

Jev:面向确定性AI的类型安全运行时

1. 这不是又一个“AI模型”&#xff0c;而是一次对行业叙事的精准外科手术“发布3天登顶HN”——Hacker News首页的黄金位置&#xff0c;向来是技术圈最硬核的流量试金石。它不看PPT有多炫&#xff0c;不care融资额有多高&#xff0c;只认一件事&#xff1a;你解决的问题是否真…

作者头像 李华