SSH隧道到远程服务器的问题

Posted

技术标签:

【中文标题】SSH隧道到远程服务器的问题【英文标题】:Trouble SSH Tunneling to remote server 【发布时间】:2012-10-02 11:22:22 【问题描述】:

我试图从我的本地计算机访问被 IP 锁定的远程供应商网站(我们的公司服务器被允许访问)。我通过从可以毫无问题地访问 API 的服务器建立隧道来做到这一点,但是,当我设置 SSH 隧道并转到供应商网站上的 URL 时,我收到 404 Not Found 错误。这是我正在使用的:

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

一切都表明隧道设置正确,但如果我尝试使用诸如“http://localhost:7777/foobar”之类的 URL,则会收到 404 错误。有什么想法吗?

【问题讨论】:

【参考方案1】:

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

一种方法是 Ryan 指出修改您的主机文件并告诉您的机器 vendorhostexample.com 它位于 127.0.0.1 上,这样当您在浏览器中键入它时,您将通过正确的“主机: " http 标头集。

另一种方法是为您的浏览器安装扩展程序以更改主机标头,例如用于 firefox 的 this one。

【讨论】:

终于有时间看看这个...如果我更改主机标头,它可以工作,但我无法通过将供应商 URL 指向我的本地主机来让它工作 - 知道为什么会这样不工作?我并不总是使用浏览器,如果没有必要,我不想更改代码中的主机。 如果你在你的主机文件(Linux 上的 /etc/hosts)中添加一行告诉你的机器 vendorhostexample 它在​​ 127.0.0.1 上,你不需要设置主机头。该行将如下所示:127.0.0.1 vendorhostexample.com www.vendorhostexample.com【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您可以编辑本地主机(Linux 的 /etc/hosts)文件,并添加如下行:

127.0.0.1 vendorhostexample.com

然后再试一次。

【讨论】:

在尝试此操作后,我仍然得到 404 - 隧道两侧的端口是否必须为 80 才能使用此方法?【参考方案4】:

你用这个破坏了 HTTP。您的浏览器在 HTTP 标头中发送主机名 localhost,这意味着您正在请求供应商网站的 localhost 网站。他们几乎可以肯定不会在他们的服务器上托管localhost 网站,所以你得到了 404。

你不能以你现在的方式隧道 HTTP。您需要在公司服务器上设置适当的 HTTP 代理。

【讨论】:

设置 Http 代理的最佳方法是什么? 你不需要为此设置一个http代理,有很多方法可以实现它没有一个。从@raynix 指出的更改本地主机到添加浏览器扩展来替换请求的“主机:”标头。

以上是关于SSH隧道到远程服务器的问题的主要内容,如果未能解决你的问题,请参考以下文章

jmx/jstatd 通过 ssh 隧道访问远程机器

如何以编程方式连接到需要 SSH 隧道的远程数据库服务器?

Python:远程服务器关闭后自动重新连接 ssh 隧道

使用隧道 ssh 通过 nodeJS 中的 mongoose 通过 ssh 连接到远程服务器 mongoDB

SSH 通过隧道访问远程客户端

在 Java 中通过 SSH 隧道运行远程命令