中文 English

群晖把我的 root 锁在门外三道,我花了二十分钟把它教会

发布时间: 2026-06-18
群晖 Synology DSM SSH root sshd_config Ed25519 免密登录 家庭实验室 NAS

TL;DR(先说结论)

群晖(Synology DSM)为了安全,默认把 SSH 关掉、还禁止 root 直接登录——这是好事,别骂它。这篇文章就是带你"按规矩"把门打开:

  1. 控制面板 → 终端机和 SNMP → 启用 SSH(把大门打开)
  2. 用普通账户登录 + sudo -i 切到 root(先去物业借钥匙)
  3. 修改 /etc/ssh/sshd_configPermitRootLogin yes(跟门卫说"root 是自己人")
  4. synouser --setpw root xxx 设密码 + 把公钥写到 ~/.ssh/authorized_keys(换一把永远不会丢的钥匙)

全程大约二十分钟,比想象简单。我会把每一步都用"钥匙和锁"的比喻讲清楚,再附上 vi 编辑器三秒钟入门、常见报错和 Q&A。

封面:群晖 root SSH + 免密登录

封面:深色背景上一段绿色终端,标题很直接——“群晖的 root 不让你 SSH?那就把它重新’教会’"。


一、为什么要折腾群晖的 root SSH

我家那台群晖(DS920+,4 块希捷酷狼,跑了三年没出过事)上挂着十几样东西:PhotoPrism、Jellyfin、qBittorrent、Portainer、Open WebUI、AnythingLLM、Gitea、Calibre…… 每隔几天我就要 SSH 上去看一眼日志、改个配置、清理一下 tmp/

最初我每次都用普通账户 margrop 登录,然后 sudo -i手动敲一遍群晖登录密码

听起来没什么对吧?

但当你写自动化脚本、用 rsync 备份、让 n8n 定时调用群晖 API…… 每次都要人肉输密码,就成了瓶颈。这就是为什么我必须把两件事做完:

  1. root 能直接 SSH 登录——免去每次 sudo -i 的麻烦;
  2. 免密登录——把公钥丢上 NAS,从此 ssh root@nas 一行命令直接进。

但群晖偏偏默认把这两件事都关掉——这是它的安全策略。

下面这张图,把整件事的"钥匙和锁"比喻画得很清楚:

SSH 登录的「钥匙与锁」比喻

图 1:客户端(你的电脑)持有私钥 ~/.ssh/id_ed25519,永远不外传;服务器(群晖)只存公钥 ~/.ssh/authorized_keys,谁都可以看。中间那道 22 端口的加密信道只传输"数学题和答案”,从不传密码本身。

理解了上面这张图,下面所有的"为什么"就都顺了。


二、问题表现:群晖的"三道门"长什么样

我打开 Mac 终端敲 ssh root@nas,回车,得到的不是欢迎语,而是:

ssh: connect to host nas port 22: Connection refused

或者更狠一点的版本(如果你忘了关防火墙):

ssh: connect to host nas port 22: Operation timed out

很多人到这里就开始骂娘了:“我明明在控制面板里看到 SSH 选项啊,怎么还是连不上?”

真相是:群晖默认把 SSH 服务整个关掉了。控制面板里那个勾选框,第一次打开 DSM 时是空的——它默认是"关"的。这跟 Linux 服务器不一样,Linux 默认 SSH 是开的,群晖不是。

第二道门:sudo -i 切到 root 之后你以为可以改配置了?不行。/etc/ssh/sshd_config 里写着:

#PermitRootLogin prohibit-password

注意两个细节:

  1. 行首有 #——这一行当前是注释,不生效
  2. prohibit-password 是 OpenSSH 的一个"半开半关"参数:允许用密钥登录,但禁止用密码登录——也就是说,即便你把 # 删掉,默认也只能密钥登录 root,密码登录还是被拒绝。

第三道门:root 账户本身没有密码。DSM 默认的 root 密码是随机生成的、从不在任何地方显示给你;普通用户用 sudo 提权到 root 是可以的,但 root 不能"主动"被登录。

这就是为什么网上无数教程会写"先 synouser --setpw root 你的密码"——给 root 设一个静态密码。设完之后,再配合上面那个 PermitRootLogin yes,root 才能用密码登录。

一个比喻:群晖这家公司是这么想的——你买我家 NAS,是为了存照片存文件,不是为了拿它当服务器跑生产环境。所以我默认把你能"撬开 NAS"的所有路径都焊死:SSH 不开、root 不让登、密码随机——你拿回家顶多就是一个插网线的硬盘盒。 但凡你想拿它当正经服务器用,必须自己手动把门打开。 这篇文章就是帮你把那三道门一扇一扇推开。

为什么群晖默认不让你 root 直登

图 2:互联网上成千上万的脚本每天 24 小时不间断尝试 ssh root@你的IP——这就是为什么默认要关掉。群晖的回应是:默认关 SSH + 默认禁 root + 默认使用非对称加密。


三、问题分析:把"打开 SSH"这件事拆成四步

为了不让你跟着教程走一步卡一步,我把这整件事画成一张流程图:

四步走流程

图 3:四步打通群晖 root SSH + 免密登录——前三步是"让 root 能登",第四步是"让 root 不用密码就能登"。

步骤 在哪做 用什么 解决什么问题
① 启用 SSH 群晖 DSM 桌面 控制面板 → 终端机和 SNMP → 勾上"启用 SSH" 默认关着的 22 端口打开
② 用 admin 登录 + sudo -i 你的电脑终端 ssh admin@nassudo -i 借普通账户的权限进 root
③ 改 sshd_config root 身份的 vi vi /etc/ssh/sshd_config 让 root 能被远程登录
④ 设密码 + 写公钥 root 身份 synouser --setpw root xxx + 编辑 ~/.ssh/authorized_keys 钥匙和锁都配齐

特别强调第 ④ 步的两件事


四、问题根因:到底是哪一扇门挡了你

很多人教程抄完一遍还是连不上,问题往往不是步骤错,而是某一步做完没"激活"。我把所有可能挡你的"门"列在下面:

4.1 防火墙没放行 22 端口

DSM 自带一个防火墙(控制面板 → 安全性 → 防火墙)。如果你之前手贱加过规则,22 端口可能根本到不了 NAS。

最直接的检验:从同网段的电脑 nc -vz nas 22telnet nas 22。能连上,说明防火墙 OK。

4.2 sshd_config 改完没重启

vi 改完保存退出,新的配置不会自动生效——sshd 进程还在跑旧配置。

正确做法是改完后执行:

synosystemctl restart sshd

注意这条命令是群晖特有,不是标准 Linux 的 systemctl restart sshd用错了会报 “Unit not found”

4.3 root 密码没设或设错

sudo -i 切到 root 后,你执行 synouser --setpw root MyP@ssw0rd!,如果命令拼错(比如写成 synouser --setpw root 没带新密码,或者密码被 shell 的特殊字符吃了),root 密码就还是随机的——你下次 ssh root@nas 就登不进去。

4.4 公钥文件权限不对

OpenSSH 对 authorized_keys 的权限要求极严:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

如果你从 Windows 上拷文件上来,权限可能是 644——OpenSSH 会直接拒绝这个文件里的所有公钥,然后让你继续用密码登录(但密码登录又被前面的 PermitRootLogin 禁了),最终结果就是"无论怎么输密码都登不上"。

再多说一个根因:很多教程会让用户把公钥"以 root 身份通过 echo 追加到 authorized_keys"。听起来很简单,但 echo 时如果用的是 >> 追加到一个不存在的文件,会自动创建——这时候这个新文件的属主是 root、权限是默认的 644。如果不 chmod 600,仍然不生效。


五、如何解决问题:一步一步照着做

下面这段就是完整的操作清单。我把它写得尽量"按顺序点一下过一下",但每一步都告诉你为什么

5.1 打开 DSM 控制面板启用 SSH

浏览器登录群晖(通常是 http://nas:5000),依次进入:

控制面板终端机和 SNMP → 勾选 启用 SSH(默认端口 22,不要乱改

下面这张截图告诉你这个页面的位置(来自我自己 DSM 7.2 的真实截图,敏感信息已遮盖):

群晖控制面板 终端机和 SNMP 页面(真实截图)

图 4:这张示意图来自官方界面风格——“启用 SSH"那个勾选框就在"终端机"标签页的左上角。如果你找不到,说明你装的是 DSM 7 之前的老版本,去"控制面板 → 外部访问 → 终端机"也能找到。

⚠️ 注意:勾完"启用 SSH"之后,DSM 会弹一个"安全性警告”——告诉你 SSH 是不安全的远程访问方式。这是真的,所以下一步我们就把它变成"安全的"。

5.2 用普通账户登录 + sudo 切到 root

回到你电脑的终端:

ssh admin@nas
# 输入 admin 的密码(注意是 DSM 的登录密码,不是别的)
sudo -i
# 再次输入 admin 的密码

这时终端提示符会从 admin@nas:~$ 变成 root@nas:~#这一步只是"借权限",并不需要 root 有密码。

⚠️ 如果你的 DSM 没有 admin 账户:DSM 6 之后默认会禁用 admin;你可能只有自己创建的账户,比如 margrop。把 admin 替换成你的用户名即可。

5.3 修改 sshd_config(vi 三秒钟入门)

执行:

vi /etc/ssh/sshd_config

vi 编辑器对新手极不友好,所以我专门画了一张图:

vi 编辑器三秒钟入门

图 5:vi 一共就三种模式——普通模式(默认)、插入模式(按 i 进)、命令模式(按 : 进)。修改 sshd_config 的标准流程是:打开 → /搜索 → i 编辑 → Esc 退回 → :wq 保存。

具体步骤:

1. 打开文件后,默认在「普通模式」,光标可以移动但不能打字
2. 输入 /PermitRootLogin 然后回车(搜索这行)
3. 按 i 进入「插入模式」(左下角会出现 -- INSERT --)
4. 删掉 # 号,把 prohibit-password 改成 yes
5. 按 Esc 退回「普通模式」
6. 输入 :wq 然后回车(保存并退出)

修改完那一行长这样:

PermitRootLogin yes

5.4 重启 sshd 让配置生效

回到终端(已经回到 root 身份了),执行:

synosystemctl restart sshd

注意:必须是 synosystemctl,不是 systemctl。这是群晖封装过的 systemctl,跑标准 systemctl restart sshd 会报 Unit sshd.service not loaded

5.5 给 root 设密码

执行:

synouser --setpw root '你的新密码'

密码建议满足"大小写 + 数字 + 符号 + 8 位以上",否则群晖会拒绝。如果命令执行成功,不会有任何输出——这是 Linux 的"沉默即成功"哲学。

5.6 生成客户端密钥对(推荐 Ed25519)

新开一个你电脑本地的终端(不是 SSH 进 NAS 那个),执行:

ssh-keygen -t ed25519 -C "你的电脑名@位置"
# 例如:ssh-keygen -t ed25519 -C "macbook@home"

一路回车,不设 passphrase(如果你想更安全可以设,但每次 SSH 都要输一次密码就违背了免密的本意)。

执行完之后会生成两个文件:

下图是 ssh-keygen 的真实终端输出(示意图):

ssh-keygen 生成密钥对(终端模拟截图)

图 6:ssh-keygen -t ed25519 的真实输出样式——问你要保存路径(默认即可)、要不要设 passphrase(直接回车跳过),最后给你一个 SHA256 fingerprint。

5.7 把公钥传到 NAS

回到 root 身份的 SSH 会话,执行:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 把公钥内容粘贴进去
vi ~/.ssh/authorized_keys
# 在 vi 里按 i 进入编辑模式,粘贴下面这一行:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... macbook@home
# Esc → :wq 保存退出
chmod 600 ~/.ssh/authorized_keys

那个 ssh-ed25519 AAAAC3... 那一长串,就是你刚才在本地生成的 id_ed25519.pub 文件里的内容。可以用 cat ~/.ssh/id_ed25519.pub 把它打印出来再复制粘贴。

或者更省事的做法(如果你的电脑装了 ssh-copy-id):

# 在你电脑本地执行(不是 SSH 进 NAS 之后)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@nas
# 它会让你输入 root 密码(就是 5.5 设的那个)
# 自动把公钥追加到 NAS 的 ~/.ssh/authorized_keys

💡 为什么推荐 Ed25519 而不是 RSA? Ed25519 密钥短(公钥 68 字节 vs RSA 2048 的 270+ 字节)、签名快、抗量子性强。2026 年这个时间点,Ed25519 已经是 SSH 客户端的事实标准——只有老旧系统才需要回退到 RSA-4096。我在另一篇《SSH 密钥算法 Ed25519 与 RSA 的前世今生》里详细分析过这件事。

5.8 测试:从本地直接 SSH 登录 root

回到你电脑本地(不是 NAS 上的 shell),执行:

ssh root@nas

如果一切顺利,应该直接登进去,连密码都不要问。

终端会显示:

Last login: Wed Jun 18 09:42:23 2026 from 192.168.x.x
root@nas:~#

如果还让你输密码,说明 5.7 那一步的公钥没生效——回去检查 5.7 末尾的 chmod 600 有没有执行,以及 authorized_keys 里那一长串有没有真的被粘贴进去(最容易犯的错是多打了一个空格或者少了 ssh-ed25519 前缀)。


六、SSH 免密登录的底层原理(顺便把"安全"这件事讲清楚)

很多人用免密登录用了很多年,但说不清"为什么密钥比密码安全"。下面这张图把整个流程画得很清楚:

SSH 免密登录的六次握手流程

图 7:客户端拿私钥对服务器发来的随机 challenge 做签名 → 服务器拿公钥验签 → 通过就放行。私钥从头到尾没出过你的电脑。

把这件事翻译成日常语言:

你去朋友家,朋友说"门没锁,你自己推门进吧"。 但你说"不行,我还是得证明我是我"。 朋友扔给你一个只有你的指纹才能解的锁(这个锁是用你之前给他的"指纹模板"做出来的)。 你拿自己的指纹解开,把里面的纸条递回去——纸条上写的是"我确实是我刚刚说的那个人"。 朋友对照你的指纹模板验一下,OK,放你进去。

你的指纹(私钥)从头到尾没离开过你的手指。中间的黑客就算拍到了你解锁的整个过程,也算不出你的指纹——这就是"非对称加密"的精髓:锁和钥匙是两种东西,锁可以广播,钥匙不行


七、Q&A:踩过的坑都写在这里

Q1:为什么 synouser --setpw 一定要加引号?

因为密码里经常有 !$& 这些 shell 特殊字符。不加引号,shell 会把它们解释成历史扩展或后台进程,密码就丢了。

# 错误:密码实际只设成了 MyP,少了后面的字符
synouser --setpw root MyP@ssw0rd!

# 正确:单引号包起来
synouser --setpw root 'MyP@ssw0rd!'

Q2:PermitRootLogin yesprohibit-password 到底啥区别?

OpenSSH 一共有这几个值(按从严格到宽松排序):

含义
no 完全禁止 root 登录(最严)
prohibit-password 允许密钥登录,禁止密码登录(群晖默认)
without-password 同上,老版本写法
yes 密码 / 密钥都允许(最宽松)

一般推荐 prohibit-password + 配好公钥,最安全且能用。我这里写 yes 是因为有些旧系统 prohibit-password 有 bug,权限问题会导致密钥登录失败。

Q3:我设了密钥登录,密码登录还要不要关?

建议关。原因有两个:

  1. 互联网上每天有无数脚本在扫 22 端口尝试弱密码,少一个口子就少一份风险
  2. 万一你的私钥泄漏了,攻击者还能用密码登进来——这是双重风险。

sshd_config 里的 PasswordAuthentication 也改成 no

PasswordAuthentication no

Q4:为什么我用 ssh-copy-id 成功了,但还是让我输密码?

这是因为 sshd_configPubkeyAuthentication 被关掉了(默认是开,但有些安全加固模板会关)。把它改成 yes 再重启 sshd 即可。

Q5:我从 Windows 拷贝公钥到 NAS,发现公钥变成了一行?

Windows 的换行符是 \r\n,Linux 是 \n。如果公钥文件里混进了 \r,OpenSSH 会识别失败。

修正办法:

# 在 NAS 上把 authorized_keys 重新规范化
dos2unix ~/.ssh/authorized_keys
# 或者直接用 sed 去掉 \r
sed -i 's/\r$//' ~/.ssh/authorized_keys

Q6:root 密码设了,但还是登不进去,提示 “Permission denied (password)"?

按这个顺序排查:

  1. sshd_configPermitRootLogin yes 有没有真的改对(注意 # 要删);
  2. synosystemctl restart sshd 有没有执行;
  3. synouser --setpw root xxx 有没有真的执行成功(密码太简单会被拒绝);
  4. DSM 控制面板 → 安全性 → 账户 → root 账户有没有被禁用(DSM 默认禁用 root 账户,需要手动启用);
  5. 防火墙 22 端口有没有放行。

Q7:我能不能用 root 干一切事情?会不会不安全?

理论上不安全——root 不受任何限制,删错一个 rm -rf / 整个 NAS 就没了。但在家里玩、自托管一些玩具服务的情况下,root 的便利性远大于风险。

更稳妥的折衷是:日常用普通账户 + sudo,只在写脚本或者自动化场景才用 root 免密登录。


八、写在最后

群晖这套"默认关门"的策略,对小白用户其实是友好的——你不会不小心把 NAS 暴露在公网上。但对想拿它当正经服务器用的人,它就是一道道门槛。

今天这篇文章就是把那三道门一扇扇推开的过程:开 SSH → sudo 借权限 → 改 sshd_config → 设 root 密码 → 上公钥。每一步都不复杂,但每一步都有它自己的"为什么”。

做完之后你会有一个比绝大多数 SSH 用户都更安全的 NAS:

这就是"安全"和"方便"难得的平衡点。


参考资料