SSH Tunnel端口转发
SSH 除了登录服务器,还有一大用途,就是作为加密通信的中介,充当两台服务器之间的通信加密跳板,使得原本不加密的通信变成加密通信。这个功能称为端口转发(port forwarding),又称 SSH 隧道(tunnel)。
端口转发有两个主要作用:
(1)将不加密的数据放在 SSH 安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密。
(2)作为数据通信的加密跳板,绕过网络防火墙。
端口转发有三种使用方法:动态转发,本地转发,远程转发。
注意: IPv4 写法是port:host:hostport , 而IPv6写法是port/host/hostport
SSH Tunnel 之 本地转发(-L参数)
格式:-L [本地主机:]本地主机端口:远程主机:远程主机端口 user@host
ssh -L local-port:target-host:target-port tunnel-host
当成功执行上面的命令之后,访问本地的50000端口,就等同于访问 www.google.com 的 80 端口。
本地转发(local forwarding)指的是,SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。
它会指定一个本地端口(local-port),所有发向那个端口的请求,都会转发到 SSH 跳板机(tunnel-host),然后 SSH 跳板机作为中介,将收到的请求发到目标服务器(target-host)的目标端口(target-port)。
这个命令最好加上-N 参数,表示不在 SSH 跳板机执行远程命令,让 SSH 只充当隧道。另外还有一个-f 参数表示 SSH 连接在后台运行。
注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
如果经常使用本地转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config )。
Host test.example.com
LocalForward client-IP:client-port server-IP:server-port
SSH Tunnel 之 远程转发(-R参数)
格式:-R [登录主机:]登录主机端口:远程主机:远程主机端口 user@host
ssh -R local-port:target-host:target-port -N local
访问登录主机的 8080 端口就相当于访问 localhost:80
远程端口指的是在远程 SSH 服务器建立的转发规则。
这种场景比较特殊,主要针对内网的情况。本地计算机在外网,SSH 跳板机和目标服务器都在内网,而且本地计算机无法访问内网之中的 SSH 跳板机,但是 SSH 跳板机可以访问本机计算机。
由于本机无法访问内网 SSH 跳板机,就无法从外网发起 SSH 隧道,建立端口转发。必须反过来,从 SSH 跳板机发起隧道,建立端口转发,这时就形成了远程端口转发。
显然,远程端口转发要求本地计算机也安装了 SSH 服务器,这样才能接受 SSH 跳板机的远程登录。
比如,跳板机执行下面的命令,绑定本地计算机的2121 端口,去访问www.example.com:80 。ssh -R 2121:www.example.com:80 local -N
执行上面的命令以后,跳板机到本地计算机的隧道已经建立了。然后,就可以从本机访问目标服务器了,即在本机执行下面的命令。curl http://localhost:2121
执行上面的命令以后,命令就会输出服务器www.example.com
的80端口返回的内容。
如果经常执行远程端口转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config )。
Host test.example.com
RemoteForward local-IP:local-port target-ip:target-port
SSH Tunnel 之 动态转发(-D参数)
格式:-D [本地主机:]本地主机端口 user@host
ssh -D local-port tunnel-host -N
动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。
动态转发需要把本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。
代理类型为 SOCKS(5),主机及端口:127.0.0.1:50000
curl -x socks5://localhost:2121 http://www.example.com
如果经常使用动态转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。
DynamicForward tunnel-host:local-port
两级跳板
端口转发可以有多级,比如新建两个 SSH 隧道,第一个隧道转发给第二个隧道,第二个隧道才能访问目标服务器。
首先,在本机新建第一级隧道。
$ ssh -L 7999:localhost:2999 tunnel1-host
上面命令在本地7999
端口与tunnel1-host
之间建立一条隧道,隧道的出口是tunnel1-host
的localhost:2999
,也就是tunnel1-host
收到本机的请求以后,转发给自己的2999
端口。
然后,在第一台跳板机(tunnel1-host
)执行下面的命令,新建第二级隧道。
$ ssh -L 2999:target-host:7999 tunnel2-host -N
上面命令将第一台跳板机tunnel1-host
的2999
端口,通过第二台跳板机tunnel2-host
,连接到目标服务器target-host
的7999
端口。
最终效果就是,访问本机的7999
端口,就会转发到target-host
的7999
端口。