SSH配置文件分为服务端/etc/ssh/sshd_config和客户端~/.ssh/config,前者管别人怎么连你,后者管你怎么连别人;看懂参数、会改、能测试,就能解决大部分端口修改、密钥登录和连接超时问题。
ssh配置文件在哪里?服务端与客户端路径一次说清
先分清两个文件,日常说的“ssh配置文件详解”多数指服务端sshd_config,但客户端config同样重要。
- 服务端配置文件:
/etc/ssh/sshd_config,几乎所有Linux发行版、云服务器、树莓派、Ubuntu、CentOS都从这里读取sshd守护进程参数。 - 客户端配置文件:
~/.ssh/config,属于当前用户,没有就手动创建,touch ~/.ssh/config && chmod 600 ~/.ssh/config。 - 系统级客户端配置:
/etc/ssh/ssh_config,对所有用户生效,客户端读取顺序是先系统级、后用户级。 - 云服务器ssh配置文件路径通常没有特殊变化,仍是
/etc/ssh/sshd_config,但容器或某些面板环境可能把配置文件挂载到其他位置,可用sshd -T | grep "config file"这类思路排查,不过更直接的是ps aux | grep sshd看启动参数。
检查当前生效配置的正确方式:
sshd -t:检查sshd_config语法,有错误会直接提示行号。sshd -T:输出所有生效参数,适合确认某个参数到底有没有被覆盖。ssh -G 别名:查看客户端config解析后的完整连接参数。
sshd_config核心参数详解与推荐配置
服务端文件控制登录方式、端口、超时、用户权限等,下面按使用频率拆开说明。
端口与监听参数
Port 22:默认端口,修改为高位端口(如Port 22026)能减少自动扫描,但不等于安全。ListenAddress 0.0.0.0:设置监听地址,限制内网访问时可设为内网IP。AddressFamily any:IPv4/IPv6都监听,可改为inet只监听IPv4。
登录与认证参数
PermitRootLogin no:禁止root直接登录,多数云服务器初始允许root密码登录,建议改成prohibit-password或no。PasswordAuthentication yes:默认允许密码登录,想只允许密钥登录,改为no。PubkeyAuthentication yes:开启公钥认证,通常保持开启。AuthorizedKeysFile .ssh/authorized_keys:指定公钥存放文件。PermitEmptyPasswords no:必须禁止空密码。MaxAuthTries 6:单次连接最多尝试认证次数,超过断开。LoginGraceTime 2m:认证宽限时间,超时未完成认证就断开。
连接保活与超时
ClientAliveInterval 0:服务端每隔多少秒发送心跳,设为60
可避免长时间无操作被中间设备断连。
ClientAliveCountMax 3:心跳无响应多少次后断开。TCPKeepAlive yes:系统级TCP保活,一般保持开启。
用户与权限限制
AllowUsers alice bob:只允许列出的用户登录,优先级高,适合白名单。DenyUsers guest:拒绝指定用户。AllowGroups ssh-users:只允许组内用户登录。DenyGroups no-ssh:拒绝组内用户登录。- 多个AllowUsers和DenyUsers同时存在时,较严格的匹配会生效,需避免配置冲突。
sshd_config常用参数对比表
| 参数 | 默认值 | 常见调整 | 作用场景 |
|---|---|---|---|
| Port | 22 | 22026/自定义 | 减少扫描、规避冲突 |
| PermitRootLogin | yes | prohibit-password/no | 关闭root密码登录 |
| PasswordAuthentication | yes | no | 强制密钥登录 |
| PubkeyAuthentication | yes | yes | 保持密钥认证 |
| ClientAliveInterval | 0 | 60 | 防止连接空闲断开 |
| MaxAuthTries | 6 | 3 | 降低暴力尝试次数 |
| UseDNS | yes | no | 加快连接速度 |
| AllowUsers | 无 | 指定用户 | 白名单访问 |
云服务器ssh配置文件修改端口后连接不上的排查思路
改完端口连不上,多数不是语法错误,而是链路没打通,按下面顺序查:
- 先别断当前会话,另开终端,用
ssh -p 新端口 用户@IP测试,确认是连接被拒绝还是超时。 - 查看sshd是否重启成功:
systemctl status sshd,有些发行版服务名是ssh,不是sshd。 - 防火墙放行:
firewall-cmd --add-port=22026/tcp --permanent && firewall-cmd --reload,或者ufw allow 22026/tcp。 - 云服务器安全组:在控制台添加入方向TCP新端口,否则包到不了主机。
- SELinux端口上下文:使用
semanage port -a -t ssh_port_t -p tcp 22026,没有semanage用yum install policycoreutils-python-utils。 - 检查
Port是否重复配置,sshd_config中后出现的参数会覆盖前面的,如果残留两行Port 22和Port 22026,默认行为可能不一致,建议只保留一行。
禁用密码登录只允许密钥的操作步骤
这是最常用的场景,顺序错了会导致被锁在服务器外。
- 本地生成密钥对:
ssh-keygen -t ed25519 -C "备注"。 - 上传公钥:
ssh-copy-id -p 22 用户@服务器IP,输一次密码完成追加。 - 测试密钥登录:
ssh -p 22 用户@服务器IP,确认不用密码能进。 - 编辑
/etc/ssh/sshd_config:把PasswordAuthentication改为no,顺手把PermitRootLogin设为prohibit-password或no。 - 检查语法:
sshd -t,确认没有报错。 - 重启服务:
systemctl restart sshd。 - 保留当前会话,新开终端再验证一次密码登录已不可用。

~/.ssh/config客户端配置文件详解:按主机别名简化连接
服务端配置管的是“别人连你”,客户端config管的是“你连别人”,它最大的实用价值是把一堆参数绑定到别名上。
一个典型例子:
Host web
HostName 203.0.113.10
User deploy
Port 22026
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 30
ServerAliveCountMax 3
保存后,直接执行ssh web就等价于ssh -p 22026 -i ~/.ssh/id_ed25519 deploy@203.0.113.10。
客户端config常用参数
Host:别名,支持通配符,如Host .internal。HostName:真实域名或IP。User:登录用户名。Port:目标端口。IdentityFile:指定私钥路径。ServerAliveInterval:客户端发心跳秒数,比服务端参数更适合普通用户。ProxyJump:跳板机,如ProxyJump bastion。StrictHostKeyChecking:accept-new可省去首次确认指纹的交互。IdentitiesOnly yes:防止SSH agent把所有私钥都试一遍。
mac ssh配置文件位置与权限注意事项
macOS作为客户端时,~/.ssh/config的位置和Linux一致,在终端执行open ~/.ssh/config即可编辑,避免使用文本编辑工具保存为rtf或带扩展名,文件必须是无扩展名纯文本。
macOS作为服务端时,需要在“共享”中开启“远程登录”,服务端主配置同样位于/etc/ssh/sshd_config,但很多系统级定制由/etc/ssh/sshd_config.d/下的plist或配置片段注入,修改前先看sshd -T确认当前值。
sshd_config和ssh_config的区别,一张表看明白
| 维度 | sshd_config | ~/.ssh/config |
|---|---|---|
| 作用对象 | 服务端sshd进程 | 客户端ssh命令 |
| 路径 | /etc/ssh/sshd_config | ~/.ssh/config |
| 修改生效 | 重启sshd服务 | 保存后立即生效 |
| 典型参数 | Port、PermitRootLogin、PasswordAuthentication | HostName、User、IdentityFile、ProxyJump |
生效顺序与测试命令:改完一定要验证
服务端修改后必须重启服务:systemctl restart sshd,部分老版本用

service sshd restart,客户端config无需重启,保存即生效。
修改服务端配置时,建议遵循“先测试语法、再重启、保留当前会话”的顺序,行业共识认为,绝大多数SSH配置事故都发生在重启服务前没有做sshd -t语法检查,或者没有保留一个已经登录的会话用于回滚。
语法检查命令:
sshd -t:只检查语法。sshd -T | grep -E 'port|passwordauthentication|permitrootlogin':查看最终生效的关键参数。
客户端查看解析结果:
ssh -G web:把别名web展开成最终参数,适合确认config是否被正确读取。
配置层级和Include:
- 新版sshd_config支持
Include /etc/ssh/sshd_config.d/.conf,可以把自定义参数放到独立文件里,减少主文件改动。 - 客户端config也支持
Include,但要注意路径展开和权限。
SSH配置文件本身并不复杂,服务端管访问控制,客户端管连接参数,只要记住“改服务端先测语法、保留会话再重启,改客户端保存即生效”,多数连接问题和登录策略调整都能自己处理,日常运维中优先做好密钥登录、禁用root密码、限制用户和来源IP,比单纯修改端口更有效。
Q&A
ssh配置文件修改后需要重启服务吗?
服务端/etc/ssh/sshd_config修改后必须重启sshd服务,执行systemctl restart sshd,仅用systemctl reload sshd不一定加载所有参数,客户端~/.ssh/config修改后保存立即生效,不需要重启任何服务,服务端还可用sshd -t先检查语法再重启。
ssh配置文件中如何限制只有特定IP可以登录?
sshd_config本身不直接过滤IP,主流做法是配合防火墙或TCP Wrappers,例如用firewall-cmd或ufw只放行指定来源IP访问22端口,也可以使用Match Address段落针对来源地址覆盖参数,如Match Address 192.168.1.0/24后加PasswordAuthentication yes,但这需要sshd版本支持且理解优先级,最简单且明确的方案是在云安全组或防火墙层限制来源IP。
sshd_config和ssh_config有什么区别?
sshd_config是OpenSSH服务端守护进程sshd的配置文件,默认位于/etc/ssh/sshd_config,控制端口、root登录、密码认证、用户限制等。ssh_config是客户端ssh命令的系统级配置,默认位于/etc/ssh/ssh_config;用户级配置则是~/.ssh/config,优先于系统级,两者面向不同方向:一个管接收入站连接,一个管发起出站连接,多数个人电脑和云服务器的日常连接管理只改~/.ssh/config即可,服务器访问控制则改sshd_config。
