微信优化

weixinyouhua

ssh配置文件详解,ssh配置文件在哪?

2026-09-14 23:52:21

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

    ssh配置文件详解,ssh配置文件在哪?

    可避免长时间无操作被中间设备断连。

  • 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,默认行为可能不一致,建议只保留一行。

禁用密码登录只允许密钥的操作步骤

这是最常用的场景,顺序错了会导致被锁在服务器外。

  1. 本地生成密钥对:ssh-keygen -t ed25519 -C "备注"。
  2. 上传公钥:ssh-copy-id -p 22 用户@服务器IP,输一次密码完成追加。
  3. 测试密钥登录:ssh -p 22 用户@服务器IP,确认不用密码能进。
  4. ssh配置文件详解,ssh配置文件在哪?

  5. 编辑/etc/ssh/sshd_config:把PasswordAuthentication改为no,顺手把PermitRootLogin设为prohibit-password或no。
  6. 检查语法:sshd -t,确认没有报错。
  7. 重启服务:systemctl restart sshd。
  8. 保留当前会话,新开终端再验证一次密码登录已不可用。

~/.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,部分老版本用

ssh配置文件详解,ssh配置文件在哪?

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。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待