最终我想端口转发 HTTP 连接。对链接问题中的命令进行故障排除,我尝试了这个:
ssh -L localhost:8888:www.google.com:80 -N localhost
如果我现在使用相同的浏览器访问,localhost:8888
我会得到 404 错误,而不是 Google 主页。访问其他网站时,我会得到其他类型的错误。
我在这里遗漏了什么?这不是一个简单的端口转发吗?TCP 层以上的所有内容不应该都相同吗?显然不是。
所以:
- 我错过了什么?
- 还有其他可以起作用的命令吗?
答案1
你缺少什么
HTTP(s) 客户端将告诉服务器它用来访问它的名称(例如允许同一台服务器托管具有不同名称的多个站点)。
因此,如果客户说www.google.com
:
Hi www.google.com, please serve your home page
可以。但如果客户说www.google.com
:
Hi localhost, please serve your home page
那么服务器就不太明白你的意思,因为没有本地主机网络服务器位于那里。
替代命令
您需要伪造客户端随 HTTP 请求发送的“Host:”标头。否则,将使用 URL 中的主机名。以下是几个示例:
wget --header="Host: www.google.com" http://localhost:8888/
或者
curl --header "Host: www.google.com" http://localhost:8888/
答案2
由于基于名称的虚拟主机如今非常流行,因此端口转发和 HTTP/HTTPS 不能很好地混合。
通过 SSH 进行端口转发仅使主机名localhost
在端口上可用8888
。
如果另一端的应用程序google.com
未设置为响应localhost
主机名,则会失败并出现 404。
许多网站(从小型到大型)都将 Web 服务器绑定到主机名而不是 IP 地址。在 Apache 中,这称为基于名称的虚拟主机。基于名称的虚拟主机设置的好处是允许多个主机名(与多个网站/应用程序关联)通过同一 IP 地址访问这些多个网站/应用程序。
简单来说,如果您在共享服务器上获得个人网络托管计划,那么您的网站就可以与同一台机器上具有相同 IP 地址的数十个其他网站一起提供服务。
虽然我不知道 Google 使用什么网络服务器软件,但它似乎是基于主机名进行绑定的。
因此,当您转到localhost:8888
该页面时,会向 Google 发送请求,表示您正在请求主机名的数据localhost
。而 Google 方面基本上会说:“不!不知道您想要什么localhost
;我们这里没有这个!”因此会出现 404 错误。
也就是说,如果您想尝试本地端口转发,您最好在开发机器上设置一个测试 Web 服务器,无论主机名是什么,该服务器都将提供内容 - 通过将该网站设为“默认”配置 - 然后测试在本地通过不同的端口访问该网站。
就我的经验而言,端口转发的主要好处是,当您的管理员未在您连接的任何盒子上打开默认端口时,您能够在本地连接到非 Web 项目的远程端口。查看许多带有 GUI 的 MySQL 连接工具,总会有一个 SSH 选项,允许您通过 SSH 连接,但可以在桌面上访问数据库。