为了测试,我尝试通过 建立从我的笔记本电脑到站点的本地 ssh 隧道ssh-server
,并下载该站点的页面(或在浏览器中查看它)。
隧道是这样建造的:
$ ssh -L 9999:www.gnu.org:80 ssh-server
我检查隧道与服务器上的nc
程序和字符的配合情况。~#
我检查我是否可以通过运行在 ssh-server 上执行 http 请求,wget
并lynx
在服务器上执行 - 它们都运行没有错误。
但是当我wget --no-proxy localhost:9999
在笔记本电脑上运行时,出现错误 403。
我可以使用 做同样的事情ssh ssh-server 'wget -O - http://www.gnu.org/' >> whatever
。但为什么隧道不起作用呢?
所以我想弄清楚到底发生了什么以及代理不允许什么样的事情。
我的猜测是代理专门阻止 ssh 客户端执行 http 请求。是这样吗?
如果是这样 - proxy 如何区分 ssh-client 和其他程序?它能区分从 ssh-client 发送的请求和来自其他程序的请求吗?
“将 ssh 客户端屏蔽到另一个程序”(或通过代理传递的其他方法)的常见方法是什么?
聚苯乙烯 如果有人在评论中写下开放用于测试 ssh 隧道和其他内容的免费 ssh 服务器的地址,那就太棒了。 (通常 ssh 服务器不允许免费建立隧道。)
答案1
您还没有设置(或尝试使用)HTTP 代理,也没有设置 ssh 隧道。相反,您通过 ssh 使用端口转发。
转发 TCP 端口不适用于 HTTP。访问 HTTP URL 在两个不同点使用 URL 的域。 1 - 查找要发送消息的 IP 地址。 2 - 用于 HTTP 消息中的 Host 标头。这使得一个 IP 地址可以为以下网站提供服务多种的域。
因此,当您访问时http://localhost:9999/
,HTTP 消息包含一个标题行Host: localhost:9999
。 GNU Web 服务器不为名为 的网站提供服务localhost:9999
,并拒绝访问 (403)。
(403 是符合规范的。理论上,403 有点不友善,您应该更喜欢带有消息的 400。就我个人而言,我在我的普通 DynDNS 站点上使用了 403。不是为了规范的安全性,而是因为 FORBIDDEN 是如此的好希望它足够强大,足以否认我的网络服务器拦截了他们的网络服务器(例如,在 DNS 缓存过期的情况下)。
方便的方法是使用 SSH“动态端口转发”选项-D
,该选项设置 SOCKS 代理。不幸的是 wget 没有 SOCKS 代理选项(curl
尽管有)。