ssh端口转发HTTP / HTTPS站点会出现什么问题?

时间:2016-05-07 23:40:30

标签: ssh

我试图找出ssh端口转发的工作原理。我对我遇到的不同问题感到非常困惑。

首先,一个基本的例子:ssh -L 8080:www.ubuntuforums.org:80 localhost。登录到我的本地计算机后,导航到Chrome中的localhost:8080即可转到http://www.canonical.com/。如果我直接导​​航到Chrome浏览器中的http://www.ubuntuforums.org/,我最终会转到http://ubuntuforums.org/。这里发生了什么?为什么我不是ubuntuforums.org而是www.canonical.com

其次,更改网站和端口:ssh -L 8888:learnlayout.com:80 localhost。在Chrome浏览器中导航到http://localhost:8888我只是永远挂起。 wget http://localhost:8888为我提供了以下index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>
<title>Transmission Forward</title>
<script type="text/javascript">
window.location = "http://24.218.24.189:8080/"
</script>
</head>
<body>
<p>Stand By...</p>
</body>
</html>

当我在浏览器中指向重定向时,ssh是否无法正确处理重定向?

第三,ssh -L 8888:imgur.com:80 localhost。在我的浏览器中,我收到以下错误:Fastly error: unknown domain: localhost. Please check that this domain has been added to a service.wget localhost:8888给了我:

--2016-05-07 16:36:47--  http://localhost:8887/
Resolving localhost... ::1, 127.0.0.1
Connecting to localhost|::1|:8888... connected.
HTTP request sent, awaiting response... 500 Domain Not Found
2016-05-07 16:36:47 ERROR 500: Domain Not Found.

这种错误的多样性真让我迷惑。我错过了ssh隧道有什么明显的东西吗?这些应该可行吗?也许我的网络或路由器可以达到某种程度?

1 个答案:

答案 0 :(得分:8)

背景

SSH

您正在使用SSH在两个系统之间建立安全连接,向远程端点验证用户身份,然后在该连接内设置隧道,以便通过隧道发送到本地计算机上特定端口的所有连接 - 到不同的主机和端口

HTTP

使用wget之类的浏览器或工具,您正在向本地计算机和端口发出HTTP请求。无论您从该端点获得什么响应,都会根据HTTP规范由原始工具解释。

您的问题

当您发出HTTP请求时,您获得的响应不是您所期望的。如果您尝试通过SSH隧道以example.org身份访问本地计算机上的localhost:8888,则无法获得实际页面,就像您直接浏览example.org一样。

说明

大多数网页/网站都支持域名。这意味着其功能与其配置为提供服务的域紧密相关

在您的示例中,有各种各样的方案。网站强制使用特定URL访问它们,使用javascript进行网站重定向,甚至是根据该URL不知道要服务的网站的网络服务器。所有这些解释都是相同的:他们不准备使用与他们认为的标准URL不同的URL进行访问。

根据我的经验,可以使用可以访问网站的域名。可以使用某些配置来强制执行该域的特定版本(例如添加或删除www),但几乎没有其他任何配置。这样的配置可以在Web服务器 - 或者它前面的缓存层 - 或者应用程序本身(WordPress有一个它自己强制执行的域的设置)中进行。例外是可以使用多个DNS访问的应用程序,并且大多数Web框架都有一种方法可以支持该方案,但它们通常需要后端配置来确定它们将服务的域列表。

解决方案

要从其他连接或使用隧道浏览网页,请执行以下操作:使用HTTP代理。特别是,SSH的选项-d PORT将创建一个SOCKS代理,您可以在大多数HTTP工具中配置它以进行隧道连接。