当我们进行大数据开发时候,有些时候需要查看特定端口号对应的UI界面,但往往好多时候,我们的主机是没有办法直接连接上服务器的(往往需要借助一层或者多层跳板机)。
假设此时有这样的一个场景,我的主机通过跳板机A连接到服务器B上。现在我在服务器B上开启Spark的HistoryServer进程(端口号为18080),现在需要对18080端口进行转发。
具体的命令如下,在跳板机A上执行如下脚本,来转发18080端口号。
ssh -CfNg -L 收听端口:目标主机:目标端口 username@hostname
#具体命令如下所示
ssh -CfNg -L 18080:B的ip地址:18080 userA@A的ip地址
此时在服务器B上开启Spark的History Server服务,并在我们的本地机器浏览器内输入
A的ip:18080
即可成功访问服务器B上的Spark History Server。
——————————————————————————————————————————
下面解释一下ssh各个参数的原理:
-C:请求压缩所有数据
-f:后台执行ssh指令
-N:不执行远程指令
-g:允许远程主机连接主机的转发端口
本地转发
-L意思本地转发,本地转发(local forwarding)指的是,SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。
它会指定一个本地端口(local-port),所有发向那个端口的请求,都会转发到 SSH 跳板机(tunnel-host),然后 SSH 跳板机作为中介,将收到的请求发到目标服务器(target-host)的目标端口(target-port)。
ssh -L local-port:target-host:target-port tunnel-host
上面命令中,-L
参数表示本地转发,local-port
是本地端口,target-host
是你想要访问的目标服务器,target-port
是目标服务器的端口,tunnel-host
是 SSH 跳板机。
举例来说,现在有一台 SSH 跳板机tunnel-host
,我们想要通过这台机器,在本地2121
端口与目标网站www.example.com
的80端口之间建立 SSH 隧道,就可以写成下面这样。这个命令最好加上-N
参数,表示不在 SSH 跳板机执行远程命令,让 SSH 只充当隧道。另外还有一个-f
参数表示 SSH 连接在后台运行。
ssh -L 2121:www.example.com:80 tunnel-host -N
然后,访问本机的2121
端口,就等价于访问www.example.com
的80端口。
curl http://localhost:2121
注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
远程转发
PS:下面介绍一下远程端口转发。
远程转发指的是在远程 SSH 服务器建立的转发规则。
它跟本地转发正好反过来。建立本地计算机到远程计算机的 SSH 隧道以后,本地转发是通过本地计算机访问远程计算机,而远程转发则是通过远程计算机访问本地计算机。它的命令格式如下。
ssh -R remote-port:target-host:target-port -N remotehost
上面命令中,-R
参数表示远程端口转发,remote-port
是远程计算机的端口,target-host
和target-port
是目标服务器及其端口,remotehost
是远程计算机。
远程转发主要针对内网的情况。下面举个例子。
第一个例子是内网某台服务器localhost
在 80 端口开了一个服务,可以通过远程转发将这个 80 端口,映射到具有公网 IP 地址的my.public.server
服务器的 8080 端口,使得访问my.public.server:8080
这个地址,就可以访问到那台内网服务器的 80 端口。
ssh -R 8080:localhost:80 -N my.public.server
上面命令是在内网localhost
服务器上执行,建立从localhost
到my.public.server
的 SSH 隧道。运行以后,用户访问my.public.server:8080
,就会自动映射到localhost:80
。