SSH 内网穿透
由于存在需要将没有公网 IP 的服务部署到公网下的需求,因此使用 SSH 的端口转发功能,将运行在本地的服务转发到公网服务器的端口。
本地转发
定义:将本地某个端口的通讯数据转发到目标主机的对应端口。例如访问本地主机的端口A,相当于访问目标主机的端口B。
作用:将服务器指定端口转发至本地端口
1 | ssh -N -L [本地IP:]本地端口:目标服务器IP:目标端口 用户名@SSH服务器 |
情形:服务端的某个端口无法直接访问,可以使用 ssh 突破限制。
远程转发
将本地端口转发至服务器指定端口
1 | ssh -N -R [目标服务器IP:]目标服务器端口:本地IP:本地端口 用户名@SSH服务器 |
情形:服务端无可直接访问 IP,在服务端执行以上指令。
保持运行
SSH 链接不稳定,需要
保持 SSH 会话活跃
为了确保 SSH 会话持续有效,可以使用 ServerAliveInterval 选项ssh -o ServerAliveInterval=60 -N -R 1234:localhost:5678 user@myhost.gtwang.org
这会在每 60 秒向服务器发送一次心跳信号,防止连接因超时而断开。
选项含义
-L 表示使用本地转发建立 SSH 隧道
-N 表示只建立 SSH 隧道,而不打开远程主机的 shell
-f 表示在后台运行 SSH 隧道,即使关闭了会话也不会消失
-g 表示在建立隧道时开启网关功能,在只写端口号的情形下,不仅监听回环地址,而是所有地址。
-R 使用远程端口转发创建 SSH 隧道
AutoSSH
确实,使用 SSH 隧道进行远程转发时,特别是在没有固定 IP 的网络环境中,可能会遇到连接不稳定的问题。这通常是因为网络波动、IP 地址变化或防火墙规则等原因导致隧道意外断开。使用 autossh 是一个常见的解决方案,它可以自动重连 SSH 会话,从而保持隧道的持续有效性。
使用 autossh 的基本步骤
安装
autossh:- 在大多数 Linux 发行版中,可以通过包管理器安装:
1
2sudo apt-get install autossh # Debian/Ubuntu
sudo yum install autossh # CentOS/RHEL
- 在大多数 Linux 发行版中,可以通过包管理器安装:
使用
autossh创建隧道:- 使用
autossh命令代替ssh命令来启动隧道。例如:
- 使用
1 | autossh -f -N -R 1234:localhost:5678 user@server.com |
- 这里的参数与普通
ssh命令相同,但autossh会监控连接并在需要时自动重连。
配置环境变量(可选):
- 为了提高稳定性,可以设置一些环境变量:
1
2export AUTOSSH_GATETIME=0
export AUTOSSH_POLL=60 - 这些设置帮助
autossh更快地检测到失去的连接并进行重连。
- 为了提高稳定性,可以设置一些环境变量:
检查连接:
- 可以使用
ps aux | grep autossh命令查看autossh进程是否在运行。
- 可以使用
通过使用 autossh,可以显著提高 SSH 隧道在不稳定网络环境中的可靠性。
配置文件
其实,如果想要能够正常的使用 ssh 端口转发,我们还需要做出正确的配置才行,之前一直没有说明,是因为 openssh 默认的配置就是支持端口转发的。
如果想要 ssh 端口转发能够正常工作,需要在ssh服务端的配置文件中将 AllowTcpForwarding 的值设置为yes。
此处所指的 ssh 服务端即 ssh 隧道中的一头,扮演 ssh 服务端角色的那台主机。
当隧道建立以后,经过一段时间后,ssh 隧道链接可能会被断开,这有可能是因为 ssh 客户端和 ssh 服务端长时间没有通讯,于是 ssh 服务端主动断开了链接,如果想要解决这个问题,可以在 ssh 服务端进行配置,调整 ssh 服务端的 ClientAliveInterval 配置和 ClientAliveCountMax 配置即可。