2020-06-29
Ann Ann
ssh 作为数据通信的加密跳板,有多种使用场景。ssh 本身支持三种用法。
第一种场景是,访问所有外部网站,都要通过 ssh 中介。
这时就要把本地端口绑定到 ssh 跳板机。至于 ssh 跳板机要去访问哪一个网站,完全是动态的,所以叫做动态转发。
$ ssh -D local-port tunnel-host -N
上面命令中,-D
表示动态转发,local-port
是本地端口,tunnel-host
是 ssh 跳板机,-N
表示只进行端口转发,不登录远程 Shell。
举例来说,如果本地端口是2121
,那么实际命令就是下面这样。
$ ssh -D 2121 tunnel-host -N
注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。
下面是 ssh 隧道建立后的一个使用实例。
$ curl -x socks5://localhost:2121 http://www.example.com
上面命令中,curl 的-x
参数指定代理服务器,即通过 SOCKS5 协议的本地2121
端口,访问http://www.example.com
。
第二种场景是,只针对特定网站打开 ssh 隧道。这叫做“本地转发”。
$ ssh -L local-port:target-host:target-port tunnel-host -N
上面命令中,-L
参数表示本地转发,local-port
是本地端口,target-host
是你想要访问的目标服务器,target-port
是目标服务器的端口,tunnel-host
是 ssh 跳板机。
举例来说,在本地2121
端口建立 ssh 隧道,访问www.example.com
,可以写成下面这样。
$ ssh -L 8080:www.example.com:80 tunnel-host -N
然后,访问本机的2121
端口,就是访问www.example.com
。
$ curl http://localhost:2121
注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。
第三种场景比较特殊,主要针对内网的情况。本地计算机在外网,ssh 跳板机和目标服务器都在内网,而且本地计算机无法访问内网之中的跳板机,但是跳板机可以访问本机计算机。
由于本机无法访问跳板机,就无法从外网发起隧道,必须反过来,从跳板机发起隧道,这时就会用到远程端口转发。
$ ssh -R local-port:target-host:target-port local
上面的命令,首先需要注意,不是在本机执行的,而是在 ssh 跳板机执行的,从跳板机去连接本地计算机。-R
参数表示远程端口转发,local-port
是本地计算机的端口,target-host
和target-port
是目标服务器及其端口。
比如,跳板机执行下面的命令,绑定本地计算机的2121
端口,去访问www.example.com:80
。
$ ssh -R 2121:www.example.com:80 local -N
执行上面的命令以后,跳板机到本地计算机的隧道已经建立了。然后,就可以从本机访问目标服务器了,即在本机执行下面的命令。
$ curl http://localhost:2121
这种端口转发会远程绑定另一台机器的端口,所以叫做“远程端口转发”,也是采用 HTTP 协议。
上面介绍了 ssh 端口转发的三种用法,下面就来看几个具体的实例。
公共场合的 WiFi,如果使用非加密的通信,是非常不安全的。假定我们在咖啡馆里面,需要从邮件服务器明文下载邮件,怎么办?一种解决方法就是,采用本地端口转发,在本地电脑与邮件服务器之间,建立 ssh 隧道。
$ ssh -L 2121:mail-server:143 tunnel-host -N
上面命令指定本地2121
端口绑定 ssh 跳板机tunnel-host
,跳板机连向邮件服务器的143
端口。这样下载邮件,本地到 ssh 跳板机这一段,是完全加密的。当然,跳板机到邮件服务器的这一段,依然是明文的。
VPN 用来在外网与内网之间建立一条加密通道。内网的服务器不能从外网直接访问,必须通过一个跳板机,如果本机可以访问跳板机,就可以使用 ssh 本地转发,简单实现一个 VPN。
$ ssh -L 2080:corp-server:80 -L 2443:corp-server:443 tunnel-host -N
上面命令通过 ssh 跳板机,将本机的2080
端口绑定内网服务器的80
端口,本机的2443
端口绑定内网服务器的443
端口。
端口转发可以有多级,比如新建两个 ssh 隧道,第一个隧道转发给第二个隧道,第二个隧道才能访问目标服务器。
首先,新建第一级隧道。
$ ssh -L 7999:localhost:2999 tunnel1-host
上面命令在本地7999
端口与tunnel1-host
之间建立一条隧道,隧道的出口是tunnel1-host
的localhost:2999
,也就是tunnel1-host
收到本机的请求以后,转发给本机的2999
端口。
然后,在第一台跳板机执行下面的命令,新建第二级隧道。
$ ssh -L 2999:target-host:7999 tunnel2-host -N
上面命令将第一台跳板机tunnel1-host
的2999
端口,通过第二台跳板机tunnel2-host
,连接到目标服务器target-host
的7999
端口。
最终效果就是,访问本机的2999
端口,就会转发到target-host
的2999
端口。
IT Support 训练营01期
2025/11/10 06:13 (Sydney)
CCNA考证班01期
2025/09/06 08:37 (Sydney)
商业数据分析实战班第17期
2025/03/15 06:13 (Sydney)
地址
Level 10b, 144 Edward Street, Brisbane CBD(Headquarter)Level 2, 171 La Trobe St, Melbourne VIC 3000四川省成都市武侯区桂溪街道天府大道中段500号D5东方希望天祥广场B座45A13号Business Hub, 155 Waymouth St, Adelaide SA 5000Disclaimer
JR Academy acknowledges Traditional Owners of Country throughout Australia and recognises the continuing connection to lands, waters and communities. We pay our respect to Aboriginal and Torres Strait Islander cultures; and to Elders past and present. Aboriginal and Torres Strait Islander peoples should be aware that this website may contain images or names of people who have since passed away.
匠人学院网站上的所有内容,包括课程材料、徽标和匠人学院网站上提供的信息,均受澳大利亚政府知识产权法的保护。严禁未经授权使用、销售、分发、复制或修改。违规行为可能会导致法律诉讼。通过访问我们的网站,您同意尊重我们的知识产权。 JR Academy Pty Ltd 保留所有权利,包括专利、商标和版权。任何侵权行为都将受到法律追究。查看用户协议
© 2017-2024 JR Academy Pty Ltd. All rights reserved.
ABN 26621887572