从外网 SSH 进局域网,反向代理+正向代理解决方案

14

相信很多同学都会碰到这样一个问题。在实验室有一台机器用于日常工作,当我回家了或者回宿舍之后因为没法进入内网,所以访问不到了。如果这个时候我需要 SSH 进去做一下工作,那么怎么解决这个问题呢?本文将给出一种使用 SSH 的代理功能的解决方案。

问题描述:

机器状况

机器号 IP 用户名 备注
A 192.168.0.A usr_a 目标服务器,在局域网中,可以访问 A
B B.B.B.B usr_b 代理服务器,在外网中,无法访问 A
C - - 可以直接访问 B,无法直接访问 A

目标

从 C 机器使用 SSH 访问 A

解决方案

在 A 机器上做到 B 机器的反向代理;在 B 机器上做正向代理本地端口转发

环境需求

  • 每台机器上都需要 SSH 客户端
  • A、B 两台机器上需要 SSH 服务器端。通常是 openssh-server。

    在 Ubuntu 上安装过程为

    bashsudo apt-get install openssl-server
    

实施步骤

  1. 建立 A 机器到 B 机器的反向代理【A 机器上操作】

    bashssh -fCNR <port_b1>:localhost:22 usr_b@B.B.B.B
    

    <port_b1> 为 B 机器上端口,用来与 A 机器上的22端口绑定。

  2. 建立 B 机器上的正向代理,用作本地转发。做这一步是因为绑定后的 端口只支持本地访问【B 机器上操作】

    bashssh -fCNL "*:<port_b2>:localhost:<port_b1>' localhost
    

    <port_b2> 为本地转发端口,用以和外网通信,并将数据转发到 <port_b1>,实现可以从其他机器访问。

    其中的*表示接受来自任意机器的访问。

  3. 现在在 C 机器上可以通过 B 机器 ssh 到 A 机器

    bashssh -p <portb2> usra@B.B.B.B
    

至此方案完成。

附:

SSH 参数解释

-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理

如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

15 条评论
Feng_Yu · 2017年09月23日

-R和-L其实都是反向代理,-D才是正向代理

+3 回复

oxyflour · 2015年04月30日

这个技术有一些其他有趣的应用,比如用 ssh 反向端口映射 + node.js 反向代理建站(在 bae 上每次新连接会有一秒左右的延迟怎么也消除不了...阿里云上就没事 =.=

回复

asmall · 2015年04月30日

有个问题不是很明白:为啥要有c的存在,不可以通过b去访问a吗?

回复

davis · 2015年04月30日

c其实就是 anyone 可以是在家的电脑 或出差时的笔记本

回复

davis · 2015年04月30日

同样的需求我使用teamviewer

回复

barry_wu · 2015年04月30日

** 很赞 **

回复

冰雪殿 作者 · 2015年04月30日

C 可是是任意一台机器啦~ 因为如果只要做到从 B 访问 A 的话直接用一个反代就好了,本地端口转发可以省掉~

回复

codepiano · 2015年04月30日

为什么b机器上还要在本地端口间转发一次?直接设置/etc /sshd_config中修改GatewayPorts no为GatewayPorts yes就可以转发外网的ip请求,不想改文件用-g选项就行

回复

冰雪殿 作者 · 2015年04月30日

说的对!设置 B 机器上 /etc/ssh/sshd_configGatewayPorts yes是可以的。

回复

tgic · 2015年05月05日

ssh 反向代理工具 https://github.com/tg123/sshpiper

回复

冰雪殿 作者 · 2015年05月05日

thx

回复

牧毅 · 2015年05月06日

"其中的表示接受来自任意机器的访问。" -- 这句不太恰当,应该是表示接受来自任何接口(网卡)的访问。 原文是“the address ‘’, indicates that the remote socket should listen on all interfaces.”。
最初看到这句话的时候我还以为可以指定个允许访问IP白名单呢,实际貌似没法在这里指定。

回复

xxfaxy · 2016年01月26日

第一步需要A机器操作,我都连接不上,怎么操作?

回复

滥情的年1 · 2017年12月19日

ssh -fCNL "*:<port_b2>:localhost:<port_b1>' localhost 这句执行不了 是为什么

回复

WitPool · 5月6日

需要一个公网的服务器,如果没有的话可以使用Holer,只需要配置一个Access key就搞定了

参考文章
https://blog.csdn.net/wangudo...

回复

载入中...