为什么 SSH 协议没有成功连接到目的地?

Tim*_*Tim -3 ssh port-forwarding

在 Firefox 中,我可以连接到google.com:80. 但是之后

$ ssh -L 9000:google.com:80 testme@localhost
Run Code Online (Sandbox Code Playgroud)

在 Firefox 中,我连接到http://localhost:9000/,然后

  1. 那是一个错误。

在此服务器上找不到请求的 URL /。我们知道的就这些。

为什么有区别?谢谢。

Ste*_*itt 6

您的连接已正确建立,但您的浏览器正在请求 Google 服务器未配置为处理的主机和 URL(“localhost:9000”上的“/”)。

您可以使用curl -v;查看请求 它将至少包含

GET / HTTP/1.1
Host: localhost:9000
Run Code Online (Sandbox Code Playgroud)

“Host”行用于确定请求的是哪个虚拟主机(这是 HTTP 1.1 中相对于 1.0 的新增内容之一)。Google 服务器没有为“localhost:9000”配置虚拟主机,因此它们无法找到请求的资源并以 404 状态回复。

在大多数情况下,如果您想解决 Web 浏览问题并考虑使用 SSH 隧道,则应改用代理。在某些情况下,如有必要,您可能最终会使用 SSH 隧道转发代理的侦听端口;但您通常不会使用 SSH 隧道转发 Web 服务器的侦听端口。

但是,如果您想了解这里发生了什么,并使您的隧道在 Web 浏览器中可用(忽略上述内容),您需要确保本地主机将在目标期望的同一主机和端口上响应,或者指定curl应该使用的“Host”标头:

curl -H "Host: google.com" http://localhost:9000/
Run Code Online (Sandbox Code Playgroud)

例如,使用 Web 浏览器,您可以在创建隧道时指定 IP 地址而不是主机名

ssh -L 9000:216.58.213.142:443 testme@localhost
Run Code Online (Sandbox Code Playgroud)

然后加

127.0.0.1 google.com www.google.com
Run Code Online (Sandbox Code Playgroud)

在浏览器中/etc/hosts访问之前添加到您的文件https://google.com:9000