利用代理服务器访问内网 - 反向 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 配置允许反向端口转发。

  1. 编辑 B 服务器上的 /etc/ssh/sshd_config 文件,确保以下配置项被正确设置:
    AllowTcpForwarding yes
    GatewayPorts yes
    
  2. 重启 B 服务器上的 SSH 服务:
sudo service sshd restart


四、保持ssh连接不断地方法


为了确保 AB 之间的 SSH 连接在没有数据传输的情况下保持持续不断,即使没有任何流量或者 C 不连接 B,你可以采取以下几种方法来确保 SSH 连接不会断开。

方法 1:使用 SSH 的 KeepAlive 参数

SSH 协议本身有一些选项可以用于防止连接超时或断开。你可以通过设置 ServerAliveIntervalServerAliveCountMax 来保持 SSH 连接活动,即使没有数据传输。

设置 A 服务器的 SSH 配置(/etc/ssh/sshd_config):

  1. 打开 A 服务器上的 SSH 配置文件 /etc/ssh/sshd_config,然后确保以下两个参数被设置:

    ServerAliveInterval 60
    ServerAliveCountMax 5
    
    • ServerAliveInterval:指定服务器每隔多少秒发送一个空的"心跳"数据包到客户端,以保持连接活动。这里设置为 60 秒,即每 60 秒发送一个心跳包。
    • ServerAliveCountMax:指定如果客户端没有响应,最多允许多少次未响应的心跳包。在这里,设置为 5,意味着在 5 次心跳未响应后才会断开连接。
  2. 保存配置并重启 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 中设置相应的参数。

  1. 打开客户端配置文件:

    sudo nano /etc/ssh/ssh_config
    
  2. 添加以下配置:

    ServerAliveInterval 60
    ServerAliveCountMax 5
    

    这样,A 服务器会每 60 秒向 B 发送一个"心跳"请求,以确保连接活跃。

  3. 保存并退出。

总结: 通过配置 ServerAliveIntervalServerAliveCountMax,即使没有数据传输,SSH 连接也会持续保持。


方法 2:使用 tmuxscreen 保持会话

如果你希望在 AB 之间的 SSH 连接中断时能够恢复会话,可以使用 tmuxscreen 等工具,这样即使 SSH 会话被断开,仍然可以保持终端会话。

A 上使用 tmux

  1. A 服务器上启动 tmux 会话:

    tmux new -s keepalive_session
    
  2. 然后执行你的 SSH 连接命令:

    ssh -R 8059:localhost:9999 root@120.26.44.100
    
  3. 如果 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 连接断开,AB 之间的连接会自动重新建立,保持长时间的连接不中断。


方法 4:设置 Systemd 服务来维持 SSH 连接

你可以将 sshautossh 连接设置为一个后台系统服务,确保它在 A 服务器上自动启动并持续运行。

创建一个 Systemd 服务文件:

  1. A 服务器上,创建一个新的 systemd 服务文件:

    sudo nano /etc/systemd/system/ssh_keepalive.service
    
  2. 输入以下内容:

    [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
    
  3. 保存并退出,然后重新加载 systemd 服务:

    sudo systemctl daemon-reload
    
  4. 启动服务并设置为开机自启:

    sudo systemctl start ssh_keepalive
    sudo systemctl enable ssh_keepalive
    

这样,autossh 会在后台持续运行,即使 SSH 会话中断,它会自动重新连接。


总结

  • Keep-Alive 设置:通过设置 ServerAliveIntervalServerAliveCountMax,确保 AB 之间的 SSH 连接保持活动。
  • tmux 或 screen:确保即使连接中断,终端会话也能恢复。
  • autossh:通过自动重连工具确保 SSH 连接不会中断。
  • systemd 服务:将 SSH 连接作为后台服务运行,确保在系统重启或连接断开时自动恢复。

这些方法可以确保 AB 之间的 SSH 连接保持持续,不会因为空闲或断开而中断。





posted @   卡卡发  阅读(211)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有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风格
点击右上角即可分享
微信分享提示