使用 ssh 反向代理实现内网穿透

需求

FTTH 光猫无公网IP,其下挂一台服务器。为了能让外部用SSH来访问它,通常方法有很多,比如使用内网穿透工具实现,但都要安装其他软件,如 frp、ngrok 等。
本方法的特点是不需要额外安装软件,但需要一台中继服务器。

实现

先在中继服务器配置端口转发

先在中继服务器上配置SSH允许GatewayPorts:

vim /etc/ssh/sshd_config
# 修改 AllowTcpForwarding yes
# 修改 GatewayPorts yes
# 重启 sshd

再在内网服务器建立反向隧道

  1. 实现免密登录:

    ssh-keygen -t rsa  # 生成密钥
    ssh-copy-id 中继服务器用户名@中继服务器IP  # 将密钥传送到中继服务器
  2. 建立 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

问题排查

如果出现无法访问,采用以下思路排查:

  1. 保证服务器之间使用ssh能正常打通,可以通过使用 ssh -v 查看详细信息,可以看到:
    debug1: remote forward success for: listen 2222, connect localhost:22
  2. 在中继服务器使用 netstat -tuln | grep 2222 查看端口
  3. 是否防火墙限制:sudo ufw status 或 sudo iptables -L
  4. 采用密钥代替密码方式
  5. 检查用户名权限

最后还有一步

当能正常访问后,写入 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 反向隧道命令中的一致。这样当断网或重启之后,后续还能正常使用。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注