问题描述
我在不允许我通过默认端口 ssh 的网络防火墙后面。因此,我无法将任何 bzr 分支推送到我的存储库。我想知道是否可以通过端口 80 以某种方式代理 ssh,以便我可以推送分支。
我听说 corkscrew 可以让你这样做,但我不知道该怎么做。
如果您知道任何可以让您这样做的有效代理服务器,请务必提及它们。
最佳办法
一个好的企业防火墙会检查流量,而不考虑端口,因此更改端口可能不起作用。
如果您可以控制服务器,并且仍然想尝试,您可以将 sshd 端口更改为端口 80。警告如果您在端口 80(在服务器上)上运行其他东西,这将无法正常工作,并且可能意味着您完全失去对服务器的 SSH 访问权限!
您需要编辑 /etc/ssh/sshd_config
并将 Port
更改为 80
。然后运行
sudo restart ssh
然后连接:
ssh user@host -p80
您的 bzr 路径将类似于:bzr+ssh://host:80/path/
另一种方法是使用 WebDav。这应该完全绕过防火墙问题,因为这一切都发生在端口 80 上,但它需要您运行 Apache 并设置一些东西:
-
将您的分支移动到正确的位置
-
使用 bzr-webdav 插件连接
VPN 可能是一种选择,但如果 ssh
被锁定,我希望它也被排除在外。
您可能只想与您的网络管理员谈谈。你需要做点什么,他们阻止了你。如果他们有阻止 ssh
的理由,他们很可能会对规避它的任何极端尝试持相当消极的态度……
简而言之,与他们交谈可能更安全。
次佳办法
通过代理 SSH
如果防火墙允许,您可以对任何端口运行 ssh,但这需要 ssh 服务器监听该端口。端口 80 不太可能工作,因为大多数有防火墙的地方都会分析该端口上的流量并阻止任何不是 HTTP 的内容。但是通常是 HTTPS 端口的 443 端口通常可以工作,因为 SSH 和 HTTPS 在过滤软件中看起来很像,所以你的 SSH 会话看起来像一个 HTTPS 会话。 (可以区分 HTTPS 和 SSH,因此如果防火墙足够复杂,这将不起作用。)
如果您对服务器有控制权,请让它在端口 443 和 22(普通 ssh 端口)上侦听。您可以在 /etc/ssh/sshd_config
中配置端口:添加一行
Port 443
除了应该已经存在的 Port 22
之外。请注意,这假定 ssh 服务器不是 HTTPS 服务器。如果是,您需要找到防火墙允许您使用的另一个端口或找到另一个 ssh 服务器(请参阅下面的转发)。
如果您不需要在网络浏览器中设置网络代理,则可以尝试直接连接:
ssh -p 443 myserver.example.com
如果可行,请在 ~/.ssh/config
中定义一个别名:
Host myserver
HostName myserver.example.com
Port 443
如果您需要在 Web 浏览器中设置 Web 代理,请告诉 ssh 通过代理。安装 corkscrew 。在 ~/.ssh/config
中定义这样的别名,其中 http://proxy.acme.com:3128/
是您用于 HTTPS 到外部的代理(替换为正确的主机名和端口):
Host myserver
HostName myserver.example.com
Port 443
ProxyCommand /usr/bin/corkscrew proxy.acme.com 3128 %h %p
SSH 上的 SSH
如果您可以通过上述技术之一到达某些外部机器,但不能到达您感兴趣的机器,请使用它来转发连接。假设您可以通过 ssh 连接到名为 mygateway
的机器,并且您想访问 mytarget
上的 SSH 服务器,请在 mygateway
上安装 netcat-openbsd(或者,如果它没有运行 Ubuntu,请确保它具有 nc
命令)。把它放在你的 ~/.ssh/config
中:
Host mytarget
ProxyCommand ssh mygateway nc %h %p
SSH 到 Apache
如果您要连接的主机已经在运行 Apache 并正在侦听端口 443,并且您可以控制该主机,则可以设置此 Apache 以接受 SSH 连接并转发它们。见 Tunneling SSH over HTTP(S) 。
第三种办法
我刚刚在这里阅读了一个复杂的解决方案:
http://benctechnicalblog.blogspot.hu/2011/03/ssh-over-connect-over-port-80.html
即使您的家庭服务器也在端口 80 上运行网络服务器,您也可以在端口 80 上 SSH 家庭。
假设主服务器运行 Apache。这个想法涉及在您的服务器中启用 mod_proxy,然后将其限制为连接到 localhost (proxy.conf):
<IfModule mod_proxy.c>
ProxyRequests On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
</Proxy>
<Proxy localhost>
Allow from all
</Proxy>
AllowCONNECT 22
ProxyVia On
</IfModule>
现在您可以向 localhost 发出 HTTP 连接请求,网络服务器将为您建立一个隧道,您只需要确保所有流量都通过您的代理:
ssh -o 'ProxyCommand nc -X connect -x myhost.example.com:80 localhost 22' myhost.example.com
确保与 SSH 的 localhost 连接没有特权(以避免让陌生人进入……)
如果您在只允许端口 80 输出的路由器后面,这应该可以工作。
如果您在代理后面(因此您需要在浏览器中设置代理才能访问网络),您需要先建立到您自己的主机的隧道,然后在此隧道内发出另一个 CONNECT 请求以到达您的主机。这更复杂,您需要为此使用 2 个 netcat。
一切皆有可能,但风险自负……
更新:
或者简单地说,只需使用通过浏览器为您提供 SSH 的 Web 应用程序。 http://en.wikipedia.org/wiki/Web-based_SSH