DigitalOcean Rocky Linux Droplet 安装配置指南 2026
Rocky Linux 是 Red Hat 改变 CentOS 发展方向后推出的社区开发操作系统。Red Hat 将 CentOS 从 RHEL(Red Hat Enterprise Linux)的下游重建版本改为 CentOS Stream(作为上游)之后,Red Hat 企业 Linux 的 CentOS 替代品就此诞生。这一变化促使许多依赖 CentOS 进行生产工作的系统管理员寻找新的替代方案。原始 CentOS 创始人之一 Gregory Kurtzer 启动了 Rocky Linux 项目,其目标与早期 CentOS 一致:成为与 RHEL 完全二进制兼容(1:1 基础)、免费使用且不依附于任何单一公司的发行版。如今,Rocky Linux 由非营利组织 Rocky Enterprise Software Foundation(RESF)维护,其成员来自多家公司。对于那些希望在 DigitalOcean Droplet 上运行与 RHEL 二进制兼容、同时保持免费使用的系统的用户,本指南将逐步介绍从创建 Droplet 到设置基本安全配置的全过程,这些配置与 Debian/Ubuntu 系列存在明显差异。这些差异包括 dnf、firewalld 和 SELinux。
目录
什么是 Rocky Linux — CentOS 的替代方案
Rocky Linux 在 2021 年出现,当时 Red Hat 宣布改变 CentOS 的发展方向,从 RHEL(Red Hat Enterprise Linux)的下游重建版本改为 CentOS Stream,后者作为上游存在。这一变化促使许多依赖 CentOS 进行生产工作的系统管理员寻找新的替代方案。Gregory Kurtzer 是原始 CentOS 创始人之一,他启动了 Rocky Linux 项目,目标明确:成为与 RHEL 完全二进制兼容(1:1 基础)、免费使用且不依附于任何单一公司的发行版,这与早期 CentOS 的目标相符。如今,Rocky Linux 由非营利组织 Rocky Enterprise Software Foundation(RESF)维护,该组织成员来自多家公司,为其提供支持。
Rocky Linux 与熟悉的 Ubuntu 或 Debian 发行版之间最显著的差异在于包管理器和安全模型。Rocky Linux 使用 dnf(Dandified YUM)而不是 apt,在安装完成后将 SELinux(Security-Enhanced Linux)强制设置为强制模式下的强制访问控制,而 Ubuntu 使用 AppArmor(采用不同的操作原则),并使用 firewalld 而不是 ufw 来管理防火墙。此外,Rocky Linux 遵循 RHEL 的发布周期,每个主要版本(如 9.x)获得长达 10 年的支持(5 年完全支持加 5 年维护支持),这使其更适合优先考虑长期稳定性而非频繁功能更新的工作负载。
对于考虑在 DigitalOcean Droplet 上运行 Rocky Linux 的用户,主要原因通常包括与在 RHEL 上测试过的企业软件的兼容性、团队对 CentOS/RHEL 系列的熟悉度、来自特定行业的合规要求(指定使用 RHEL 兼容操作系统),或需要运行作为 RPM 包专门分发的软件。与此同时,强调简便性或受益于 Ubuntu 庞大教程生态系统的用户可能会发现 Ubuntu 或 Debian 能够在初始设置阶段更快地满足他们的需求。
- Rocky Linux 由 Gregory Kurtzer 在 2021 年创立,当时 Red Hat 将 CentOS 转变为 CentOS Stream
- 与 RHEL 在 1:1 基础上二进制兼容,由 Rocky Enterprise Software Foundation(RESF)维护
- 使用 dnf 而不是 apt,使用 firewalld 而不是 ufw,从安装时起就强制启用 SELinux
- 每个主要版本获得长达 10 年的支持,理想用于强调稳定性的工作负载
创建 Rocky Linux Droplet
综合多次测试,在 DigitalOcean 上创建 Rocky Linux Droplet 使用与创建任何其他 Droplet 类型相同的控制面板界面。首先单击创建 > Droplets,然后选择发行版选项卡,选择 Rocky Linux,并选择可用的版本。系统会显示区域选择,所有 15 个数据中心都可用,就像标准 Droplets 一样。对于泰国用户,建议使用 sgp1(新加坡)以获得最低延迟,blr1(班加罗尔)作为备选方案。
下一步涉及从基本层(共享 CPU)选择 Droplet 大小,起价为每月 $4(512 MiB RAM、1 vCPU、10GB SSD、500GiB 流量)。但是,由于 Rocky Linux 通常运行需要 SELinux 和 firewalld 以全容量运行的生产工作负载或服务,建议从至少每月 $12 的计划开始(2GiB RAM、1 vCPU、50GB SSD、2,000GiB 流量),以便为 dnf 更新和多个并发服务提供足够的余量。对于需要超过 1 vCPU 的用户,每月 $18 的计划(2GiB RAM、2 vCPU、60GB SSD)代表另一个成本效益选项。
在身份验证步骤中,始终选择 SSH 密钥而不是密码(上传现有公钥或使用 ssh-keygen -t ed25519 预先生成新密钥)。对于主机名,使用描述性名称如 rocky-web-01 以简化运行多个 Droplets 时的管理。然后单击创建 Droplet;配置通常需要约 1 分钟。
账单说明:自 2026 年 1 月 1 日起,DigitalOcean 使用按秒计费方式为 Droplets 计费,最少收费 60 秒或每次激活 $0.01,两者取其高者。这意味着即使在几秒内测试 Droplet 的创建和删除,每次也会产生最少费用。如果您经常创建和销毁 Droplets,请相应地规划测试活动。
- 创建 > Droplets > 发行版 > 选择 Rocky Linux
- 区域建议:对泰国用户使用 sgp1(新加坡)或 blr1(班加罗尔)
- 推荐起始计划:每月 $12(2GiB RAM/1vCPU/50GB SSD)及以上用于生产工作负载
- 从创建步骤开始选择 SSH 密钥进行身份验证,而不是密码
配置 SSH 密钥和 SELinux 基础知识
如果在 Droplet 创建期间添加了 SSH 密钥,您可以立即使用 ssh root@your_droplet_ip 通过 SSH 进入机器,而无需输入密码。如果您在创建期间忘记添加密钥,请使用 ssh-copy-id root@your_droplet_ip 之后将密钥复制到 Droplet。您应该立即禁用基于密码的登录以降低暴力破解攻击的风险,方法是编辑 /etc/ssh/sshd_config,设置 PasswordAuthentication no 和 PermitRootLogin prohibit-password,然后使用 systemctl restart sshd 重新启动服务。至关重要的是,您必须在禁用密码身份验证之前测试通过密钥成功登录,以避免将自己锁在机器外面。
Debian/Ubuntu 系列系统最明显不同的方面是 SELinux,Rocky Linux 从安装完成时就在强制模式下启用它。使用 sestatus 或 getenforce 检查当前状态,默认情况下应显示 Enforcing。SELinux 基于强制访问控制原则运行:它为文件、进程和网络端口分配上下文(标签),然后仅允许策略明确允许的操作。这与 Ubuntu 的 AppArmor 不同,AppArmor 基于路径运行。
对于不熟悉这种方法的用户,最常见的问题是服务尽管配置正确但仍无法运行 — 例如,Nginx 无法从 /var/www 以外的目录读取文件,因为文件上下文与策略允许的不匹配。正确的修复涉及使用 semanage fcontext 和 restorecon 调整上下文,而不是系统范围内禁用 SELinux。例如:semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?" 后跟 restorecon -Rv /data/www。要为服务开放非标准端口,请使用 semanage port -a -t http_port_t -p tcp 8080。要检查 SELinux 已阻止的内容,请运行 ausearch -m avc -ts recent 或 journalctl -t setroubleshoot。
- 在 sshd_config 中禁用 PasswordAuthentication 之前测试 SSH 密钥登录成功
- 使用 sestatus 或 getenforce 检查 SELinux 状态(默认为 Enforcing)
- 使用 semanage fcontext + restorecon 修复上下文不匹配,而不是系统范围内禁用 SELinux
- 使用 semanage port -a 为 SELinux 启用非标准端口
创建用户和配置 sudo
直接以 root 身份运行所有内容会带来安全风险。Droplet 创建后的标准做法是为日常使用创建新用户并授予 sudo 权限。在 Rocky Linux 上,使用 useradd 命令而不是 Ubuntu 使用的交互式 adduser(Rocky 仅将 adduser 作为 useradd 的符号链接,不包含 Debian 风格的提示)。典型命令是 useradd -m -G wheel deploy,其中 -m 自动创建主目录,-G wheel 将用户添加到 wheel 组 — RHEL 系列用于授予 sudo 权限的组(等同于 Ubuntu 上的 sudo 组)。之后使用 passwd deploy 设置密码。
Rocky Linux 的默认 wheel 组可能不会自动启用 sudo 权限;您必须使用 visudo 验证并编辑 sudoers 文件(绝不使用文本编辑器直接编辑 /etc/sudoers,因为语法错误会破坏系统范围内的 sudo)。查找 %wheel ALL=(ALL) ALL 行,如果仍被注释则取消注释。然后通过创建 ~deploy/.ssh 目录、从 root 复制 authorized_keys 文件,并使用 chmod 700 ~deploy/.ssh 和 chmod 600 ~deploy/.ssh/authorized_keys 设置正确的权限,加上 chown -R deploy:deploy ~deploy/.ssh,将 SSH 公钥复制到新用户。
关闭 root SSH 访问前,测试使用新用户登录并运行 sudo -l 以确认 sudo 权限正常工作。还要尝试运行需要提升权限的命令,如 sudo dnf update,以确保设置后的系统管理不需要直接 root 登录。
- useradd -m -G wheel deploy 创建带有主目录和 wheel 组成员资格的用户
- passwd deploy 设置密码(仅作为后备,不是主要登录方法)
- visudo 打开 sudoers 文件;如果需要取消注释 %wheel ALL=(ALL) ALL
- 使用正确的 700/600 权限将 authorized_keys 复制到新用户
使用 firewalld 开放防火墙
用户经常问到的一点是:Rocky Linux 使用 firewalld 作为其默认防火墙管理器,而不是 Ubuntu 使用的 ufw。firewalld 使用区域运行,每个区域有其自己的规则集,接口或源附加到单个区域。标准 Droplets 默认为 public 区域。首先,使用 systemctl status firewalld 验证服务状态,使用 firewall-cmd --get-active-zones 查看活动区域。
开放标准服务比直接开放端口更简单,因为 firewalld 提供现成的服务定义。使用 firewall-cmd --permanent --add-service=ssh 开放 SSH,使用 firewall-cmd --permanent --add-service=http 和 firewall-cmd --permanent --add-service=https 开放网络流量。对于没有预构建服务定义的端口 — 如在端口 3000 上运行的应用服务器 — 使用 firewall-cmd --permanent --add-port=3000/tcp。至关重要的是,每个使用 --permanent 的命令在您运行 firewall-cmd --reload 以将新规则加载到运行时配置中之前保持无效。使用 firewall-cmd --list-all 验证所有结果。
严重警告:在首次重新加载或启用 firewalld 之前,始终开放 SSH 端口。意外关闭 SSH 访问意味着您无法再通过 SSH 登录(您将依赖 DO Console 通过控制面板 Web 界面进行恢复)。DigitalOcean 还提供在流量到达 Droplet 之前的网络级别上运行的 Cloud Firewall,无额外成本。将其与 firewalld 结合提供深层防御;设置 Cloud Firewall 规则以匹配您实际开放的服务,以防止混淆流量被阻止的位置。
- 使用 firewall-cmd --get-active-zones 检查活动区域(通常为 public)
- 使用 firewall-cmd --permanent --add-service=ssh/http/https 开放标准服务
- 使用 --add-port 开放非标准端口,例如 3000/tcp
- 在使用 --permanent 添加规则后始终运行 firewall-cmd --reload
- 使用 DigitalOcean Cloud Firewall(免费)与 firewalld 结合以实现深层防御
使用 dnf 更新系统
基本安全设置完成后,下一步是使用 dnf(Dandified YUM)更新系统,dnf 是 Rocky Linux 的主要包管理器,取代了 apt。要运行的第一个命令是 sudo dnf update -y 以更新所有包,包括最新的安全补丁。与 apt 不同(后者将更新步骤(获取包列表)与升级步骤(安装包)分开),dnf update 在单个命令中执行两者。更新完成后,运行 sudo dnf autoremove 以清理系统中不必要的包。
某些包在 RHEL/Rocky 的标准存储库中不存在;首先使用 sudo dnf install epel-release -y 启用 EPEL(企业 Linux 的额外包),然后正常 dnf install 所需的包。对于具有多个版本的软件 — 如 PostgreSQL 或 Node.js — Rocky Linux 使用 dnf module 系统。使用 dnf module list postgresql 检查可用的流,选择所需的流,然后安装。
与更新一起进行的其他基本配置包括设置时区和主机名。使用 sudo timedatectl set-timezone Asia/Bangkok 设置时区,使用 sudo hostnamectl set-hostname rocky-web-01 设置主机名以匹配 Droplet 创建期间设置的名称。最后,对于需要自动安全补丁而无需每次手动 SSH 干预的系统,通过 sudo dnf install dnf-automatic 安装 dnf-automatic,然后使用 sudo systemctl enable --now dnf-automatic.timer 启用其计时器。配置 /etc/dnf/automatic.conf 以仅自动应用安全更新;可能影响兼容性的一般更新应保持手动并首先在暂存环境中测试,特别是在生产服务器上。
- sudo dnf update -y 在一个命令中更新所有包,包括安全补丁
- dnf autoremove 从系统中删除不必要的包
- 使用 dnf install epel-release 启用 EPEL 存储库以获取 RHEL 标准之外的包
- 使用 timedatectl 和 hostnamectl 设置时区/主机名
常见错误和修复方法
从 Ubuntu/Debian 过渡来的用户一个主要错误是习惯性地运行 apt 或 apt-get,立即产生"命令未找到"错误,因为 Rocky 不附带 apt。您必须重新训练肌肉记忆每次都使用 dnf。类似地,运行 adduser username 期望 Debian 的交互式提示将只会在没有任何提示的情况下创建用户,因为在 Rocky 上它仅是 useradd 的符号链接。
下一个频繁的问题是服务尽管配置正确且 firewalld 端口开放但仍拒绝运行,通常是因为 SELinux 在某些日志中无声地阻止它而没有清晰的错误消息。每当服务在没有明显原因的情况下出现故障时,始终检查 journalctl -t setroubleshoot 或 ausearch -m avc -ts recent,而不是急于使用 setenforce 0 系统范围内禁用 SELinux。这修复了立即症状但使系统永久易受攻击。
另一个频繁的错误是在验证 SSH 密钥登录有效之前在 sshd_config 中禁用 PasswordAuthentication,将自己锁在机器外面,除了通过 DO Console(比标准 SSH 慢得多)之外别无他法。在关闭原始访问方法之前,在另一个终端窗口中保持打开状态测试使用新用户/密钥登录。
最后,忘记在使用 --permanent 添加规则后运行 firewall-cmd --reload 会使规则看起来处于活动状态(firewall-cmd 报告成功),但它们实际上不会生效直到 reload 运行。另外,dnf update 有时会因为陈旧的元数据缓存而挂起;使用 dnf clean all 后跟 dnf makecache 在重试更新之前修复这一点。
- 始终使用 dnf 而不是 apt/apt-get — Rocky Linux 不附带 apt
- 在使用 setenforce 0 禁用 SELinux 之前检查 journalctl -t setroubleshoot 或 ausearch
- 在禁用 PasswordAuthentication 之前始终测试 SSH 密钥登录成功
最佳实践
一旦您的 Rocky Linux Droplet 准备好使用,几个实践帮助保持系统的长期安全和可维护性。首先,始终将 SELinux 保持在 Enforcing 模式;绝不永久禁用它或将其切换到 Permissive,因为它是一个关键的保护层,限制了进程被破坏时的损害范围。如果必要进行策略调整,使用 audit2allow 为特定问题生成自定义模块,而不是直接禁用系统。
其次,安装 fail2ban 防御 SSH 暴力破解攻击。fail2ban 位于 EPEL 存储库中,启用 epel-release 后通过 dnf install fail2ban 安装。它通过 fail2ban-firewalld 操作直接与 firewalld 一起工作。第三,定期为持有重要数据的 Droplets 创建 Droplet 快照;快照费用为每月每 GiB $0.06 — 远低于丢失数据的成本 — 如果需要扩展或恢复,可以快速从模板创建 Droplet。
第四,启用 DigitalOcean 监控,这是一个免费的内置功能,提供实时 CPU、RAM、磁盘和带宽视图,以及警告策略设置以在资源接近容量时向您发送邮件。这在最终用户注意到问题之前捕捉问题。第五,将补丁管理分为两层:让安全更新通过 dnf-automatic 自动运行,但保持主要/次要版本升级手动并首先进行暂存测试,这对 RHEL 系列系统尤其重要,其中一次跳过多个次要版本的风险比典型发行版高。
最后,将 firewalld 规则和任何 SELinux 策略自定义文档分开 — 理想情况下作为脚本或基础设施即代码 — 以便您的团队可以快速使用匹配配置配置新 Droplets,而不是依赖一个人的手动记忆。
- 始终将 SELinux 保持在 Enforcing 模式;使用 audit2allow 进行策略修复而不是系统范围内禁用它
- 从 EPEL 安装 fail2ban 以防御 SSH 暴力破解攻击
- 定期创建 Droplet 快照(每月每 GiB $0.06)用于恢复和扩展
- 启用 DigitalOcean 监控(免费)+ 为资源容量警告设置警告策略