SSH端口转发

为什么会用到SSH端口转发呢?

假设你有一个远程服务器的后台,但是你又不想让它开放HTTPS连接的端口
(只用SSH连接,除非你的公钥泄漏了不然会比HTTPS连接安全的多)
我们公司的项目就是这种情况,外部的MEC不想开放HTTP连接,这时就用到了SSH连接方式,这样就会将不加密的数据放在SSH安全连接里面传输

简介

SSH端口转发有两个主要作用:

  1. 将不加密的数据放在SSH安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问Telnet、FTP等明文服务,数据传输就都会加密
  2. 作为数据通信的加密跳板,绕过网络防火墙
    有三种使用方法:动态转发、本地转发、远程转发

动态转发

动态转发指的是,本机与 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 协议。

  • 下面是 SSH 隧道建立后的一个使用实例。
$ 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-hosttarget-port是目标服务器及其端口,remotehost是远程计算机。

远程转发主要针对内网的情况。下面举个例子。

第一个例子是内网某台服务器localhost80 端口开了一个服务,可以通过远程转发将这个 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/

你可能感兴趣的:(随笔,数据库,ssh,SSH端口转发)