在平时需要夸局域网访问某台设备时,都是选择先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,用以实现跨多个局域网的网络访问。
想要了解更多理论和具体的解释,强烈推荐看看参考资料。