OpenSSH服务端未安装或未启用是导致ssh命令可用但无法连通自身的主要原因;需安装openssh-server、启用sshd服务、放行防火墙22端口、正确配置sshd_config中ListenAddress、PermitRootLogin和PasswordAuthentication等参数,并确保密钥权限与路径正确。

OpenSSH 服务没装,ssh 命令能用但连不上自己?
这是最常被忽略的混淆点:Linux 自带 ssh 客户端(所以你能 ssh user@other-host),但默认不装服务端(sshd)。开启远程控制,本质是装并启用 sshd 服务。
实操建议:
- 先确认是否已安装服务端:
systemctl list-unit-files | grep sshd—— 如果没输出或显示disabled,就得装 - Debian/Ubuntu 系:运行
sudo apt install openssh-server(不是openssh-client) - RHEL/CentOS/Rocky 8+:用
sudo dnf install openssh-server;7 及更早用sudo yum install openssh-server - 装完立即启动:
sudo systemctl enable --now sshd(--now表示同时启动,别漏)
防火墙拦着,Connection refused 或根本超时
装完 sshd 后本地 ssh localhost 成功,但外网连不上?90% 是防火墙没放行 TCP 22 端口。
实操建议:
- 查当前防火墙状态:
sudo ufw status(Ubuntu)或sudo firewall-cmd --state(RHEL 系) - Ubuntu:
sudo ufw allow OpenSSH(比写端口号更安全,自动匹配规则) - RHEL/CentOS 7+:
sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload - 别手动开 22 端口再加一堆 iptables 规则——除非你明确知道为什么不用现成 service 定义
/etc/ssh/sshd_config 改哪几项才真正“开启远程控制”
默认配置通常已允许密码登录和远程访问,但某些发行版(如 Ubuntu Server 22.04+)会禁用密码登录,或监听仅限 IPv6。不改关键项,远程连得上也登不进去。
实操建议(改前先备份:sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak):
- 确保
ListenAddress没被设成127.0.0.1或注释掉——留空或设为0.0.0.0才监听所有接口 - 检查
PermitRootLogin:若需 root 直连,设为yes或prohibit-password(推荐后者 + 密钥) - 确认
PasswordAuthentication是yes(如果不用密钥登录) - 改完必须重载:
sudo systemctl reload sshd(不是 restart,reload 更稳妥)
连得上但提示 Permission denied (publickey)?密钥登录卡在哪
这个错误不等于密钥没配好,而是服务端根本没启用密钥认证,或客户端没传对 key。
实操建议:
- 先看服务端是否允许:
grep -i "pubkeyauthentication" /etc/ssh/sshd_config,必须是PubkeyAuthentication yes - 客户端用
-v调试:ssh -v user@host,看日志里有没有Offering public key和Server accepts key - 用户家目录下
~/.ssh/authorized_keys权限必须是600,目录~/.ssh必须是700,否则sshd会静默拒绝 - 别把私钥放错位置——
ssh默认只读~/.ssh/id_rsa或id_ed25519,其他名字要显式指定:ssh -i ~/.ssh/mykey user@host
真正麻烦的从来不是装软件,而是每个环节都依赖前一个环节正确:服务进程在跑、端口开着、配置生效、权限合规、密钥路径和格式对得上。少一环,ssh 就只报一句模糊的拒绝。










