我刚刚用过本指南创建 SSH 隧道来绕过我的公司代理。我没有使用通常的“Putty”,而是在“MobaXterm”(一个类似于 putty 的程序,也提供 unix 工具)中编写,来创建隧道:
ssh -D 7070 -p 22 [email protected] sleep 9999
然后我打开浏览器(Firefox)并告诉它使用袜子在本地主机港口7070。
一切都很好并且正在工作,但我不知道底层技术实际上是如何工作的。我的意思是,一般来说我知道这个过程是如何运作的,但我想更深入一点。
我的意思是,目前我们可以将我的知识与我对汽车的知识进行比较:我知道有一个发动机,四个轮子等,但我不知道发动机实际上是如何使用汽油来移动汽车的。到目前为止我收到的两个答案只是向我解释了我已经知道的事情。我拥有 CCNP,在数据中心担任网络工程师,知道如何编程,对 Linux 环境有足够的了解。我希望您提供一个完整的(但少于 20 页长的 RFC)答案。
答案应包括:
- 隧道主要选项的描述。一个很好的例子是这个答案中的图片:了解 SSH 隧道
- 何时使用哪种类型的隧道以及用于什么目的(正常隧道、反向隧道)
- 隧道前/后的wireshark捕获
- 一张解释过程的图片(毕竟我是一个视觉爱好者)
我保证我会给100分一旦我可以对这个问题给予赏金。我真的需要一个好的答案。 (如果我忘记了赏金,请给我发电子邮件:ilcon7e[at]gmail[dot]com
编辑
改进了问题。
答案1
当您访问某个网站(不受公司防火墙阻碍的网站)时,您的浏览器会通过端口 80(默认情况下)向 URL 中列出的服务器发送请求。例如,要访问此站点,我们的浏览器与服务器的端口 80 进行通信unix.stackexchange.com
当您设置代理设置时,您告诉浏览器将所有内容发送到localhost
端口 7070,无论 URL 是什么。代理服务器旨在简单地代表客户端获取数据。有各种可用的代理服务器(快速搜索您的 disto 存储库将找到一些 -squid
是其中之一,并且apache
网络nginx
服务器也可以充当代理),但安装一个不会对您的情况有所帮助,因为代理会尝试访问网站代表您,但仍会被您的公司防火墙阻止。
但是,ssh
使用 -D 选项与sshd
远程站点 ( yourserver.com
) 上的守护程序结合使用时,就像代理服务器一样,只不过该服务器被分成两半 - 本地ssh
和远程sshd
。
来自浏览器的请求http://unix.stackexchange.com
将发送到ssh
您计算机上正在侦听端口 的客户端7070
。这会加密请求并将其发送到远程sshd
服务器。这将解密请求并将其发送到相关服务器(同样是unix.stackexchange.com
端口 80),并将返回路径(服务器应返回其响应的 IP 地址和端口)修改为服务器的路径sshd
( yourserver.com
)。
Stack Exchange 网络服务器对此代理一无所知,它会将您请求的任何页面回复到服务器的 IP 地址和端口sshd
(由于这个小修改)。但是,此服务器知道该请求源自ssh
您计算机上的运行(它维护此类信息的表格),因此它会对其进行加密并将其发送回您。ssh
计算机上的服务器会将响应发送回您的浏览器,浏览器会忠实地为您显示网页。
ssh
其行为就像一个分布式代理。这里的“隧道”是这样的事实:代理分为两半,它们通过加密隧道相互通信,没有人可以窥探,并且(在您的情况下)正在使用未被防火墙阻止的端口(端口 22 )。
答案2
非常高层次的概述:
该
-D
选项告诉 ssh 使用 SOCKS 协议侦听该端口上的连接。您将 Firefox 配置为连接到 ssh 并使用 SOCKS 协议。你输入http://www.google.com进入您的浏览器。
Firefox 连接到该 SOCKS 端口。 SOCKS 可以做很多事情,但我们感兴趣的是:Firefox 询问 SOCKS 服务器 (ssh)“嘿,你能与 www.google.com 交谈,并给它这个 HTTP 请求吗?然后告诉我( Firefox)www.google.com 对此有何回应?” (Firefox 不知道也不真正关心 ssh 将通过 SSH 隧道转发该请求)。
ssh 沿着 ssh 连接将该请求转发到远程计算机(可能是 sshd)上运行的东西。
在远程计算机上运行的程序建立连接,将数据发送到 Google,然后获取响应。
远程计算机上的程序根据请求告诉您计算机上的 ssh 响应是什么。
根据要求,您计算机上的 ssh 告诉 Firefox 响应是什么。
Firefox 知道它是一个网页,因此它开始显示它。
对所有图像、JavaScript、CSS 等重复多次。