Rocky Linux 9/10 企业级初始化、安全加固与运维实践指南

欢迎你来读这篇博客,这篇博客主要是关于 Rocky Linux 9/10 企业级初始化、安全加固与运维实践

它不是一份“装完系统之后复制几条命令”的简单教程,而是一份面向企业服务器交付、Java 后端部署、容器宿主机、基础安全基线、日常运维排障和 CentOS 7 迁移的系统化手册。

序言

很多 Linux 初始化教程还停留在 CentOS 7 时代:

  • yumdnf 混着用;
  • 继续编辑 /etc/sysconfig/network-scripts/ifcfg-*
  • 直接关闭 SELinux;
  • 直接关闭 firewalld;
  • 只安装 vimwgetnet-tools
  • 网络、审计、日志、安全、容器、自动更新几乎不管;
  • 一台服务器“能 ping、能 ssh、能跑服务”就算交付。

这种做法在个人测试环境里可以凑合,但在企业生产环境里并不合格。真正的企业级初始化,目标不是“能跑”,而是:

  • 可维护;
  • 可审计;
  • 可回滚;
  • 可排障;
  • 可迁移;
  • 可安全交付;
  • 半年后还能知道当初为什么这么配。

尤其是 Rocky Linux 9/10,已经不是 CentOS 7 的换皮。网络配置、包管理、安全策略、容器生态、systemd 管理方式都有明显变化。继续拿 CentOS 7 的习惯去初始化 Rocky 9/10,就像拿诺基亚教程教别人开发 iPhone App —— 不是不能学历史,但别拿它上线。

本文基于 Rocky Linux 9/10 的现代实践重新整理,重点纠正以下旧习惯:

旧习惯 新建议
yumdnf 混用 正文统一使用 dnf,Rocky 10 注意 dnf5
编辑 /etc/sysconfig/network-scripts 使用 NetworkManager / nmcli
systemctl restart network 使用 nmcli con reload/up 或 NetworkManager
关闭 SELinux 保持 Enforcing,学会放行和排错
关闭 firewalld 保持开启,只开放必要端口
只用 iptables 思维 使用 firewalld / nftables
只讲 Docker 增加 Podman / Buildah / Skopeo / Quadlet
只讲基础命令 增加 auditd、fail2ban、journald、tuned、dnf-automatic
只讲静态 IP 增加 Bond、VLAN、Bridge、静态路由
只讲 LVM 创建 增加 LVM 扩容、fstab 风险、文件系统扩容

本文适合以下场景:

  • 云服务器初始化;
  • VMware / KVM 虚拟机初始化;
  • 裸金属服务器初始化;
  • Java 后端应用服务器;
  • Podman / Docker 容器宿主机;
  • Kubernetes Node 预备环境;
  • 企业内网服务器交付;
  • CentOS 7 / Rocky 8 向 Rocky 9/10 迁移。

正文

第一章 Rocky Linux 简介

1.1 Rocky Linux 是什么

Rocky Linux 是一个企业级 Linux 发行版,目标是提供与 Red Hat Enterprise Linux,也就是 RHEL,兼容的社区发行版。

它常用于:

  • 企业服务器;
  • 数据库服务器;
  • 中间件服务器;
  • Java 应用服务器;
  • 容器宿主机;
  • 虚拟化环境;
  • 内网基础设施;
  • 替代 CentOS 7/8 的长期稳定发行版。

你可以简单理解为:

Rocky Linux 是企业 Linux 生态中的稳定型选手,不追求天天上新功能,而是追求长期稳定、安全维护、RHEL 生态兼容。

1.2 为什么选择 Rocky Linux

选择 Rocky Linux 的主要原因:

  1. RHEL 生态兼容

    企业软件、中间件、数据库、监控、备份、安全扫描工具,很多都围绕 RHEL 生态适配。Rocky Linux 的优势在于尽量贴近这个生态。

  2. 生命周期长

    Rocky 8/9/10 都有相对长的维护周期,适合服务器长期稳定运行。

  3. 适合生产环境

    相比滚动发行版,Rocky 更适合“业务服务器”,不是天天追新,而是稳。

  4. 社区活跃

    Rocky Linux 社区、文档、镜像、EPEL 生态都比较完善。

  5. 迁移成本可控

    从 CentOS 7/8 迁移到 Rocky Linux,思维成本比迁移到 Debian/Ubuntu 小很多。

1.3 Rocky Linux 与 CentOS / AlmaLinux 对比

项目 CentOS 7 CentOS Stream Rocky Linux AlmaLinux
定位 传统 RHEL rebuild RHEL 上游滚动预览 RHEL 兼容重构 RHEL 兼容重构
新项目推荐 不推荐 谨慎 推荐 推荐
稳定性 已经过生命周期 更偏前置验证 稳定 稳定
企业生态 老项目很多 与 RHEL 节奏不同 RHEL 生态友好 RHEL 生态友好
学习迁移成本 熟悉但老旧 中等 中等 中等

我的建议:

  • 新生产项目:优先 Rocky Linux 9;新硬件、新容器宿主机可以评估 Rocky Linux 10。
  • 老系统续命:不要继续新装 CentOS 7。
  • 强稳定保守业务:Rocky 9 更稳妥。
  • 想跟进新生态:Rocky 10 可以作为新平台规划。

1.4 Rocky Linux 版本生命周期

大方向:

  • Rocky Linux 8:适合存量系统维护;
  • Rocky Linux 9:当前生产部署的稳妥选择;
  • Rocky Linux 10:面向新硬件、新容器生态、新平台建设。

新项目不要只看“哪个版本新”,还要看硬件兼容、团队运维经验、第三方软件支持情况。

1.5 Minimal 安装建议

企业服务器建议选择 Minimal 安装。

不要在生产服务器上安装完整图形桌面,原因很简单:

  • 包更多,漏洞面更大;
  • 服务更多,资源占用更多;
  • 排障更复杂;
  • 没必要。

推荐原则:

  • 只安装必要组件;
  • 使用普通用户登录;
  • 使用 sudo 提权;
  • SSH 密钥登录;
  • 保留 SELinux;
  • 保留 firewalld;
  • 日志持久化;
  • 开启审计;
  • 配置监控;
  • 记录交付信息。

第二章 Rocky Linux 版本选择与迁移路线

2.1 CentOS 7 到 Rocky Linux 的迁移思路

CentOS 7 到 Rocky Linux 的迁移,不建议直接照搬配置文件。更推荐:

新系统重新安装 + 配置迁移 + 数据迁移 + 验证切换。

迁移重点不是“系统能不能启动”,而是:

  • 网络配置是否变更;
  • 防火墙规则是否迁移;
  • SELinux 上下文是否正确;
  • 应用服务是否 systemd 托管;
  • 用户与 sudo 权限是否一致;
  • crontab / timer 是否迁移;
  • 数据库与中间件版本是否兼容;
  • 日志路径是否一致;
  • 监控与备份是否接入;
  • 回滚方案是否准备好。

2.2 CentOS 7 到 Rocky 9/10 的关键差异

CentOS 7 习惯 Rocky 9/10 推荐方式
yum dnf / Rocky 10 注意 dnf5
/etc/sysconfig/network-scripts NetworkManager / nmcli / keyfile
systemctl restart network nmcli con reloadnmcli con up、NetworkManager
iptables firewalld / nftables
ntpd chrony
关闭 SELinux SELinux Enforcing
关闭 firewalld firewalld 开启,最小端口开放
service 脚本 systemd unit
Docker-only Podman / Docker 按场景选择
手动日志清理 journald + rsyslog + logrotate

2.3 Rocky 8 与 Rocky 9 差异

Rocky 8 和 Rocky 9 看起来都很像 RHEL 系,但运维上有几个差异需要注意:

  1. 网络配置主线变化

    Rocky 9 更强调 NetworkManager 的 keyfile 方式。老的 ifcfg 文件还可能被兼容读取,但不应该再作为新教程主线。

  2. 加密策略变化

    新版本 OpenSSL、系统 crypto policy 更严格,可能影响老应用、老 TLS 协议、老 SSH 算法。

  3. 容器生态变化

    Podman、cgroups v2、rootless 容器生态更成熟。

  4. 软件版本更新

    Java、Python、数据库、Web 服务器版本都比 Rocky 8 更新。

2.4 Rocky Linux 10 新特性与注意事项

Rocky Linux 10 不是“Rocky 9 加个版本号”。它有一些需要提前知道的变化:

  1. x86_64 硬件基线提升

    Rocky 10 在 x86_64 上以 x86-64-v3 为基线,老 CPU 可能无法安装。上线前必须检查 CPU 兼容性。

  2. 移除 x86_64 上的 32 位兼容包

    如果你有很老的 32 位依赖,不能想当然迁移。

  3. DNF5

    Rocky 10 引入下一代 DNF,部分命令行为与旧版 dnf 有差异,尤其是模块化相关能力。

  4. Podman 5

    容器运行时、cgroups、Quadlet 支持都更现代。

  5. 新硬件支持更好

    对新服务器、新 CPU、新平台更友好。

我的建议:

场景 推荐版本
传统生产 Java 应用 Rocky 9
新服务器、新容器平台 Rocky 10 可评估
老硬件 Rocky 9 或 Rocky 8
从 CentOS 7 迁移 优先 Rocky 9
强依赖老软件 先做兼容性验证

第三章 安装建议与系统初始化原则

3.1 安装介质选择

常见安装镜像:

  • Minimal ISO;
  • DVD ISO;
  • Boot ISO;
  • Cloud Image;
  • Container Image。

企业服务器推荐:

  • 虚拟机:Minimal ISO 或 Cloud Image;
  • 裸金属:DVD ISO / PXE / Kickstart;
  • 云服务器:云厂商官方 Rocky 镜像;
  • 批量交付:Kickstart + Ansible / Terraform / Packer。

3.2 分区建议

通用建议:

挂载点 建议大小 说明
/boot 1G 内核与启动文件
/boot/efi 600M - 1G UEFI 启动
/ 50G 起 系统盘
/var 20G 起 系统日志、缓存
/app 按业务 应用部署目录
/data 按业务 业务数据
/logs 按业务 应用日志
swap 按内存与业务 数据库/容器/K8s 需单独评估

我的建议:

  • 小型应用服务器:/ + /data 即可;
  • 中型生产服务器://app/data/logs 分开;
  • 数据库服务器:数据盘、日志盘、备份盘分开;
  • 容器宿主机:重点规划 /var/lib/containers 或 Docker 数据目录。

3.3 初始化前检查

安装完成后先确认系统状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
cat /etc/os-release
cat /etc/redhat-release
uname -r
uname -a
hostnamectl
timedatectl
lsblk
lsblk -f
ip addr
ip route
nmcli device status
nmcli connection show
systemctl --failed

检查失败服务:

1
2
systemctl --failed
journalctl -p err -b

第四章 DNF 软件源配置

4.1 统一使用 dnf

Rocky Linux 8/9/10 应统一使用 dnf 作为包管理命令。虽然部分系统中 yum 仍然可用,甚至可能只是兼容入口,但教程和脚本不应该继续混用。

推荐写法:

1
2
3
sudo dnf install -y vim wget curl
sudo dnf update -y
sudo dnf remove -y package-name

不推荐在同一篇脚本中这样混着写:

1
2
3
yum install -y vim
dnf install -y wget
yum update -y

统一之后有几个好处:

  • 脚本更清晰;
  • 版本迁移更容易;
  • 方便记录 dnf history
  • 更符合 Rocky 9/10 文档和习惯。

4.2 查看系统仓库

1
2
dnf repolist
dnf repolist --all

常见仓库:

  • BaseOS;
  • AppStream;
  • Extras;
  • CRB;
  • EPEL。

4.3 启用 CRB

Rocky 9+:

1
sudo dnf config-manager --set-enabled crb

Rocky 8:

1
sudo dnf config-manager --set-enabled powertools

如果提示 dnf config-manager 不存在,安装插件:

1
sudo dnf install -y dnf-plugins-core

4.4 安装 EPEL

1
2
sudo dnf install -y epel-release
sudo dnf makecache

EPEL 非常常用,但要注意:

  • 生产环境不要随便启用一堆第三方仓库;
  • 尽量使用 Rocky 官方仓库 + EPEL;
  • Remi、ELRepo、RPM Fusion 等按需启用;
  • 启用第三方仓库前要评估包覆盖风险。

4.5 国内镜像源

国内服务器可以考虑配置阿里云、清华、中科大等镜像。

以阿里云为例,思路是:

  1. 备份原仓库文件;
  2. 替换 baseurl;
  3. 清理缓存;
  4. 重建缓存;
  5. 更新系统。

示例:

1
2
3
4
5
6
7
8
9
10
11
cd /etc/yum.repos.d
sudo mkdir -p backup
sudo cp rocky*.repo backup/

sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/rocky*.repo

sudo dnf clean all
sudo dnf makecache

注意:

  • 企业生产环境更推荐内部 DNF/YUM Proxy;
  • 不要随便使用来历不明的镜像源;
  • 切源后要做安装、更新、回滚验证。

4.6 Rocky Vault

Vault 是历史版本归档,不建议作为生产新服务器的常规源。

适合场景:

  • 需要还原历史环境;
  • 需要构建老版本镜像;
  • 离线兼容测试。

不适合场景:

  • 新生产服务器;
  • 直接长期使用旧包;
  • 逃避安全更新。

4.7 DNF 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo dnf makecache
sudo dnf update -y
sudo dnf upgrade -y
sudo dnf autoremove -y
sudo dnf clean all
sudo dnf history
sudo dnf history info <ID>
sudo dnf history undo <ID>
dnf search nginx
dnf info nginx
dnf list installed
dnf provides '*/semanage'
dnf repoquery nginx

4.8 Rocky 10 与 dnf5

Rocky 10 中需要关注 dnf5 带来的变化。最明显的是模块化使用方式变化,旧的 dnf module 不应再作为 Rocky 10 教程主线。

建议:

  • Rocky 9 教程使用 dnf
  • Rocky 10 补充 dnf5 注意事项;
  • 不要在 Rocky 10 上继续围绕 AppStream Module 写老教程;
  • 生产升级前记录 dnf history

4.9 dnf-automatic 自动更新

安装:

1
sudo dnf install -y dnf-automatic

配置:

1
sudo vim /etc/dnf/automatic.conf

推荐思路:

1
2
3
[commands]
upgrade_type = security
apply_updates = no

解释:

  • upgrade_type = security:只关注安全更新;
  • apply_updates = no:不自动安装,只下载或提示;
  • 生产环境不建议无脑自动升级所有包。

启动 timer:

1
2
3
sudo systemctl enable --now dnf-automatic.timer
systemctl status dnf-automatic.timer
systemctl list-timers | grep dnf

企业建议:

  • 测试环境可以自动安装安全更新;
  • 生产环境建议自动下载 + 人工维护窗口安装;
  • 核心数据库、核心网关不要无脑自动重启;
  • 所有更新必须能追踪、能回滚、能说明原因。

第五章 基础工具安装

5.1 基础工具

Minimal 安装后很多工具没有,需要补齐:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo dnf install -y \
vim \
wget \
curl \
tar \
zip \
unzip \
tree \
bash-completion \
bash-completion-extras \
lrzsz \
rsync \
jq \
bc \
expect \
dos2unix

5.2 网络工具

1
2
3
4
5
6
7
8
9
sudo dnf install -y \
net-tools \
bind-utils \
nmap \
nmap-ncat \
telnet \
tcpdump \
traceroute \
mtr

说明:

  • ifconfignetstatroute 来自 net-tools,属于老工具,但排查时仍有价值;
  • 新工具推荐 ipssnmcliresolvectl
  • dighostnslookup 来自 bind-utils
  • nc 在 Rocky 中通常使用 nmap-ncat

5.3 性能排查工具

1
2
3
4
5
6
7
8
9
10
11
sudo dnf install -y \
htop \
iotop \
iftop \
sysstat \
dstat \
ncdu \
lsof \
psmisc \
perf \
strace

常用对应关系:

工具 用途
htop 进程与 CPU 观察
iotop 磁盘 IO 进程定位
iftop 网络带宽连接观察
sysstat sariostatmpstatpidstat
dstat 综合资源监控
ncdu 磁盘空间分析
lsof 文件句柄、端口占用
psmisc pstreekillall
perf CPU 性能分析
strace 系统调用排查

5.4 开发工具

1
sudo dnf groupinstall -y "Development Tools"

常用于编译依赖、安装驱动、构建本地工具。

5.5 一键基础安装命令

1
2
3
4
5
6
7
sudo dnf install -y \
vim wget curl tar zip unzip tree \
bash-completion bash-completion-extras \
lrzsz rsync jq bc expect dos2unix \
net-tools bind-utils nmap nmap-ncat telnet tcpdump traceroute mtr \
htop iotop iftop sysstat dstat ncdu lsof psmisc perf strace \
logrotate lnav

第六章 用户、用户组与 sudo

6.1 不建议长期使用 root

生产服务器不建议长期使用 root 直接登录。

推荐方式:

  1. root 只用于初始化;
  2. 创建普通用户;
  3. 普通用户使用 SSH 密钥登录;
  4. 需要管理时通过 sudo 提权;
  5. sudo 权限按职责最小化分配。

6.2 创建用户

1
2
sudo useradd mario
sudo passwd mario

6.3 加入 wheel 组

1
2
sudo usermod -aG wheel mario
id mario

6.4 sudo 配置

编辑 sudoers 必须使用:

1
sudo visudo

推荐:

1
%wheel ALL=(ALL) ALL

谨慎使用:

1
%wheel ALL=(ALL) NOPASSWD: ALL

如果是自动化部署用户,可以限制命令范围:

1
deploy ALL=(root) NOPASSWD: /bin/systemctl restart demo.service, /bin/systemctl status demo.service

6.5 用户锁定与解锁

1
2
3
4
sudo passwd -l username
sudo passwd -u username
sudo usermod -L username
sudo usermod -U username

6.6 查看登录记录

1
2
3
4
last
lastb
who
w

第七章 SSH 安全加固

7.1 SSH 加固原则

SSH 是服务器入口,必须认真处理。

推荐原则:

  • 禁止 root 远程登录;
  • 使用公钥认证;
  • 禁止密码登录;
  • 限制认证失败次数;
  • 限制登录用户;
  • 限制来源 IP;
  • 配合 fail2ban;
  • 修改配置前保留一个已登录 session。

7.2 生成 SSH Key

客户端执行:

1
ssh-keygen -t ed25519 -C "mario@company"

上传公钥:

1
ssh-copy-id mario@server-ip

或者手动写入:

1
2
3
4
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

7.3 推荐 sshd_config

编辑:

1
sudo vim /etc/ssh/sshd_config

建议配置:

1
2
3
4
5
6
7
8
9
10
11
12
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 5
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers mario deploy

配置检查:

1
sudo sshd -t

重载:

1
sudo systemctl reload sshd

如果系统不支持 reload,再使用:

1
sudo systemctl restart sshd

7.4 修改 SSH 端口

例如改为 2222

1
sudo vim /etc/ssh/sshd_config
1
Port 2222

firewalld 放行:

1
2
sudo firewall-cmd --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

SELinux 放行:

1
2
sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222

查看:

1
sudo semanage port -l | grep ssh

重载 SSH:

1
2
sudo sshd -t
sudo systemctl reload sshd

7.5 防止把自己锁在门外

改 SSH 前必须记住:

  • 保留当前 SSH 会话;
  • 新开一个终端测试新端口;
  • 确认 firewalld 已放行;
  • 确认 SELinux 已放行;
  • 云服务器确认有控制台入口;
  • 不要一边改端口,一边禁密码,一边禁 root,一边重启防火墙。

这叫“连环自杀式加固”,很刺激,但不推荐。

第八章 Fail2ban

8.1 Fail2ban 解决什么问题

Fail2ban 可以根据日志检测暴力破解行为,并自动封禁来源 IP。常见用途:

  • SSH 爆破防护;
  • Nginx 登录爆破防护;
  • Web 管理后台防护;
  • 暴力请求限流辅助。

它不能替代 SSH 密钥认证、不能替代防火墙、不能替代安全策略,但很适合作为额外防线。

8.2 安装

1
sudo dnf install -y fail2ban fail2ban-firewalld

8.3 配置 sshd jail

1
sudo vim /etc/fail2ban/jail.d/sshd.local

示例:

1
2
3
4
5
6
[sshd]
enabled = true
backend = systemd
bantime = 1h
findtime = 10m
maxretry = 5

启动:

1
2
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

查看:

1
2
sudo fail2ban-client status
sudo fail2ban-client status sshd

解封:

1
sudo fail2ban-client set sshd unbanip 1.2.3.4

8.4 企业建议

  • SSH 最好限制来源网段;
  • Fail2ban 作为辅助,不是主防线;
  • 不要把办公公网 IP 封了还没人知道;
  • 重要服务器建议接入集中日志和告警。

第九章 SELinux 企业级实践

9.1 为什么不能直接关闭 SELinux

很多老教程会写:

1
2
setenforce 0
sed -i '/^SELINUX=.*/c SELINUX=disabled' /etc/selinux/config

这在企业生产环境里不应该作为默认方案。

SELinux 是强制访问控制,不是“报错制造机”。它限制的是进程、文件、端口、上下文之间的访问关系。服务被攻陷之后,SELinux 可以降低横向破坏范围。

简单说:

防火墙管“谁能进来”,SELinux 管“进来之后能干什么”。

关闭 SELinux 的短期收益是少几个报错,长期代价是安全边界变薄。生产环境不建议为了省事永久关闭。

9.2 SELinux 三种模式

模式 说明 建议
Enforcing 按策略拦截违规访问 生产推荐
Permissive 不拦截,但记录日志 调试使用
Disabled 完全关闭,不记录 不推荐

查看:

1
2
getenforce
sestatus

临时切换:

1
2
sudo setenforce 0
sudo setenforce 1

永久配置:

1
sudo vim /etc/selinux/config

推荐:

1
2
SELINUX=enforcing
SELINUXTYPE=targeted

9.3 安装 SELinux 管理工具

1
sudo dnf install -y policycoreutils-python-utils setools-console

查找命令来源:

1
dnf provides '*/semanage'

9.4 文件上下文

查看:

1
ls -Z /var/www/html

临时修改上下文:

1
sudo chcon -R -t httpd_sys_content_t /data/websites

恢复默认上下文:

1
sudo restorecon -Rv /var/www/html

更推荐持久化规则:

1
2
sudo semanage fcontext -a -t httpd_sys_content_t "/data/websites(/.*)?"
sudo restorecon -Rv /data/websites

9.5 端口上下文

查看 http 端口:

1
sudo semanage port -l | grep http_port_t

允许 Nginx/Apache 使用 8080:

1
sudo semanage port -a -t http_port_t -p tcp 8080

修改已有端口:

1
sudo semanage port -m -t http_port_t -p tcp 8080

删除:

1
sudo semanage port -d -t http_port_t -p tcp 8080

9.6 Boolean 开关

查看:

1
2
getsebool -a | grep httpd
semanage boolean -l | grep httpd

例如允许 httpd 访问网络:

1
sudo setsebool -P httpd_can_network_connect on

注意:

  • 不加 -P 只对当前运行态生效;
  • -P 才能持久化。

9.7 SELinux 排错流程

查看拒绝日志:

1
sudo ausearch -m AVC -ts recent

分析原因:

1
sudo ausearch -m AVC -ts recent | audit2why

生成策略模块:

1
2
sudo ausearch -m AVC -ts recent | audit2allow -M mylocal
sudo semodule -i mylocal.pp

但不要看到 audit2allow 就无脑执行。企业里要先判断:

  • 是路径上下文错了?
  • 是端口类型错了?
  • 是 boolean 没开?
  • 是应用真的越权了?
  • 是不是应该改应用配置,而不是放宽 SELinux?

9.8 容器与 SELinux

Podman/Docker 挂载宿主机目录时,需要注意 SELinux label。

私有目录:

1
podman run -v /data/app:/app:Z image

共享目录:

1
podman run -v /data/shared:/shared:z image

区别:

参数 含义
:Z 给单个容器独占使用
:z 多个容器共享使用

9.9 企业建议

  • 生产环境保持 Enforcing;
  • 调试可以临时 Permissive;
  • 不要永久 Disabled;
  • 应用目录迁移后执行 restorecon
  • 自定义端口使用 semanage port
  • 容器挂载目录注意 :Z / :z
  • SELinux 问题先看 audit 日志,不要第一反应关掉。

第十章 Firewalld 企业级实践

10.1 为什么不能直接关闭 firewalld

老教程常见写法:

1
2
systemctl stop firewalld
systemctl disable firewalld

这不应该作为企业服务器默认配置。

firewalld 是服务器的第一道网络边界。企业环境应当保留 firewalld,只开放必要端口。

简单说:

关闭 firewalld 不是初始化,是裸奔。服务器不是海边度假,没必要穿这么少。

10.2 firewalld 核心概念

概念 说明
zone 区域,不同网络信任级别
service 服务规则,如 ssh/http/https
port 端口规则,如 8080/tcp
source 来源地址
rich rule 富规则,支持更复杂条件
masquerade 地址伪装,常用于 NAT
runtime 运行时配置,重载后可能丢失
permanent 永久配置,reload 后生效

10.3 查看状态

1
2
3
4
5
6
7
sudo systemctl status firewalld
sudo firewall-cmd --state
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
sudo firewall-cmd --list-services
sudo firewall-cmd --list-ports

10.4 开放服务

1
2
3
4
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

10.5 开放端口

1
2
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

删除端口:

1
2
sudo firewall-cmd --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload

10.6 限制来源 IP

只允许内网访问 PostgreSQL:

1
2
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="5432" accept' --permanent
sudo firewall-cmd --reload

只允许运维网段访问 SSH:

1
2
3
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.9.0/24" service name="ssh" accept' --permanent
sudo firewall-cmd --remove-service=ssh --permanent
sudo firewall-cmd --reload

修改远程防火墙规则时一定要谨慎,避免把自己踢出去。

10.7 企业端口开放策略

服务 端口 暴露范围 建议
SSH 22 / 自定义 运维网段 不建议公网无限制暴露
HTTP 80 公网/内网 Web 服务需要
HTTPS 443 公网/内网 Web 服务推荐
PostgreSQL 5432 应用网段 禁止公网
MySQL 3306 应用网段 禁止公网
Redis 6379 应用网段 强烈禁止公网
Kafka 9092 应用网段 按集群规划
Cockpit 9090 运维网段 不建议公网
Node Exporter 9100 监控网段 不建议公网
Prometheus 9090 监控网段 不建议公网

10.8 firewalld 与 nftables

Rocky 9/10 应以 firewalld / nftables 为主线,不建议新教程继续围绕 iptables 展开。

理解方式:

  • firewalld 是管理层;
  • nftables 是底层框架;
  • iptables 是老习惯,正在退出主线。

第十一章 Chrony 时间同步

11.1 为什么时间同步重要

时间不准会带来很多诡异问题:

  • 日志时间对不上;
  • 分布式链路追踪错乱;
  • TLS 证书校验失败;
  • Kerberos 认证异常;
  • 数据库复制异常;
  • Kafka / MQ 消费排查困难;
  • 定时任务错位;
  • 审计日志失去可信度。

11.2 查看时间状态

1
2
3
4
timedatectl
chronyc tracking
chronyc sources -v
chronyc sourcestats -v

11.3 设置时区

国内服务器通常设置:

1
sudo timedatectl set-timezone Asia/Shanghai

查看:

1
timedatectl

11.4 配置 NTP 源

编辑:

1
sudo vim /etc/chrony.conf

示例:

1
2
3
pool ntp.aliyun.com iburst
pool ntp1.aliyun.com iburst
pool cn.pool.ntp.org iburst

重启:

1
2
sudo systemctl restart chronyd
sudo systemctl enable chronyd

强制同步:

1
sudo chronyc makestep

11.5 企业内网 NTP

企业环境建议:

  • 内网部署 NTP Server;
  • 普通服务器只同步内网 NTP;
  • 防火墙开放 UDP 123;
  • 关键系统避免依赖公网 NTP。

服务端示例:

1
2
3
pool ntp.aliyun.com iburst
allow 192.168.0.0/16
local stratum 10

放行:

1
2
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload

第十二章 网络配置:NetworkManager / nmcli

12.1 不再推荐 network-scripts

Rocky 9/10 不应继续把 /etc/sysconfig/network-scripts/ifcfg-* 作为主线教程。

推荐方式:

  • NetworkManager;
  • nmcli
  • nmtui
  • keyfile:/etc/NetworkManager/system-connections/

不要再写:

1
2
vim /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network

12.2 查看网络状态

1
2
3
4
5
nmcli device status
nmcli connection show
ip addr
ip route
resolvectl status

12.3 配置静态 IP

假设网卡连接名为 ens160

1
2
3
4
5
6
sudo nmcli con mod ens160 ipv4.method manual
sudo nmcli con mod ens160 ipv4.addresses 192.168.1.10/24
sudo nmcli con mod ens160 ipv4.gateway 192.168.1.1
sudo nmcli con mod ens160 ipv4.dns "223.5.5.5 8.8.8.8"
sudo nmcli con mod ens160 connection.autoconnect yes
sudo nmcli con up ens160

查看:

1
2
3
ip addr show ens160
ip route
cat /etc/resolv.conf

12.4 配置主机名

1
2
sudo hostnamectl set-hostname rocky-app-01
hostnamectl

建议命名规范:

1
<环境>-<业务>-<角色>-<编号>

例如:

1
2
3
prod-order-app-01
prod-order-db-01
prod-monitor-prometheus-01

12.5 DNS 配置

通过 nmcli 配置:

1
2
sudo nmcli con mod ens160 ipv4.dns "192.168.199.3 192.168.199.5 223.5.5.5"
sudo nmcli con up ens160

不要长期手工修改 /etc/resolv.conf,因为它可能被 NetworkManager 覆盖。

12.6 静态路由

添加静态路由:

1
2
sudo nmcli con mod ens160 +ipv4.routes "10.10.0.0/16 192.168.1.254"
sudo nmcli con up ens160

查看:

1
ip route

12.7 Bond 配置

Bond 常用于双网卡冗余或带宽聚合。

active-backup 示例:

1
2
3
4
5
6
sudo nmcli con add type bond ifname bond0 mode active-backup con-name bond0
sudo nmcli con add type ethernet ifname ens160 master bond0 con-name bond0-slave-ens160
sudo nmcli con add type ethernet ifname ens192 master bond0 con-name bond0-slave-ens192

sudo nmcli con mod bond0 ipv4.method manual ipv4.addresses 192.168.1.20/24 ipv4.gateway 192.168.1.1 ipv4.dns "223.5.5.5"
sudo nmcli con up bond0

常见模式:

模式 说明
active-backup 主备,高可用,最常见
balance-rr 轮询,需要交换机配合
802.3ad LACP,需要交换机支持

12.8 VLAN 配置

例如在 bond0 上创建 VLAN 100:

1
2
3
sudo nmcli con add type vlan con-name bond0.100 ifname bond0.100 dev bond0 id 100
sudo nmcli con mod bond0.100 ipv4.method manual ipv4.addresses 192.168.100.10/24
sudo nmcli con up bond0.100

VLAN 常用于:

  • 管理网;
  • 业务网;
  • 存储网;
  • 监控网;
  • 容器网络隔离。

12.9 Bridge 配置

Bridge 常用于虚拟化、KVM、容器网络。

1
2
3
4
sudo nmcli con add type bridge ifname br0 con-name br0
sudo nmcli con add type ethernet ifname ens160 master br0 con-name br0-slave-ens160
sudo nmcli con mod br0 ipv4.method manual ipv4.addresses 192.168.1.30/24 ipv4.gateway 192.168.1.1 ipv4.dns "223.5.5.5"
sudo nmcli con up br0

12.10 企业网络规划示例

网络 网段 用途
Management 192.168.9.0/24 SSH / Cockpit / 监控
Business 192.168.8.0/24 应用访问
Storage 192.168.7.0/24 NFS / MinIO / 备份
Container 10.88.0.0/16 Podman / 容器

第十三章 存储管理与 LVM

13.1 查看磁盘

1
2
3
4
5
6
7
8
lsblk
lsblk -f
blkid
df -h
du -sh *
pvs
vgs
lvs

13.2 parted 创建 GPT 分区

1
sudo parted /dev/sdb

进入 parted 后:

1
2
3
4
mklabel gpt
mkpart primary 0% 100%
set 1 lvm on
quit

查看:

1
lsblk

13.3 创建 LVM

1
2
3
sudo pvcreate /dev/sdb1
sudo vgcreate data_vg /dev/sdb1
sudo lvcreate -l 100%FREE -n data_lv data_vg

查看:

1
2
3
pvdisplay
vgdisplay
lvdisplay

13.4 文件系统选择

文件系统 场景
XFS Rocky/RHEL 默认,适合大文件、大分区
ext4 通用、简单、兼容性强

XFS 格式化:

1
sudo mkfs.xfs /dev/data_vg/data_lv

ext4 格式化:

1
sudo mkfs.ext4 /dev/data_vg/data_lv

13.5 挂载目录

1
2
sudo mkdir -p /data
sudo mount /dev/data_vg/data_lv /data

查看:

1
2
df -h
lsblk -f

13.6 fstab 配置

获取 UUID:

1
sudo blkid

编辑:

1
sudo vim /etc/fstab

示例:

1
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults 0 0

验证:

1
2
3
4
sudo umount /data
sudo systemctl daemon-reload
sudo mount -a
df -h

注意:

  • /etc/fstab 写错可能导致系统启动异常;
  • 生产环境修改前先备份;
  • 建议使用 UUID,不要直接使用 /dev/sdb1

13.7 LVM 在线扩容

假设磁盘变大后,先扩展分区,再执行:

1
2
sudo pvresize /dev/sdb1
sudo lvextend -r -l +100%FREE /dev/data_vg/data_lv

-r 会尝试自动扩展文件系统。

13.8 XFS 手动扩容

1
2
sudo lvextend -l +100%FREE /dev/data_vg/data_lv
sudo xfs_growfs /data

13.9 ext4 手动扩容

1
2
sudo lvextend -l +100%FREE /dev/data_vg/data_lv
sudo resize2fs /dev/data_vg/data_lv

13.10 企业建议

  • 生产扩容前必须有快照或备份;
  • 数据库目录、日志目录、备份目录建议独立规划;
  • 不要让 / 被应用日志打满;
  • 容器宿主机重点关注容器镜像和 overlay 存储;
  • 扩容后要验证 df -h、应用写入、监控告警。

第十四章 systemd 常用管理

14.1 systemd 是什么

systemd 是现代 Linux 的系统与服务管理框架,负责:

  • 服务启动;
  • 服务停止;
  • 开机自启;
  • 日志集成;
  • 依赖管理;
  • 定时任务;
  • 资源限制;
  • 服务安全隔离。

14.2 systemctl 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
systemctl status sshd
systemctl start sshd
systemctl stop sshd
systemctl restart sshd
systemctl reload sshd
systemctl enable sshd
systemctl disable sshd
systemctl is-enabled sshd
systemctl is-active sshd
systemctl list-units --type=service
systemctl list-unit-files
systemctl --failed

14.3 创建 Java 应用 systemd unit

创建应用用户:

1
2
3
sudo useradd -r -s /sbin/nologin app
sudo mkdir -p /app/demo /logs/demo
sudo chown -R app:app /app/demo /logs/demo

创建 unit:

1
sudo vim /etc/systemd/system/demo.service

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Demo Java Application
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=app
Group=app
WorkingDirectory=/app/demo
EnvironmentFile=-/app/demo/demo.env
ExecStart=/usr/bin/java -jar /app/demo/demo.jar
Restart=always
RestartSec=10
SuccessExitStatus=143
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

生效:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now demo.service
sudo systemctl status demo.service

14.4 systemd override

不要直接改系统包自带 unit,推荐 override:

1
sudo systemctl edit nginx.service

示例:

1
2
[Service]
LimitNOFILE=65535

查看合并后配置:

1
systemctl cat nginx.service

14.5 systemd timer

timer 可以替代部分 cron 场景。

查看 timer:

1
systemctl list-timers

适合:

  • 定期清理;
  • 定期备份;
  • 定期巡检;
  • 定期执行脚本。

14.6 systemd 安全加固

服务 unit 可以增加:

1
2
3
4
5
6
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/app/demo /logs/demo
CapabilityBoundingSet=

解释:

参数 作用
NoNewPrivileges 禁止进程获得新权限
PrivateTmp 独立临时目录
ProtectSystem 限制系统目录写入
ProtectHome 限制访问 home
ReadWritePaths 指定可写路径
CapabilityBoundingSet 限制 Linux capabilities

不要一上来全部开启,应该按服务逐步验证。

第十五章 日志管理:journald / rsyslog / logrotate

15.1 Linux 日志体系

Rocky Linux 中常见日志组件:

  • journald:systemd 日志;
  • rsyslog:传统系统日志;
  • logrotate:日志切割;
  • auditd:安全审计日志;
  • 应用自身日志:如 Java Logback / Log4j2。

15.2 journalctl 常用命令

1
2
3
4
5
6
7
8
9
10
journalctl -xe
journalctl -u sshd
journalctl -u firewalld
journalctl -u demo.service
journalctl -f
journalctl --since "1 hour ago"
journalctl --since "2026-06-30 10:00:00"
journalctl -p err
journalctl -b
journalctl -k

15.3 journald 持久化

默认情况下,一些系统可能只保留运行时日志。建议启用持久化:

1
2
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald

15.4 journald 空间限制

编辑:

1
sudo vim /etc/systemd/journald.conf

示例:

1
2
3
4
5
6
[Journal]
Storage=persistent
SystemMaxUse=1G
RuntimeMaxUse=500M
MaxRetentionSec=30day
Compress=yes

重启:

1
sudo systemctl restart systemd-journald

查看占用:

1
journalctl --disk-usage

清理:

1
2
sudo journalctl --vacuum-time=30d
sudo journalctl --vacuum-size=1G

15.5 rsyslog 常见日志

文件 说明
/var/log/messages 系统综合日志
/var/log/secure 安全认证日志
/var/log/cron 定时任务日志
/var/log/maillog 邮件日志
/var/log/audit/audit.log auditd 审计日志

15.6 logrotate

查看配置:

1
2
cat /etc/logrotate.conf
ls /etc/logrotate.d/

应用日志示例:

1
2
3
4
5
6
7
8
/logs/demo/*.log {
daily
rotate 30
compress
missingok
notifempty
copytruncate
}

Java 应用建议:

  • 应用内部按大小和日期切割;
  • logrotate 兜底;
  • 日志不要无限写入 /
  • 重要日志接入集中采集。

第十六章 系统监控与性能排查工具

16.1 CPU 排查

1
2
3
4
5
top
htop
mpstat 1
pidstat -u 1
perf top

关注:

  • user CPU;
  • system CPU;
  • iowait;
  • steal;
  • load average;
  • 单核打满;
  • 线程数异常。

16.2 内存排查

1
2
3
4
free -h
vmstat 1
cat /proc/meminfo
pidstat -r 1

关注:

  • available;
  • swap 使用;
  • cache/buffer;
  • OOM 日志。

查看 OOM:

1
journalctl -k | grep -i oom

16.3 磁盘排查

1
2
3
4
5
df -h
du -sh *
ncdu /
iostat -x 1
iotop

关注:

  • 磁盘使用率;
  • inode;
  • await;
  • util;
  • 大文件;
  • 日志暴涨。

查看 inode:

1
df -i

16.4 网络排查

1
2
3
4
5
6
7
ss -tunlp
ss -s
ip addr
ip route
iftop
tcpdump -i ens160 port 443
mtr 8.8.8.8

常用场景:

1
2
3
4
5
6
7
8
# 查看监听端口
ss -tunlp

# 查看某端口连接
ss -antp | grep 8080

# 抓包
sudo tcpdump -i ens160 host 192.168.1.10

16.5 进程排查

1
2
3
4
5
ps aux
pstree -p
pgrep -af java
lsof -p <PID>
strace -p <PID>

16.6 Java 服务专项排查

1
2
3
4
5
6
7
jps -l
jcmd <PID> VM.version
jcmd <PID> VM.flags
jcmd <PID> Thread.print
jcmd <PID> GC.heap_info
jstat -gcutil <PID> 1000
jstack <PID>

常见问题:

现象 排查方向
CPU 飙高 top 找线程、jstack 定位
内存上涨 heap dump、GC 日志
Full GC GC 日志、对象分配
连接数过高 ss、lsof、连接池
文件句柄耗尽 lsof、limits、systemd LimitNOFILE
日志打满磁盘 logrotate、应用日志策略

第十七章 sysctl 内核参数优化

17.1 配置文件位置

不要直接把所有参数塞进 /etc/sysctl.conf,更推荐:

1
sudo vim /etc/sysctl.d/99-custom.conf

17.2 常见网络参数

示例:

1
2
3
4
5
6
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 5000

生效:

1
sudo sysctl --system

17.3 容器/Kubernetes 常用参数

1
2
3
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

加载模块:

1
2
sudo modprobe br_netfilter
sudo modprobe overlay

持久化模块:

1
2
3
4
cat <<EOF | sudo tee /etc/modules-load.d/container.conf
overlay
br_netfilter
EOF

17.4 文件句柄相关

1
fs.file-max = 1000000

查看:

1
2
sysctl fs.file-max
cat /proc/sys/fs/file-nr

17.5 不要无脑复制“万能优化参数”

sysctl 调优一定要按场景来。

场景 优化重点
Web 网关 连接队列、端口范围、TIME_WAIT
数据库 内存、IO、文件句柄
容器宿主机 bridge、ip_forward、conntrack
高吞吐网络 buffer、队列、网卡参数
低延迟服务 调度、CPU、网络延迟

调优流程:

  1. 记录当前值;
  2. 明确瓶颈;
  3. 修改少量参数;
  4. 压测验证;
  5. 监控观察;
  6. 文档记录。

第十八章 limits.conf 与资源限制

18.1 为什么要配置 limits

高并发服务经常遇到:

  • 文件句柄不足;
  • 进程数不足;
  • 线程数不足;
  • Nginx 连接数不够;
  • Java 服务打开文件太多;
  • 数据库连接异常。

18.2 limits.conf 配置

推荐新建文件:

1
sudo vim /etc/security/limits.d/99-custom.conf

示例:

1
2
3
4
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

指定用户:

1
2
3
4
app soft nofile 65535
app hard nofile 65535
app soft nproc 65535
app hard nproc 65535

18.3 查看当前限制

1
2
ulimit -a
ulimit -n

查看进程限制:

1
cat /proc/<PID>/limits

18.4 systemd 服务限制

注意:systemd 托管的服务不一定完全受 limits.conf 影响。应在 unit 中配置:

1
2
3
[Service]
LimitNOFILE=65535
LimitNPROC=65535

生效:

1
2
3
sudo systemctl daemon-reload
sudo systemctl restart demo.service
cat /proc/$(pidof java)/limits

第十九章 TuneD 性能配置

19.1 TuneD 是什么

TuneD 是系统性能 profile 管理工具,可以根据场景切换系统调优策略。

常见 profile:

Profile 场景
balanced 通用平衡
throughput-performance 高吞吐服务器
latency-performance 低延迟服务
virtual-guest 虚拟机 Guest
virtual-host 虚拟化宿主机
powersave 节能

19.2 安装与启动

1
2
sudo dnf install -y tuned
sudo systemctl enable --now tuned

查看:

1
2
3
tuned-adm list
tuned-adm active
tuned-adm recommend

切换:

1
sudo tuned-adm profile throughput-performance

19.3 企业建议

服务器类型 推荐 profile
普通应用服务器 balanced
高吞吐 API 网关 throughput-performance
低延迟交易/网关 latency-performance
虚拟机 virtual-guest
KVM 宿主机 virtual-host

不要为了“性能”无脑切 latency-performance。调优不是玄学开光,得看指标。

第二十章 auditd 审计

20.1 auditd 解决什么问题

auditd 用于记录安全相关事件,例如:

  • 用户登录;
  • sudo 使用;
  • SSH 配置修改;
  • /etc/passwd 修改;
  • /etc/shadow 修改;
  • 审计规则变更;
  • SELinux AVC 拒绝;
  • 关键文件访问。

它不是直接防护工具,但它能告诉你“谁在什么时候干了什么”。

20.2 安装与启动

1
2
sudo dnf install -y audit audit-libs
sudo systemctl enable --now auditd

查看:

1
2
sudo auditctl -s
sudo systemctl status auditd

20.3 常用命令

1
2
3
4
5
6
sudo ausearch -m USER_LOGIN
sudo ausearch -m AVC
sudo ausearch -k identity
sudo aureport
sudo aureport -au
sudo aureport -l

20.4 持久化审计规则

编辑:

1
sudo vim /etc/audit/rules.d/hardening.rules

示例:

1
2
3
4
5
6
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/audit/ -p wa -k auditconfig

加载:

1
2
sudo augenrules --load
sudo auditctl -l

20.5 企业建议

  • 审计账号变更;
  • 审计 sudoers 变更;
  • 审计 SSH 配置变更;
  • 审计安全配置目录;
  • 审计日志接入集中日志平台;
  • 不要让 audit 日志打满根分区。

第二十一章 安全加固总章

21.1 基础安全原则

企业服务器安全基线可以概括为:

  • 最小化安装;
  • 最小化开放端口;
  • 最小化用户权限;
  • 最小化服务自启动;
  • 保留 SELinux;
  • 保留 firewalld;
  • 开启 auditd;
  • 配置 fail2ban;
  • 配置日志持久化;
  • 配置安全更新策略;
  • 定期巡检;
  • 有备份和回滚。

21.2 密码策略

查看 authselect:

1
authselect current

密码复杂度通常通过 PAM 相关模块配置。企业环境建议结合:

  • 密码长度;
  • 复杂度;
  • 历史密码;
  • 登录失败锁定;
  • 账号过期;
  • MFA / 堡垒机。

21.3 umask

查看:

1
umask

常见建议:

1
umask 027

但不要无脑改全局,避免影响应用写文件权限。

21.4 Shell history 安全

可以增加时间戳:

1
2
3
4
5
cat <<'EOF' | sudo tee /etc/profile.d/history.sh
export HISTTIMEFORMAT="%F %T "
export HISTSIZE=10000
export HISTFILESIZE=20000
EOF

注意:history 不是审计系统,用户可以清理;真正审计要靠 auditd、堡垒机、集中日志。

21.5 检查开放端口

1
2
ss -tunlp
sudo firewall-cmd --list-all

21.6 检查自启动服务

1
systemctl list-unit-files --state=enabled

21.7 检查 SUID 文件

1
sudo find / -perm -4000 -type f 2>/dev/null

21.8 OpenSCAP / Lynis / CIS Benchmark

建议企业环境引入:

  • OpenSCAP;
  • Lynis;
  • CIS Benchmark;
  • 内部安全基线扫描;
  • 云安全中心 / 主机安全 Agent。

不要把 Checklist 当摆设。Checklist 的价值不是写出来,而是每台服务器交付时真的打勾。

第二十二章 Cockpit Web Console

22.1 Cockpit 是什么

Cockpit 是 Linux Web 管理控制台,可以通过浏览器管理:

  • 系统状态;
  • 服务;
  • 日志;
  • 存储;
  • 网络;
  • 防火墙;
  • 软件更新;
  • 虚拟机;
  • 容器部分能力。

22.2 安装与启动

1
2
sudo dnf install -y cockpit
sudo systemctl enable --now cockpit.socket

查看:

1
systemctl status cockpit.socket

22.3 防火墙放行

1
2
sudo firewall-cmd --add-service=cockpit --permanent
sudo firewall-cmd --reload

访问:

1
https://<server-ip>:9090

22.4 企业建议

  • Cockpit 不建议暴露公网;
  • 只允许运维网段访问;
  • 配合 HTTPS;
  • 配合堡垒机或 VPN;
  • 配合 auditd;
  • 不要把 Cockpit 当成替代自动化运维的平台。

限制来源示例:

1
2
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.9.0/24" service name="cockpit" accept' --permanent
sudo firewall-cmd --reload

第二十三章 容器环境:Podman / Docker / Buildah

23.1 为什么 Rocky Linux 要关注 Podman

在 RHEL/Rocky 生态里,Podman 是非常重要的容器工具。它的特点:

  • 无中心 daemon;
  • Rootless 支持好;
  • 与 SELinux 配合自然;
  • 与 systemd 集成好;
  • 支持 Quadlet;
  • 搭配 Buildah、Skopeo 构成完整容器工具链。

23.2 Podman 与 Docker 对比

项目 Podman Docker
Daemon 无中心 daemon Docker daemon
Rootless 原生支持较好 支持但复杂一些
systemd 集成 Quadlet 很自然 需要额外 unit 或 Compose
Compose 生态 相对弱一些 更成熟
RHEL/Rocky 原生生态 更推荐 常见但非默认主线
团队接受度 需要学习 更普及

我的建议:

  • 新 Rocky 原生环境:优先学 Podman;
  • 团队已有 Docker / Compose / CI/CD:可以继续 Docker;
  • 企业内网服务器:Podman rootless 很值得考虑;
  • K8s 节点:按集群运行时规划,不要单独乱装 Docker。

23.3 安装 Podman / Buildah / Skopeo

1
sudo dnf install -y podman buildah skopeo

常用命令:

1
2
3
4
5
6
7
8
9
podman version
podman info
podman images
podman ps
podman run
podman logs
podman exec
podman stop
podman rm

23.4 Rootless Podman

普通用户运行容器:

1
podman run --rm hello-world

检查 subuid/subgid:

1
2
cat /etc/subuid
cat /etc/subgid

开启用户 linger:

1
sudo loginctl enable-linger mario

23.5 Quadlet

Quadlet 允许用 systemd 风格管理 Podman 容器。

用户级目录:

1
mkdir -p ~/.config/containers/systemd

示例:

1
2
3
4
5
6
7
8
9
10
11
# ~/.config/containers/systemd/demo.container
[Container]
Image=docker.io/library/nginx:latest
ContainerName=demo-nginx
PublishPort=8080:80

[Service]
Restart=always

[Install]
WantedBy=default.target

启用:

1
2
systemctl --user daemon-reload
systemctl --user enable --now demo.service

23.6 SELinux 与容器挂载

1
2
3
4
5
podman run -d \
--name nginx \
-p 8080:80 \
-v /data/nginx/html:/usr/share/nginx/html:Z \
nginx

23.7 Docker 安装是否需要

如果团队已有 Docker 标准,可以安装 Docker。但在 Rocky 文章里,不建议只讲 Docker。

Docker 更适合:

  • 团队已标准化 Docker Compose;
  • CI/CD 强依赖 Docker;
  • 开发环境统一 Docker Desktop;
  • 生态插件依赖 Docker。

Podman 更适合:

  • Rocky/RHEL 原生服务器;
  • Rootless 容器;
  • systemd 托管容器;
  • SELinux 友好环境。

第二十四章 Java 后端服务器推荐配置

24.1 JDK 安装选择

常见选择:

  • OpenJDK;
  • Eclipse Temurin;
  • Oracle JDK;
  • GraalVM。

Rocky 官方仓库可能提供 OpenJDK:

1
2
sudo dnf search openjdk
sudo dnf install -y java-21-openjdk java-21-openjdk-devel

查看:

1
2
java -version
javac -version

24.2 应用目录规划

推荐:

1
2
3
4
5
6
7
/app
/app/demo
/app/demo/releases
/app/demo/current
/app/demo/config
/logs/demo
/data/demo

示例:

1
2
3
sudo mkdir -p /app/demo/releases /app/demo/config /logs/demo /data/demo
sudo useradd -r -s /sbin/nologin app
sudo chown -R app:app /app/demo /logs/demo /data/demo

24.3 Java systemd unit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=Demo Spring Boot Service
After=network-online.target
Wants=network-online.target

[Service]
User=app
Group=app
WorkingDirectory=/app/demo/current
Environment="JAVA_OPTS=-Xms1g -Xmx1g -XX:+UseG1GC"
Environment="SPRING_PROFILES_ACTIVE=prod"
ExecStart=/usr/bin/java $JAVA_OPTS -jar /app/demo/current/app.jar
Restart=always
RestartSec=10
SuccessExitStatus=143
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

24.4 Java 日志建议

  • 应用日志写 /logs/<app>
  • GC 日志单独目录;
  • 日志按天和大小切割;
  • 保留周期明确;
  • 接入 ELK / Loki / OpenSearch;
  • 日志中必须有 traceId。

24.5 Java 排查命令

1
2
3
4
5
jps -l
jcmd <PID> VM.flags
jcmd <PID> Thread.print
jcmd <PID> GC.heap_info
jstat -gcutil <PID> 1000

文件句柄:

1
2
lsof -p <PID> | wc -l
cat /proc/<PID>/limits

端口:

1
ss -tunlp | grep java

第二十五章 Kubernetes / 容器宿主机预留配置

25.1 内核模块

1
2
3
4
5
6
7
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

25.2 sysctl

1
2
3
4
5
6
7
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

25.3 swap

Kubernetes 节点通常需要按版本和 kubelet 配置处理 swap。很多环境会关闭 swap:

1
sudo swapoff -a

编辑 /etc/fstab 注释 swap 项。

注意:

  • 不同 Kubernetes 版本对 swap 支持不同;
  • 生产环境按集群规范执行;
  • 不要只复制旧教程。

25.4 firewalld 与 Kubernetes

不建议一句话“关闭 firewalld”。

应该:

  • 根据 CNI 插件确定规则;
  • 明确控制平面端口;
  • 明确节点端口;
  • 明确监控端口;
  • 明确 Pod/Service CIDR;
  • 写入交付文档。

第二十六章 常用运维命令速查

26.1 系统信息

1
2
3
4
5
6
cat /etc/os-release
cat /etc/redhat-release
uname -r
hostnamectl
timedatectl
uptime

26.2 包管理

1
2
3
4
5
6
dnf search <name>
dnf info <name>
dnf install -y <name>
dnf remove -y <name>
dnf update -y
dnf history

26.3 网络

1
2
3
4
5
6
ip addr
ip route
ss -tunlp
nmcli device status
nmcli connection show
resolvectl status

26.4 服务

1
2
3
4
5
systemctl status <service>
systemctl restart <service>
systemctl enable --now <service>
systemctl list-units --type=service
systemctl --failed

26.5 日志

1
2
3
4
5
journalctl -xe
journalctl -u <service>
journalctl -f
tail -f /var/log/messages
tail -f /var/log/secure

26.6 磁盘

1
2
3
4
5
6
7
8
lsblk
lsblk -f
df -h
df -i
du -sh *
pvs
vgs
lvs

26.7 安全

1
2
3
4
5
6
7
getenforce
sestatus
firewall-cmd --list-all
last
lastb
auditctl -s
aureport

第二十七章 CentOS 7 迁移避坑清单

27.1 不要照搬的旧配置

不要把这些作为 Rocky 9/10 新服务器主线:

1
2
3
4
5
6
7
yum install -y xxx
vim /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network
service xxx restart
iptables -L
setenforce 0
systemctl disable firewalld

27.2 应替换为

旧方式 新方式
yum dnf
network-scripts NetworkManager / nmcli
restart network nmcli con reload/up
iptables firewalld / nftables
ntp chrony
service systemctl
关闭 SELinux 配置 SELinux
关闭 firewalld 配置 firewalld
cron-only systemd timer 可选

27.3 迁移流程建议

  1. 资产盘点;
  2. 配置盘点;
  3. 应用依赖盘点;
  4. 数据备份;
  5. 新系统安装;
  6. 基础初始化;
  7. 安全加固;
  8. 应用部署;
  9. 数据迁移;
  10. 联调测试;
  11. 灰度切流;
  12. 观察与回滚准备;
  13. 下线旧服务器。

第二十八章 企业初始化 Checklist

28.1 基础初始化

  • 确认系统版本;
  • 配置主机名;
  • 配置时区;
  • 配置 chrony;
  • 配置 DNF 源;
  • 启用 CRB;
  • 安装 EPEL;
  • 安装基础工具;
  • 创建普通用户;
  • 配置 sudo。

28.2 网络初始化

  • 配置静态 IP;
  • 配置 DNS;
  • 配置默认路由;
  • 配置静态路由;
  • 检查 NetworkManager;
  • 检查 firewalld zone;
  • 如有需要配置 Bond;
  • 如有需要配置 VLAN;
  • 如有需要配置 Bridge。

28.3 安全初始化

  • 禁止 root SSH;
  • 配置密钥登录;
  • 禁止空密码;
  • 配置 SSH 登录限制;
  • 开启 SELinux Enforcing;
  • 开启 firewalld;
  • 配置 fail2ban;
  • 配置 auditd;
  • 配置密码策略;
  • 配置 sudo 权限;
  • 检查开放端口;
  • 检查自启动服务。

28.4 运维初始化

  • journald 持久化;
  • 配置 logrotate;
  • 配置 dnf-automatic 策略;
  • 配置 tuned;
  • 配置 sysctl;
  • 配置 limits;
  • 配置监控 agent;
  • 配置备份策略;
  • 记录交付文档。

第二十九章 企业服务器交付 Checklist

29.1 基础交付信息

  • 主机名;
  • IP 地址;
  • 系统版本;
  • 内核版本;
  • CPU / 内存 / 磁盘;
  • 挂载点;
  • 业务用途;
  • 负责人;
  • 监控状态;
  • 备份状态。

29.2 安全交付信息

  • SSH 仅允许指定用户;
  • SSH 仅允许指定来源;
  • SELinux 状态;
  • firewalld 规则;
  • fail2ban 状态;
  • auditd 状态;
  • sudoers 记录;
  • 开放端口清单;
  • 自启动服务清单。

29.3 应用交付信息

  • 应用目录;
  • 日志目录;
  • systemd unit;
  • 环境变量;
  • 启停命令;
  • 回滚方式;
  • 健康检查;
  • 监控指标。

第三十章 企业安全 Checklist

30.1 账号安全

  • root 不能远程登录;
  • 密码复杂度开启;
  • 失败登录锁定;
  • sudo 最小权限;
  • 离职账号清理;
  • 自动化账号权限受控。

30.2 网络安全

  • firewalld 开启;
  • 最小端口开放;
  • 数据库不暴露公网;
  • Redis 不暴露公网;
  • Cockpit 不暴露公网;
  • 运维入口限制来源;
  • 公网入口有 WAF / LB / 安全组。

30.3 系统安全

  • SELinux Enforcing;
  • auditd 开启;
  • 自动安全更新策略;
  • 禁止无用服务;
  • 检查 SUID 文件;
  • 检查空密码用户;
  • 检查过期账号;
  • 检查异常登录。

30.4 日志与审计

  • journald 持久化;
  • rsyslog 正常;
  • /var/log/secure 可查;
  • audit 日志可查;
  • 日志切割正常;
  • 日志集中采集;
  • 关键操作可追踪。

第三十一章 常见问题 FAQ

Q1:Rocky Linux 9/10 还能用 yum 吗?

可能还能用兼容命令,但新脚本和新教程建议统一写 dnf。不要在同一套初始化脚本里 yumdnf 混着来。

Q2:为什么不建议关闭 SELinux?

因为 SELinux 是强制访问控制,能限制服务被攻陷后的破坏范围。生产环境应该学会配置和排查,而不是直接关掉。

Q3:为什么不建议关闭 firewalld?

因为服务器应该最小端口开放。关闭防火墙会让暴露面变大,尤其是数据库、Redis、监控端口,一旦暴露公网,后果很刺激,刺激到你可能不想体验第二次。

Q4:为什么不推荐 /etc/sysconfig/network-scripts

Rocky 9/10 的网络管理主线是 NetworkManager / nmcli / keyfile。老 ifcfg 方式可能还兼容,但不应作为新教程主线。

Q5:Podman 能完全替代 Docker 吗?

大部分单机容器运行场景可以。Docker 的优势是生态普及、Compose 成熟。Podman 的优势是 rootless、systemd、SELinux、RHEL/Rocky 原生生态。企业中应按团队标准选择。

Q6:Cockpit 能不能暴露公网?

不建议。Cockpit 应限制在运维网段,或者通过 VPN / 堡垒机访问。

Q7:dnf-automatic 要不要自动安装更新?

测试环境可以。生产环境建议至少先自动下载或提醒,安装要走维护窗口。核心业务服务器不要无脑自动更新后半夜重启。

Q8:sysctl 参数能不能复制网上的万能优化?

不建议。调优必须基于业务场景、瓶颈指标和压测结果。没有指标的调优,就是给服务器算命。

参考资料

启示录

富贵岂由人,时会高志须酬。

能成功于千载者,必以近察远。

服务器初始化的最高境界,不是命令敲得快,而是半年后还能知道当初为什么这么配。


Rocky Linux 9/10 企业级初始化、安全加固与运维实践指南
https://allendericdalexander.github.io/2026/06/30/devops/linux/rocky_linux_9_10_enterprise_guide/
作者
AtLuoFu
发布于
2026年6月30日
许可协议