我试图找出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
隧道有什么明显的东西吗?这些应该可行吗?也许我的网络或路由器可以达到某种程度?
答案 0 :(得分:8)
您正在使用SSH在两个系统之间建立安全连接,向远程端点验证用户身份,然后在该连接内设置隧道,以便通过隧道发送到本地计算机上特定端口的所有连接 - 到不同的主机和端口
使用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工具中配置它以进行隧道连接。