GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

术语俗话 --- 什么是SSH 隧道

我们常常在运维时间会有这样的场景,

ssh远程的服务器可以访问内部的一个网段,但是我自己的电脑无法直接访问这些网段,

解决方法

配置ssh转发服务,将服务器作为跳板机访问内网

配置方法:

这是一个非常经典且实用的需求,通常被称为“SSH 隧道”或“跳板机”技术。你的云服务器在这里充当了一个“桥梁”的角色。

最常用、最快捷的方法是使用 SSH 本地端口转发 和 SOCKS 代理。下面我为你详细解释两种方法。


方法一:SSH 本地端口转发 (Local Port Forwarding)

这种方法适用于你需要访问内网中某一个特定服务的场景(例如访问一个内网的 Web 网站、数据库、远程桌面等)。

原理:在你本地电脑上开启一个端口,所有发向这个端口的数据,都会通过 SSH 隧道加密传输到你的云服务器上,再由云服务器转发到目标内网机器的指定端口。

命令格式:

bash
 
ssh -L [本地IP]:[本地端口]:[内网目标IP]:[内网目标端口] 用户名@云服务器IP -N

参数解释:

  • -L: 进行本地端口转发。

  • [本地IP]: 通常可以省略或使用 127.0.0.1,表示只允许本机访问。如果想让局域网其他机器也能通过你这台电脑访问,可以用 0.0.0.0

  • [本地端口]: 你在本地电脑上打开的端口,可以任意指定一个未被占用的(如 8080, 33060, 33890 等)。

  • [内网目标IP]:[内网目标端口]: 你最终想要访问的内网服务的 IP 和端口。

  • -N: 不执行远程命令,仅建立隧道。如果只想转发端口,加上这个参数更简洁。

实际例子:

假设你的情况如下:

  • 云服务器 IP: 123.123.123.123

  • 云服务器 SSH 用户: root

  • 内网有一台 Web 服务器,地址是 192.168.1.100,端口是 80

  • 你想在本地电脑上通过访问 localhost:8080 来访问那个内网网站。

你需要在本地电脑的终端(Linux/macOS)或 PowerShell/CMD(Windows)中执行:

bash
 
ssh -L 8080:192.168.1.100:80 root@123.123.123.123 -N

输入密码后,这个隧道就建立了。现在你在本地浏览器打开 http://localhost:8080,访问的就是内网 192.168.1.100:80 的服务。

优点: 配置简单,针对特定服务非常有效。
缺点: 如果内网有很多服务,需要为每个服务都建立一条隧道,比较麻烦。


方法二:SOCKS 代理 (动态端口转发)

这种方法适用于你需要访问内网中多个不同服务的场景,或者使用一些不支持配置代理的应用程序。

原理:在你的本地电脑上建立一个 SOCKS 代理服务器。当你配置任何软件(浏览器、游戏、各种应用)使用这个代理后,所有通过这些软件的流量都会通过 SSH 隧道发送到云服务器,并由云服务器动态地去访问内网中的任何目标。

命令格式:

bash
 
ssh -D [本地端口] 用户名@云服务器IP -N

参数解释:

  • -D: 进行动态端口转发(建立 SOCKS 代理)。

  • [本地端口]: 本地 SOCKS 代理服务的监听端口,通常用 1080

实际例子:

同样假设:

  • 云服务器 IP: 123.123.123.123

  • 云服务器 SSH 用户: root

你需要在本地电脑的终端中执行:

bash
 
ssh -D 1080 root@123.123.123.123 -N

输入密码后,一个 SOCKS5 代理服务器就在你本地的 127.0.0.1:1080 上搭建好了。

接下来,你需要配置你的应用程序使用这个代理:

  1. 浏览器 (以 Firefox 为例):

    • 在网络设置中,手动配置代理。

    • SOCKS 主机: 127.0.0.1, 端口: 1080

    • 勾选 使用 SOCKS v5 时代理 DNS(这样内网的域名也能被正确解析)。

    • 之后你的所有浏览器流量都会通过云服务器去访问,它可以畅通地访问内网网段。

  2. 整个操作系统 (Windows/macOS):

    • 可以使用 Proxifier、Shadowrocket 等工具强制所有应用程序的流量都走这个 SOCKS 代理。

优点: 一劳永逸,配置一次后,所有支持代理的软件都可以访问内网资源。
缺点: 需要逐个软件配置代理,或者需要额外软件做全局代理。


方法三:一键脚本/自动化工具 (推荐用于长期使用)

如果觉得每次都要输入命令很麻烦,可以考虑以下自动化方案:

  1. 使用 SSH 配置文件 (~/.ssh/config):
    在你的本地电脑的 ~/.ssh/config 文件中添加以下内容,可以简化命令。

    bash
     
    Host JumpServer
        HostName 123.123.123.123
        User root
        LocalForward 8080 192.168.1.100:80 # 对应方法一
        DynamicForward 1080                 # 对应方法二
        # IdentityFile ~/.ssh/id_rsa        # 如果使用密钥登录,取消注释并指定密钥路径

    之后只需要执行 ssh JumpServer -N 即可同时开启两种转发。

  2. 使用 Autossh (防止隧道中断):
    Autossh 可以在 SSH 连接断开后自动重连,非常适合维持稳定的隧道。

    bash
     
    # Ubuntu/Debian 安装: sudo apt-get install autossh
    # CentOS/RHEL 安装: sudo yum install autossh
    autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 8080:192.168.1.100:80 root@123.123.123.123 -N
  3. 使用专业 VPN 软件:
    在你的云服务器上搭建一个 VPN 服务(如 WireGuard、OpenVPN),然后将本地电脑接入这个 VPN。这样你的本地电脑就像和云服务器以及内网网段在同一个局域网里一样,可以直接访问所有资源。这是最彻底、最方便的解决方案,但配置稍复杂。

总结与建议

方法适用场景优点缺点
本地端口转发 访问固定的单个服务(Web, DB) 简单直接 多服务需多个隧道
SOCKS 代理 访问内网多个不同服务 一劳永逸,灵活 需配置应用代理
搭建 VPN 长期、频繁访问整个内网 最方便,像在本地一样 配置复杂度最高

对于你的初次尝试,我建议:

  1. 从 方法一 开始,试试访问内网的一个网页,成功后会很有成就感。

  2. 如果觉得不够用,再尝试 方法二,配置浏览器代理体验一下。

  3. 如果这是长期需求,强烈建议研究一下在云服务器上搭建 WireGuard VPN,这是最终极的解决方案。

安全提示: 以上所有方法都基于 SSH,流量是加密的,很安全。如果使用密码登录,每次都需要输入。强烈建议使用 SSH 密钥对进行认证,更加安全且可以免密码登录,方便自动化脚本。

posted on 2025-08-22 16:05  GKLBB  阅读(137)  评论(0)    收藏  举报