连接远程服务器时遇到SSH隧道问题

3

我正在尝试从本地机器访问一个被IP限制的远程供应商网站(我们的公司服务器可以访问)。我通过从能够无障碍访问API的服务器进行隧道连接来实现这一点,但是当我设置SSH隧道并访问供应商网站上的URL时,出现了404未找到错误。以下是我使用的内容:

ssh -f -N user@example.com -L 7777:vendorhostexample.com:80

一切迹象都表明隧道已正确设置,但如果我尝试使用'http://localhost:7777/foobar'这样的URL,就会出现404错误。有什么想法吗?

4个回答

4

你的问题在于你发送了http头"Location: localhost",这意味着如果目标web服务器使用虚拟主机,它将尝试查找网站"localhost"而不是"vendorhostexample.com"

一种方法是像Ryan指出的那样修改您的hosts文件,并告诉您的计算机vendorhostexample.com在127.0.0.1上,这样当您在浏览器中输入时,将通过正确设置的“Host:” http头进入隧道。

另一种方法是安装一个浏览器扩展来更改Host头,例如这个适用于Firefox。


最终开始看这个问题了……如果我更改主机标头,它可以工作,但是我无法通过将供应商的 URL 指向我的本地主机使其工作——有任何想法为什么不起作用吗?我并不总是通过浏览器访问,如果不必要,就不想在代码中更改主机。 - acvcu
如果你在主机文件(Linux上的/etc/hosts)中添加一行告诉你的机器vendorhostexample在127.0.0.1上,那么你就不需要设置主机头了。这行代码看起来像这样:127.0.0.1 vendorhostexample.com www.vendorhostexample.com - Valor

2

其他人已经提到与域名不匹配的虚拟主机问题。另一个解决方案是使用动态隧道。

如果您使用-D 8080标志打开连接,SSH会打开动态隧道,并在端口8080上公开SOCKS代理。然后,您可以设置您选择的浏览器(或应用程序)使用 localhost:8080 的SOCKS代理,将所有流量都隧道传输到服务器。


1
你可以编辑本地 hosts 文件(对于 Linux 为 /etc/hosts),并添加一行,例如:
127.0.0.1 vendorhostexample.com

请再试一次。


我尝试了这个方法后仍然得到404错误 - 这种方法是否需要隧道两端的端口都是80才能生效? - acvcu

-1

你的操作破坏了HTTP协议。你的浏览器在HTTP头中发送了主机名localhost,这意味着你正在请求供应商站点上的localhost网站。他们几乎肯定没有在服务器上搭建一个localhost站点,所以你会得到404错误。

你不能以这种方式进行HTTP隧道传输。你需要在公司服务器上设置正确的HTTP代理。


设置 Http 代理的最佳方法是什么? - acvcu
你不需要为此设置http代理,有许多方法可以在没有代理的情况下实现它。从像@raynix指出的更改本地主机名到添加浏览器扩展以替换请求的“Host:”头部等多种方式。 - Valor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接