利用代理服务器访问内网 - 反向 SSH 隧道(反向端口转发)
一、SSH隧道连接 与 VPN 区别:
- SSH 隧道(端口转发)
SSH 隧道主要是基于 SSH 协议,它是在应用层建立的安全通道。在进行端口转发时,它是将特定端口的流量通过 SSH 加密连接进行转发,是一种 “端口级别的代理”。
- VPN(虚拟专用网络)
VPN 工作在网络层,它创建的是一个虚拟的专用网络连接。它会对整个网络连接的数据包进行封装和加密,加密的是从客户端到目标网络之间的所有网络通信数据包,包括各种应用层协议的数据包,而不仅仅是特定端口的流量。
二、服务器环境介绍
一台内网的服务器A,一台远程的服务器B,本人C与这两台服务器所在地均不同,现在C想要通过B访问A,两台服务器均为ubuntu系统,C为windows系统。
因为A处于内网,B无法直接访问A,因此这里使用A主动向B建立连接来实现:B代理C访问A的功能
三、具体步骤
1. A 向 B 建立反向 SSH 隧道
-
在 A 服务器上,使用 SSH 反向端口转发,将 A 的某个端口转发到 B 服务器的端口
ssh -NCfR 8059:localhost:22 root@120.26.44.100 -p 22
-
此命令的主要目的是建立一个从远程服务器 120.26.44.100 的 8059 端口到本地服务器的 22 端口的反向隧道。
-
-N 表示不执行远程命令,仅用于端口转发。
-
-C 表示启用压缩,可提高数据传输效率。
-
-f 表示将 SSH 连接放入后台运行。
-
-R 表示进行远程端口转发,将远程的 8059 端口绑定到本地的 localhost:22。
-
root@120.26.44.100 是远程服务器的用户名和 IP 地址。
-
-p 22 表示远程服务器的 SSH 服务监听的端口是 22。
-
最后的 -p 22 表示要连接到 root@120.26.44.100 的 22 端口。因为 -R 8059:localhost:22 是用于建立远程端口转发的,而 -p 22 是确保 ssh 连接本身使用正确的端口来与远程服务器建立初始连接。(也就是说8059:localhost:22这段是端口银映射的配置信息,需要通过ssh服务发送到120.26.44.100服务器上,而120.26.44.100服务器的ssh功能是由端口22实现的,因此需要指定这条ssh连接命令需要使用120.26.44.100的22端口,当你不使用 -p 选项指定端口时,ssh 会默认尝试连接到远程服务器的 22 端口。这是因为 22 是 SSH 服务的标准端口,大多数 ssh 命令在没有指定端口的情况下,会自动使用 22 端口进行连接。)
2. B 服务器转发请求
-
一旦 A 服务器成功与 B 服务器建立反向 SSH 隧道,所有连接到 B 的 8059 端口的请求都将转发到 A 服务器的 22 端口。这时,C 只需要连接到 B 服务器的 8059 端口,就可以访问 A。
-
C 使用 SSH 客户端(如
Xshell
)连接 B 服务器的 8059 端口:- C先远程登陆B服务器
- 在B服务器中输入命令
ssh A的用户名@localhost -p 8059
3. 确保 B 服务器允许反向 SSH 连接
为了确保反向 SSH 隧道能够正常工作,需要确保 B 服务器的 SSH 配置允许反向端口转发。
- 编辑 B 服务器上的
/etc/ssh/sshd_config
文件,确保以下配置项被正确设置:AllowTcpForwarding yes GatewayPorts yes
- 重启 B 服务器上的 SSH 服务:
sudo service sshd restart
四、保持ssh连接不断地方法
为了确保 A 和 B 之间的 SSH 连接在没有数据传输的情况下保持持续不断,即使没有任何流量或者 C 不连接 B,你可以采取以下几种方法来确保 SSH 连接不会断开。
方法 1:使用 SSH 的 KeepAlive 参数
SSH 协议本身有一些选项可以用于防止连接超时或断开。你可以通过设置 ServerAliveInterval 和 ServerAliveCountMax 来保持 SSH 连接活动,即使没有数据传输。
设置 A 服务器的 SSH 配置(/etc/ssh/sshd_config
):
-
打开 A 服务器上的 SSH 配置文件
/etc/ssh/sshd_config
,然后确保以下两个参数被设置:ServerAliveInterval 60 ServerAliveCountMax 5
ServerAliveInterval
:指定服务器每隔多少秒发送一个空的"心跳"数据包到客户端,以保持连接活动。这里设置为 60 秒,即每 60 秒发送一个心跳包。ServerAliveCountMax
:指定如果客户端没有响应,最多允许多少次未响应的心跳包。在这里,设置为 5,意味着在 5 次心跳未响应后才会断开连接。
-
保存配置并重启 SSH 服务:
sudo systemctl restart sshd
设置 B 服务器的 SSH 配置(/etc/ssh/sshd_config
):
同样地,在 B 服务器上,你也可以确保以下配置项开启:
TCPKeepAlive yes
这会确保 B 服务器通过 TCP 层保持连接活动。
然后重启 B 服务器上的 SSH 服务:
sudo systemctl restart sshd
设置客户端 A 上的 SSH 配置(/etc/ssh/ssh_config
):
如果你想确保 A 服务器到 B 的连接不会断开,也可以在 A 服务器的 SSH 客户端配置文件 /etc/ssh/ssh_config
中设置相应的参数。
-
打开客户端配置文件:
sudo nano /etc/ssh/ssh_config
-
添加以下配置:
ServerAliveInterval 60 ServerAliveCountMax 5
这样,A 服务器会每 60 秒向 B 发送一个"心跳"请求,以确保连接活跃。
-
保存并退出。
总结: 通过配置
ServerAliveInterval
和ServerAliveCountMax
,即使没有数据传输,SSH 连接也会持续保持。
方法 2:使用 tmux 或 screen 保持会话
如果你希望在 A 和 B 之间的 SSH 连接中断时能够恢复会话,可以使用 tmux 或 screen 等工具,这样即使 SSH 会话被断开,仍然可以保持终端会话。
在 A 上使用 tmux:
-
在 A 服务器上启动 tmux 会话:
tmux new -s keepalive_session
-
然后执行你的 SSH 连接命令:
ssh -R 8059:localhost:9999 root@120.26.44.100
-
如果 SSH 会话被意外中断,你可以重新连接到 tmux 会话,而不会丢失进程。重新连接到 tmux 会话:
tmux attach-session -t keepalive_session
方法 3:使用 autossh 自动重连
autossh
是一个自动重连的工具,用于确保 SSH 连接在断开时自动重新建立。
安装 autossh
:
首先,在 A 服务器上安装 autossh
:
sudo apt update
sudo apt install autossh
使用 autossh
保持 SSH 连接:
使用 autossh
替代普通的 ssh
命令来启动 SSH 连接。autossh
会监控 SSH 会话,并在连接断开时自动重新连接。
autossh -M 0 -f -N -R 8059:localhost:9999 root@120.26.44.100
命令解释:
-M 0
:禁用autossh
的监控端口。你可以根据需要使用实际的监控端口。-f
:让autossh
在后台运行。-N
:不执行任何命令,只进行端口转发。-R 8059:localhost:9999
:设置反向端口转发。
总结: 使用
autossh
你可以确保即使 SSH 连接断开,A 和 B 之间的连接会自动重新建立,保持长时间的连接不中断。
方法 4:设置 Systemd 服务来维持 SSH 连接
你可以将 ssh
或 autossh
连接设置为一个后台系统服务,确保它在 A 服务器上自动启动并持续运行。
创建一个 Systemd 服务文件:
-
在 A 服务器上,创建一个新的 systemd 服务文件:
sudo nano /etc/systemd/system/ssh_keepalive.service
-
输入以下内容:
[Unit] Description=Keep SSH Tunnel Alive [Service] ExecStart=/usr/bin/autossh -M 0 -f -N -R 8059:localhost:9999 root@120.26.44.100 Restart=always User=root [Install] WantedBy=multi-user.target
-
保存并退出,然后重新加载 systemd 服务:
sudo systemctl daemon-reload
-
启动服务并设置为开机自启:
sudo systemctl start ssh_keepalive sudo systemctl enable ssh_keepalive
这样,autossh
会在后台持续运行,即使 SSH 会话中断,它会自动重新连接。
总结
- Keep-Alive 设置:通过设置
ServerAliveInterval
和ServerAliveCountMax
,确保 A 和 B 之间的 SSH 连接保持活动。 - tmux 或 screen:确保即使连接中断,终端会话也能恢复。
- autossh:通过自动重连工具确保 SSH 连接不会中断。
- systemd 服务:将 SSH 连接作为后台服务运行,确保在系统重启或连接断开时自动恢复。
这些方法可以确保 A 和 B 之间的 SSH 连接保持持续,不会因为空闲或断开而中断。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-01-14 ssm整合-MyBatis
2022-01-14 JSON数据-FastJson的使用
2022-01-14 JSON数据-jackson的使用
2022-01-14 重定向和转发
2022-01-14 Restful风格