使用ssh forward跨局域网访问


在平时需要夸局域网访问某台设备时,都是选择先ssh登录跳板机,然后通过跳板机
再去访问目的设备。但在某些时候可能比较麻烦,比如涉及到图形化界面时。
这篇文章就来介绍一下如何使用ssh forward功能,达到在跨局域网访问时,
像访问同一局域网设备一样方便。


网络拓扑

假设存在一下网络拓扑,这是一个非常常见的办公网络环境拓扑

---------------                 ----------------
|    设备A    |                 |    设备B     |
| 192.168.1.11|   <--------->   | 192.168.1.22 |
---------------                 |              |
                                |              |
---------------                 |              |
|    设备C    |                 |              |
| 192.168.2.11|   <--------->   | 192.168.2.22 |
---------------                 ----------------

平时如果设备A想要访问设备C,可以首先登陆设备B,然后再登陆设备C,即

@A # ssh usr@192.168.1.22
@B # ssh usr@192.168.2.11

此时设备B发挥的作用一般就称为跳板机。
但假设这样一种情景,设备C提供了视频web服务,想直接使用设备A上面的浏览器
播放,此时会有两种办法。

配置正确的路由和网关信息

比如

@A # route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.22 dev eth1
@C # route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.2.22 dev eth1
@B # echo 1 > /proc/sys/net/ipv4/ip_forward    // 开启ip forward

可以看到,这种方法需要在三台机器上进行route相关的配置,比较麻烦。
并且很多时候,设备A的用户是没有修改设备C和设备B的系统配置的权限的。

配置ssh forward

这种方法使用方便,目的性强(也就意味着适用性差)。具体操作如下

@A # ssh -L 8000:192.168.2.11:80  usr@192.168.1.22

man ssh里面的解释最准确简介,直接贴上来

-L [bind_address:]port:host:hostport
    Specifies that the given port on the local (client) host is to be
    forwarded to the given host and port on the remote side.  This
    works by allocating a socket to listen to port on the local side,
    optionally bound to the specified bind_address.  Whenever a con-
    nection is made to this port, the connection is forwarded over
    the secure channel, and a connection is made to host port
    hostport from the remote machine.  Port forwardings can also be
    specified in the configuration file.  IPv6 addresses can be spec-
    ified by enclosing the address in square brackets.  Only the
    superuser can forward privileged ports.  By default, the local
    port is bound in accordance with the GatewayPorts setting.  How-
    ever, an explicit bind_address may be used to bind the connection
    to a specific address.  The bind_address of ''localhost'' indi-
    cates that the listening port be bound for local use only, while
    an empty address or '*' indicates that the port should be avail-
    able from all interfaces. 

执行上面命令后,会将访问本地的8000端口的数据转到192.168.2.11:80,反向也一样。
此时即可直接在设备A上打开浏览器,输入localhost:8000地址,即可访问设备C提供的web服务


更进一步

如果存在以下拓扑,设备A想要访问设备D的web服务,如果使用配置route方式,则会更加麻烦。
而使用ssh forward方式,只需要简单的两条命令就能搞定

---------------                 ----------------
|    设备A    |                 |    设备B     |
| 192.168.1.11|   <--------->   | 192.168.1.22 |
---------------                 |              |
                                |              |
---------------                 |              |
|    设备C    |                 | 192.168.2.22 |
| 192.168.2.11|   <--------->   ----------------
|             |                 
|             |                 
|             |                 ----------------
| 192.168.3.11|   <--------->   |    设备D     |
---------------                 | 192.168.3.22 |
                                ----------------

@A # ssh -gL 8000:设备B:8000 usr@设备B
@B # ssh -L  8000:设备D:80   usr@设备C

其中-g的含义如下

-g  Allows remote hosts to connect to local forwarded ports

由上面的例子可知,可以很方便的配置多个ssh forward,用以实现跨多个局域网的网络访问。
想要了解更多理论和具体的解释,强烈推荐看看参考资料。


参考资料

实战SSH端口转发