为什么会用到SSH端口转发呢?
假设你有一个远程服务器的后台,但是你又不想让它开放HTTPS连接的端口
(只用SSH连接,除非你的公钥泄漏了不然会比HTTPS连接安全的多)
我们公司的项目就是这种情况,外部的MEC不想开放HTTP连接,这时就用到了SSH连接方式,这样就会将不加密的数据放在SSH安全连接里面传输
SSH端口转发有两个主要作用:
动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。
动态转发需要把本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。
$ ssh -D local-port tunnel-host -N
上面命令中,-D
表示动态转发,local-port
是本地端口,tunnel-host
是 SSH 服务器,-N
表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道。
2121
,那么动态转发的命令就是下面这样。$ ssh -D 2121 tunnel-host -N
注意,这种转发采用了 SOCKS5 协议。
$ curl -x socks5://localhost:2121 http://www.example.com
上面命令中,curl 的-x
参数指定代理服务器,即通过 SOCKS5 协议的本地2121
端口,访问http://www.example.com
。
本地转发(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 隧道,就可以写成下面这样。
$ ssh -L 2121:www.example.com:80 tunnel-host -N
然后,访问本机的2121
端口,就是访问www.example.com
的80端口。
$ curl http://localhost:2121
# 注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
远程转发指的是在远程 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
https://wangdoc.com/ssh/port-forwarding.html
https://solitum.net/posts/an-illustrated-guide-to-ssh-tunnels/