简介
SSH端口转发有两个主要作用:
- 将不加密的数据放在SSH安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问Telnet、FTP等明文服务,数据传输就都会加密
- 作为数据通信的加密跳板,绕过网络防火墙
有三种使用方法:动态转发、本地转发、远程转发
动态转发
动态转发指的是,本机与 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-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 -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
参考
https://wangdoc.com/ssh/port-forwarding.html
https://solitum.net/posts/an-illustrated-guide-to-ssh-tunnels/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210767.html原文链接:https://javaforall.net
