有些时候,需要访问外部的Linux主机。但由于一般主机都会位于对方的内网,而没有办法直接连接。本文介绍一种使用ssh代理进行访问的解决方案。
问题描述
** 机器描述 **
| 机器设备 | IP | 用户名 | 备注 |
|---|---|---|---|
| 目标A | 192.168.x.x | user1 | 目标服务器,在局域网内 |
| 代理B | B.B.B.B | user2 | 代理服务器,A和C都可以访问 |
| 自己C | user3 | 自己,可以访问B都不能访问A |
** 目标 **
从机器C通过ssh访问机器A
** 解决方案 **
在 A 机器上做到 B 机器的反向代理;在 B 机器上做正向代理本地端口转发
** 环境需求 **
- 每台机器上都拥有ssh客户端,默认mac和linux系统都自带
** 详细步骤 **
- 在机器A上建立到机器B的反向代理
ssh -fCNR <port1>:localhost:22 <user2>@<B.B.B.B>
其中port1为 机器B 上的端口,用来与 机器A 上的22端口绑定
- 在机器B上建立正向代理,用于转发本地端口数据
ssh -fCNL "*:<port2>:localhost:<port1>" localhost
port2 为本地转发端口,用以和外网通信,并将数据转发到 port1,用于机器C访问
其中*代表允许来自任意的机器连接
- 在机器C上通过使用机器B作为代理进行访问机器A
ssh -p <port2> <user1>@B.B.B.B
注意:这里使用的是机器A的user1, 不是B.B.B.B的user2
** SSH命令参数说明 **
-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理