OpenSSH 服务配置与会话保活完全指南
一、/etc/ssh/sshd_config
配置机制
1. 配置文件基础
-
文件作用
OpenSSH 服务器 (sshd
) 的主配置文件,控制连接、认证、端口转发等行为。 -
加载与生效
- 修改后需重启服务:
sudo systemctl restart sshd # Systemd 系统 sudo service ssh restart # SysVinit 系统
- 检查语法错误:
sudo sshd -t
- 修改后需重启服务:
-
语法规则
- 每行一个参数,格式
参数名 值
(如Port 22
) #
开头为注释,默认配置通常被注释作为参考- 参数名区分大小写(全大写或驼峰式)
- 每行一个参数,格式
二、核心参数详解与配置
1. 连接控制
参数 | 说明 | 推荐值 |
---|---|---|
Port 22 | SSH 监听端口,多端口可写多行 | 非默认端口(如 2222 ) |
ListenAddress | 绑定 IP,0.0.0.0 监听所有接口 | 内网 IP(如 192.168.1.1 ) |
MaxStartups | 并发未认证连接数,格式 起始:拒绝率:最大 | 10:30:100 |
MaxSessions | 单连接允许的会话数 | 5-10 |
2. 安全认证
参数 | 说明 | 推荐值 |
---|---|---|
PermitRootLogin | 禁止 root 直接登录 | no 或 prohibit-password |
PasswordAuthentication | 禁用密码登录,强制密钥认证 | no |
AllowUsers | 用户白名单(支持 user@ip 格式) | 限制必要用户 |
UseDNS | 禁用反向解析加速登录 | no |
3. 功能与转发
参数 | 说明 | 推荐值 |
---|---|---|
AllowTcpForwarding | 禁止端口转发减少风险 | no |
X11Forwarding | 启用图形界面转发 | yes |
GatewayPorts | 远程转发绑定到 0.0.0.0 | no |
4. 会话与日志
参数 | 说明 | 推荐值 |
---|---|---|
TCPKeepAlive | 启用 TCP 层保活机制 | yes |
LogLevel | 日志详细程度 | INFO |
PrintMotd | 禁用登录后 MOTD 信息 | no |
三、SSH 会话长时间保活配置
1. 服务端配置 (sshd_config
)
# 保活探针(服务端主动检测)
ClientAliveInterval 60 # 每 60 秒发送保活包
ClientAliveCountMax 7200 # 允许 7200 次无响应(约 5 天)
TCPKeepAlive yes # 启用 TCP 保活# 系统级 TCP 调优(/etc/sysctl.conf)
net.ipv4.tcp_keepalive_time = 300 # 空闲 300 秒后检测
net.ipv4.tcp_keepalive_intvl = 60 # 检测间隔 60 秒
net.ipv4.tcp_keepalive_probes = 5 # 检测 5 次后断开
2. 客户端配置 (~/.ssh/config
)
Host *ServerAliveInterval 30 # 客户端每 30 秒发送保活包ServerAliveCountMax 0 # 无限次重试ControlMaster auto # 连接复用ControlPath ~/.ssh/control-%r@%h:%pControlPersist 1h # 保持连接池 1 小时
3. 应对网络设备超时
场景 | 服务端配置 | 客户端配置 |
---|---|---|
企业防火墙/NAT | ClientAliveInterval 30 | ServerAliveInterval 25 |
移动网络 | ClientAliveCountMax 2880 | TCPKeepAlive yes |
4. 增强工具与技巧
-
终端复用工具
# 使用 tmux 防止断连 tmux new -s mysession # 创建会话 tmux attach -t mysession # 恢复会话
-
自动重连脚本
#!/bin/bash while true; dossh -o ServerAliveInterval=30 user@hostsleep 10 done
四、完整配置示例
/etc/ssh/sshd_config
# 基础安全
Port 2222
ListenAddress 192.168.1.100
PermitRootLogin no
PasswordAuthentication no
UseDNS no# 会话保活
ClientAliveInterval 60
ClientAliveCountMax 7200
TCPKeepAlive yes# 功能限制
AllowTcpForwarding no
X11Forwarding yes
MaxSessions 5# 资源控制
MaxStartups 10:30:100
五、调试与验证
1. 连接状态检查
# 查看活跃会话
sudo netstat -tnpa | grep sshd# 实时监控日志
tail -f /var/log/auth.log | grep sshd
2. 保活测试
# 客户端详细输出
ssh -vvv user@host
# 观察日志中的保活包:
# debug3: Received SSH2_MSG_IGNORE
3. 网络模拟测试
# 临时阻断 SSH 流量(测试后清除规则)
sudo iptables -A INPUT -p tcp --dport 2222 -j DROP
sudo iptables -D INPUT -p tcp --dport 2222 -j DROP
六、安全与资源权衡
-
风险控制
- 避免将
ClientAliveCountMax
设为无限大(0
) - 结合防火墙限制 SSH 访问源 IP
- 避免将
-
资源管理
- 通过
MaxSessions
和MaxStartups
限制并发 - 监控
/var/log/secure
异常登录尝试
- 通过
-
协议更新
- 定期升级 OpenSSH 版本修复漏洞
- 禁用旧版协议:
Protocol 2
通过合理配置服务端参数、客户端策略及系统级调优,可实现 SSH 会话的长时间稳定连接,同时兼顾安全性与资源效率。