概述

SSH(Secure Shell)是Linux系统远程管理的核心服务,正确理解其配置文件结构和服务管理机制对系统管理至关重要。本文将从服务架构入手,详细记录SSH配置的完整流程。

SSH服务架构

SSH vs SSHD:核心概念区分

这两个概念容易混淆,先澄清一下:

  • ssh:客户端程序

    • 位置:/usr/bin/ssh
    • 作用:从本地连接远程服务器
    • 配置文件:/etc/ssh/ssh_config(客户端行为配置)
    • 使用示例:ssh user@server
  • sshd:服务端守护进程(SSH Daemon)

    • 位置:/usr/sbin/sshd
    • 作用:在服务器上监听连接请求,提供SSH服务
    • 配置文件:/etc/ssh/sshd_config(服务端行为配置)
    • systemd服务:sshd.servicessh.service(取决于发行版)
    • 进程模式:主进程监听,每个连接fork出独立的sshd进程

简单记忆:ssh是"拨号器",sshd是"接听器"。我们这次要配置的是服务器端的"接听器"。

⚠️ 常见混淆点

很多人第一次看到 ssh.service时会想:"客户端也需要服务?"

实际上ssh.service仍然是服务端SSH守护进程,只是systemd服务的命名简化了。

# 无论服务名叫什么,查看进程都是一样的
ps aux | grep sshd
# root  1234  /usr/sbin/sshd -D    # 这个就是SSH服务端守护进程

# 客户端ssh是普通程序,不需要常驻服务
which ssh        # /usr/bin/ssh
ssh --version    # 只是个命令行工具

记住:SSH客户端不需要服务,只有SSH服务端才需要守护进程

配置文件层次结构

/etc/ssh/
├── sshd_config              # 主配置文件
├── sshd_config.d/           # 配置片段目录(较新系统)
│   ├── 50-cloud-init.conf  # cloud-init配置
│   └── custom.conf          # 自定义配置
├── ssh_config               # 客户端配置
├── ssh_host_*_key           # 服务器私钥
└── ssh_host_*_key.pub       # 服务器公钥

核心配置文件详解

/etc/ssh/sshd_config

这是SSH服务的主配置文件,控制SSH守护进程的所有行为。

关键配置项

# 关键安全配置
Port your_custom_port              # 自定义端口
PermitRootLogin no                 # 禁止root登录
AllowUsers yourusername            # 用户白名单
PasswordAuthentication no          # 禁用密码认证
PubkeyAuthentication yes           # 启用密钥认证
MaxAuthTries 3                     # 认证尝试限制
ClientAliveInterval 300            # 连接保活设置
ClientAliveCountMax 2
X11Forwarding no                   # 禁用不需要的功能

# 根据需求保留的功能
AllowTcpForwarding yes             # 如需端口转发
PermitTunnel yes                   # 如需隧道功能

配置优先级机制

现代Linux系统支持模块化配置:

  1. 主配置/etc/ssh/sshd_config
  2. Include指令:动态包含其他配置文件
  3. 配置目录/etc/ssh/sshd_config.d/*.conf
# 在sshd_config中常见的Include指令
Include /etc/ssh/sshd_config.d/*.conf

配置修改实践

步骤1:定位当前配置

# 查看当前端口配置
sudo grep -n "Port" /etc/ssh/sshd_config

# 查看所有有效配置(包括默认值)
sudo sshd -T | grep port

# 检查配置文件包含关系
sudo grep -n "Include" /etc/ssh/sshd_config

步骤2:安全修改配置

# 备份原配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

# 编辑配置文件
sudo vim /etc/ssh/sshd_config

# 修改示例:将端口从22改为2022
# 找到 #Port 22 或 Port 22 行
# 修改为 Port 2022

步骤3:配置验证

# 语法检查(关键步骤!)
sudo sshd -t

# 如果有错误会显示具体问题
# 例如:/etc/ssh/sshd_config line 15: Bad configuration option: Prot

步骤4:应用配置

# 重启SSH服务
sudo systemctl restart sshd

# 检查服务状态
sudo systemctl status sshd

# 验证端口监听
sudo ss -tlnp | grep sshd

安全注意事项

避免锁死系统

  1. 保持当前连接:修改SSH配置时永远不要关闭当前SSH会话
  2. 语法验证sshd -t 是必须步骤,不能跳过
  3. 测试新连接:在新终端验证配置成功后再关闭旧连接
  4. 防火墙同步:修改端口时确保防火墙规则同步更新

防火墙配置

# UFW示例
sudo ufw allow 2022/tcp
sudo ufw delete allow 22/tcp

# iptables示例  
sudo iptables -A INPUT -p tcp --dport 2022 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT

常见问题排查

配置不生效

# 检查配置是否真正加载
sudo sshd -T | grep -i port

# 检查是否有冲突的配置文件
find /etc/ssh/ -name "*.conf" -exec grep -l "Port" {} \;

服务启动失败

# 查看详细错误信息
sudo journalctl -u sshd -f

# 检查配置文件权限
ls -la /etc/ssh/sshd_config
# 应该是:-rw-r--r-- root root

连接被拒绝

# 确认服务正在运行
sudo systemctl is-active sshd

# 检查网络监听
sudo netstat -tlnp | grep sshd

# 测试本地连接
ssh -p 2022 localhost

高级配置技巧

多端口监听

# 可以同时监听多个端口(过渡期间有用)
Port 22
Port 2022

基于用户的配置

# 在sshd_config末尾添加
Match User deploy
    Port 2022
    PasswordAuthentication no
  
Match User admin  
    Port 22
    AllowTcpForwarding yes

Include模式的模块化配置

# 在 /etc/ssh/sshd_config.d/custom.conf
Port 2022
PasswordAuthentication no
PubkeyAuthentication yes

最佳实践总结

  1. 配置前备份:任何修改前都要备份原文件
  2. 语法验证sshd -t 是强制步骤
  3. 逐步验证:保持原连接,新建连接测试
  4. 日志监控:修改后观察 journalctl -u sshd 的输出
  5. 文档记录:记录每次修改的原因和内容

总结

SSH配置看似简单,但细节决定成败。理解配置文件的层次结构、掌握安全的修改流程、养成验证的习惯,是每个Linux管理员的必备技能。

记住:永远不要在没有backup连接的情况下修改SSH配置,这是避免系统锁死的黄金法则。