跳转到内容

宿主机加固:SSH、证书与管理端口 ​

PVE 装完之后,SSH(22 端口)和 Web UI(8006 端口)默认就能被网络里任何能连到这台机器的设备访问到。这篇讲三件能做的加固:收紧 SSH 登录方式、给 Web UI 换可信证书、限制谁能连上这两个端口。

这篇不是让你把管理端口放到公网上

本文所有加固措施,前提都是管理端口只在受信任的内网或 VPN 里可达。

  • 影响范围:SSH 登录方式和 pveproxy 的访问策略,改错了会导致你自己也连不上宿主机。
  • 前置条件:改 SSH 配置前,必须先确认密钥登录能用;改 pveproxy 访问策略前,必须确认自己所在的网络在放行名单里。
  • 怎么回退:SSH 配置改坏后,用 Web UI 的 Shell(如果还能访问)、IPMI/物理控制台或救援启动进入系统,恢复 /etc/ssh/sshd_config 的备份并重启 sshd;pveproxy 访问策略改坏后同样用控制台恢复 /etc/default/pveproxy 并 systemctl restart pveproxy。

明确结论:不建议把 8006 端口直接暴露到公网。 想从外面访问,用 WireGuard、Tailscale 或反向代理。

为什么需要它 ​

默认配置能用,但不是为「暴露在不可信网络」设计的:

  • SSH 允许密码登录时,暴力破解是持续存在的背景噪音。
  • Web UI 默认用集群自签证书,浏览器会显示不受信任的警告,用户习惯性点「继续访问」,也会让钓鱼页面更容易得手。
  • 8006 端口默认对能到达这台机器的任何网络开放,不区分内网访问和外部访问。

开始之前 ​

  • 需要宿主机的 root shell(本地控制台或已经建立的 SSH 会话)。
  • 准备一个不会关闭的备用连接:改 SSH 配置时,保持当前会话不断开,另开一个新终端测试,确认没问题再关掉旧会话。
  • 如果是集群环境,注意 PVE 节点之间用 root 的 SSH 密钥互相通信(迁移、存储复制等依赖它),不能把 SSH 完全锁死到「谁都进不来」。

操作步骤 ​

1. SSH:只用密钥,限制 root 密码登录 ​

先确认密钥登录已经可用:

sh
# 本地电脑:把公钥放上去(如果还没做过)
ssh-copy-id root@<pve地址>

# 新开一个终端验证密钥登录成功,不要关旧会话
ssh root@<pve地址>

确认成功后,编辑 /etc/ssh/sshd_config:

text
PermitRootLogin prohibit-password
PasswordAuthentication no

集群环境不要写 PermitRootLogin no

节点之间的在线迁移、存储复制等操作依赖 root 通过密钥 SSH 到彼此。prohibit-password(只允许密钥登录 root,禁止密码)能兼顾安全和集群功能;完全禁止 root 登录(no)会破坏这些功能。单机且确定不会组建集群时才考虑更严格的设置。

新节点用密码方式加入集群的场景,可能需要临时放开密码登录,加入完成后再关闭。

改完重启服务,用新终端验证一遍密钥登录仍然成功,再关闭旧会话:

sh
systemctl restart sshd

配合 Fail2ban 挡自动化的暴力破解尝试,官方 Wiki 有现成的 PVE Web 界面专用规则,参考文末链接。改 SSH 端口号只是减少扫描噪音,不是真正的安全措施,效果有限。

2. Web UI:换掉自签证书 ​

PVE 每个节点默认用集群 CA 签发的证书(/etc/pve/nodes/<节点名>/pve-ssl.pem),浏览器不认识这个 CA,会一直提示不安全。两种解决办法:

方式一:用 ACME(Let's Encrypt)自动签发

数据中心 → ACME,注册一个账号(需要同意 Let's Encrypt 服务条款),再到 节点 → 证书 → 添加域名,选好账号后点 Order Certificate Now。

HTTP-01 验证需要 80 端口能被公网访问

ACME 默认用 HTTP-01 方式验证域名归属,要求这台机器的 80 端口能从公网连通。这和本文「不要暴露管理端口」的建议是两回事——80 端口只是临时验证用,8006 仍然不建议直接暴露。如果不想开放 80 端口,改用支持的 DNS-01 验证方式(需要 DNS 服务商的 API 配合),具体配置以官方证书管理页面为准。

方式二:手动上传证书

已经有其他方式签发的证书(比如公司内部 CA),在 节点 → 证书 → 上传自定义证书里上传证书和私钥(私钥不能带密码保护),效果等同写入 /etc/pve/local/pveproxy-ssl.pem 和 pveproxy-ssl.key。

不要动集群自身的证书文件

/etc/pve/local/pve-ssl.pem/pve-ssl.key(节点身份证书)和 /etc/pve/pve-root-ca.pem(集群 CA)是集群内部通信用的,手动替换或编辑会影响集群功能。要换的是 pveproxy-ssl.* 这一对,专门给 Web UI 用。

3. 限制管理端口的来源 ​

最推荐的做法是用 PVE 防火墙在数据中心或节点级别限制 8006、22 端口只接受管理网段的连接。

不想用防火墙,也可以直接限制 pveproxy 本身的来源,编辑 /etc/default/pveproxy:

text
ALLOW_FROM="10.0.0.0/24"
DENY_FROM="all"
POLICY="allow"

改完重启生效:

sh
systemctl restart pveproxy

改之前确认自己在放行范围内

ALLOW_FROM 写错网段,会把自己也挡在外面。改完立刻从允许的网络重新连一次确认,同时保留一个还没断开的控制台或旧会话,方便出问题时回退这个文件。

检查结果 ​

  1. 从外部网络(比如手机流量、公网测试机)尝试连接 22 和 8006 端口,确认连不通或被拒绝(不能只测内网)。
  2. Web UI 访问时浏览器不再提示证书不受信任(如果换了受信任证书)。
  3. journalctl -u sshd -u pveproxy --since "10 minutes ago",确认服务重启后没有报错。
  4. 用密钥重新登录 SSH,确认账号密码方式已经被拒绝。

常见问题 ​

改完 SSH 配置直接断线,进不去了。 用 IPMI/物理控制台或云厂商的紧急控制台登录,检查 /etc/ssh/sshd_config 的改动,改回来后重启 sshd。这也是为什么强调改之前一定要留一个未断开的会话。

限制了 pveproxy 来源之后,集群其他节点访问不了这个节点的 Web UI。 ALLOW_FROM 网段要覆盖到集群内部通信的网络,不要只填自己电脑的 IP。

ACME 一直验证失败。 检查 80 端口是否真的对外可达、有没有其他服务占用了 80 端口、域名解析是否指向这台机器的公网 IP。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。