需求
FTTH 光猫无公网IP,其下挂一台服务器。为了能让外部用SSH来访问它,通常方法有很多,比如使用内网穿透工具实现,但都要安装其他软件,如 frp、ngrok 等。
本方法的特点是不需要额外安装软件,但需要一台中继服务器。
实现
先在中继服务器配置端口转发
先在中继服务器上配置SSH允许GatewayPorts:
vim /etc/ssh/sshd_config
# 修改 AllowTcpForwarding yes
# 修改 GatewayPorts yes
# 重启 sshd
再在内网服务器建立反向隧道
-
实现免密登录:
ssh-keygen -t rsa # 生成密钥 ssh-copy-id 中继服务器用户名@中继服务器IP # 将密钥传送到中继服务器 -
建立 ssh 反向隧道:
ssh -fCNTR 0.0.0.0:2222:localhost:22 中继服务器用户名@中继服务器IP其中:
-2222 中继服务器的映射端口
-22 内部服务器的服务端口,ssh 是22,其他服务只要是 TCP 的都可以转发,比如想转发 RDP 就用3389。UDP 的不能转发。
-R 建立反向隧道
-f 后台执行
-C 压缩数据包
-N 不执行命令
-T 无TTY
现在外部就可以访问了
使用:
ssh 内部服务器用户名@中继服务器IP -p 2222
问题排查
如果出现无法访问,采用以下思路排查:
- 保证服务器之间使用ssh能正常打通,可以通过使用 ssh -v 查看详细信息,可以看到:
debug1: remote forward success for: listen 2222, connect localhost:22 - 在中继服务器使用 netstat -tuln | grep 2222 查看端口
- 是否防火墙限制:sudo ufw status 或 sudo iptables -L
- 采用密钥代替密码方式
- 检查用户名权限
最后还有一步
当能正常访问后,写入 crontab 实施保活:
crontab -e
# 写入
@reboot /usr/bin/ssh -fCNTR 0.0.0.0:2222:localhost:22 中继服务器用户名@中继服务器IP
@reboot /usr/bin/autossh -M 0 -fCNTR 0.0.0.0:2222:localhost:22 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 中继服务器用户名@中继服务器IP
其中参数和ssh 反向隧道命令中的一致。这样当断网或重启之后,后续还能正常使用。
