type
status
date
slug
summary
tags
category
icon
password
理解清楚SSH端口转发
- SSH简单的理解就是2台机器之间安全的数据通道,它包括ssh的client和ssh的server2个角色,这样的一条通道也就是ssh隧道(ssh tunneling)
- SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server
- 我们的应用的请求也是有方向的,一般是客户端向服务器端发出请求
- 一旦这2个方向相同,我们称为ssh的本地转发(-L),不同则为远端转发(-R)
- 命令一般是跑在ssh client的机器上的
本地转发
ssh本地转发命令
从本地的端口发出请求,通过这台机器作为跳板转发请求到的端口。 是相对而言的,比如是127.0.0.1的话,就是本身。 所以一般如果是127.0.0.1的话,跳板机或者代理服务器就是目标服务器
- A是一台在我家的机器macbook air,它可以访问taobao,也就是服务器C
- B是一台在公司的机器imac,由于在公司的内网,所以在家的A访问不到B
- C是taobao的服务器,公司不让上taobao,所以服务器B访问不了C
现在要想在让B服务器能访问C的80端口,由于防火墙这条路本身是走不通的,但是由于B能访问A,A能访问C,所以能把A作为代理服务器实现这一要求。
在服务器B和服务器A之间建立ssh隧道,在SSH端口转发中,由于服务器B能连接到服务器A,并且请求是从服务器B发出,所以B既是ssh的client,也是请求的客户端 所以此时应该在B上去运行ssh的本地转发命令:
ssh -L 8080:HOST_C:80 HOST_A
远端转发
ssh远端转发的命令
由于本身B是可以访问A的,但是A访问不到B,现在要想服务器A访问到B,也就是在家能连上公司的机器。
服务器B能连上A,所以B应该是ssh的client,此时请求是由A发起的,所以A是请求客户端,方向不同,所以是远端转发。 因此在B上运行命令:
ssh -R 2222:127.0.0.1:22 HOST_A
,这里127.0.0.1是因为通过A服务器转发的目的服务器就是A本身。 这样在A上的2222端口就映射到了B的22端口。动态转发
不管是本地转发还是远端转发,都需要一个具体的应用服务器的地址和端口号,要想访问其他机器的内容就得绑定很多条这样的转发命令, 通过动态转发就能省去这一个应用服务器的信息。
当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览等信息无疑是十分必要的。 比如在本机运行:
sh -D 7001 <SSH Server>
这样就相当于通过创建了一个SOCKS代理。我们可以直接使用localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器上设置即可。 在 SSH Client 端无法访问的网站现在也都可以正常浏览。 而这里需要值得注意的是,此时 SSH 所包护的范围只包括从浏览器端(SSH Client 端)到 SSH Server 端的连接,并不包含从 SSH Server 端 到目标网站的连接。 如果后半截连接的安全不能得到充分的保证的话,这种方式仍不是合适的解决方案。
这个时候还可以在本机将SOCKS代理转成HTTP代理。 比如在本地安装polipo,修改polipo.conf文件,把SOCKS代理填上127.0.0.1:7001,然后
export http_proxy="127.0.0.1:8123" && export https_proxy="127.0.0.1:8123"
就在本地的8123端口起了一个http代理。参考资料
- 作者:Killi
- 链接:https://udeth.com/article/ssh-tunnel
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。