1.
概述与准备工作
- 目标:快速定位跳板机(跳板机 = Bastion host)转发失败原因并实现稳定重连。
- 必备信息:跳板机IP/域名、目标服务IP/端口、本地转发端口、SSH用户与密钥、跳板机防火墙规则、两端网络连通性工具(ping/traceroute/tcpdump)。
- 工具准备:在本地和跳板机安装ssh、ssh-keygen、netcat(nc)、sshd、iptables/ufw、autossh、systemd。
2.
常见故障诊断流程(总步骤)
- 步骤一:确认基础连通性(ping/Traceroute),若ICMP不可达改用tcp端口检测(nc -vz host port)。
- 步骤二:验证SSH能否建立(ssh -vvv user@bastion),观察认证/超时/拒绝提示。
- 步骤三:检查端口转发是否成功(本地通过telnet/ nc 访问转发端口)。
- 步骤四:查看跳板机和目标服务日志(/var/log/auth.log、/var/log/secure、目标服务日志)。
3.
网络链路检查详细步骤
- 在本地执行:ping bastion、traceroute bastion、nc -vz bastion 22;若失败,检查本地路由和DNS(dig/domain解析)。
- 在跳板机执行:ping 目标服务、traceroute 目标服务、nc -vz target_ip target_port;若内部不可达,检查内网路由、VPC安全组、NAT网关。
- 使用tcpdump抓包(sudo tcpdump -i eth0 host
and port )定位是否有SYN到达或RST返回。
4.
SSH认证与权限排查(常见导致连接失败)
- 检查密钥权限:~/.ssh 权限应为700,私钥600(chmod 700 ~/.ssh; chmod 600 ~/.ssh/id_rsa)。
- 本地ssh -vvv user@bastion,定位是密钥被拒绝(Permission denied)还是超时。若被拒绝,确认公钥已加入跳板机 ~/.ssh/authorized_keys 且无多余字符。
- 若使用代理跳转(ProxyJump/ProxyCommand),检查中间跳转主机链路与配置正确,避免双重认证失败。
5.
端口转发配置检查(本地/远程/动态)
- 本地转发示例:ssh -L 8080:target:80 user@bastion;验证本地 127.0.0.1:8080 可访问目标。
- 远程转发示例:ssh -R 9090:localhost:3000 user@bastion;在跳板上用 nc localhost 9090 测试是否转发到本地。
- 若使用GatewayPorts,需要在 /etc/ssh/sshd_config 中设置 GatewayPorts yes 并重启sshd;检查端口是否被监听(ss -tlnp | grep 8080)。
6.
防火墙、NAT与路由策略核对
- 跳板机防火墙(iptables/ufw/firewalld):列出规则(sudo iptables -S 或 sudo ufw status)。允许SSH与转发端口的入/出规则。
- 云环境安全组:确认跳板机与目标服务间的安全组规则允许相互访问。若使用NAT/负载均衡,检查源地址转换是否影响连接。
- MTU与碎包:若大包传输失败,尝试降低MTU(ip link set dev eth0 mtu 1400)并测试。
7.
中断重连与持久隧道实操(autossh/systemd/KeepAlive)
- 简单保持:在ssh配置中加入 ServerAliveInterval 30、ServerAliveCountMax 3,能检测并断开死连接。
- 使用autossh:安装 autossh 后用 autossh -M 20000 -f -N -L 8080:target:80 user@bastion。参数说明:-M 心跳端口,-f 后台,-N 不执行远程命令。
- systemd服务管理:创建 /etc/systemd/system/ssh-tunnel.service,配置 ExecStart 为 autossh 命令,Restart=always,RestartSec=10;然后 systemctl daemon-reload && systemctl enable --now ssh-tunnel。
8.
日志、监控与自动恢复脚本
- 日志查看:/var/log/auth.log、/var/log/syslog,定位认证失败、连接被拒绝或 KeepAlive 导致断开。
- 监控策略:使用简单脚本定期检测端口(nc -z localhost 8080),若失败发送告警并重启 systemd 服务。
- 自动恢复示例脚本(/usr/local/bin/check_tunnel.sh):检查nc结果,不通则 systemctl restart ssh-tunnel;将脚本加入crontab每分钟执行或用监控系统(Prometheus + Alertmanager)。
9.
问:连接失败时最先应该做哪三步?
- 答:1)确认本地到跳板机的基本连通性(ping/traceroute/nc -vz bastion 22);2)用 ssh -vvv 获取详细认证与协商日志,定位是超时、密钥拒绝还是版本不兼容;3)在跳板机上验证到目标服务的连通性(ping/traceroute/nc -vz target port)并查看防火墙规则。
10.
问:如何保证跳板机隧道在网络波动后自动恢复?
- 答:推荐结合三层策略:1)SSH内建KeepAlive(ServerAliveInterval/CountMax)减少死连接;2)使用autossh自动重建隧道并监控心跳端口;3)用systemd托管隧道进程(Restart=always)并配置健康检查脚本以自动重启。
11.
问:常见误区与安全注意事项有哪些?
- 答:误区:频繁放宽防火墙以“方便测试”会暴露风险;使用密码认证而非密钥增加被暴力破解风险;不记录日志导致难以排查。注意事项:仅开放必要端口、使用密钥并加密私钥、限制来源IP/安全组、定期轮换密钥并审计authorized_keys,以及限制Jump用户权限(使用sshd Match与ForceCommand等)。
来源:跳板机 转发 常见问题排查技巧包括连接失败与中断重连处理