我位于网络防火墙后面,它不允许我通过默认端口进行 ssh 操作。因此,我无法将任何 bzr 分支推送到我的存储库。我想知道是否可以通过端口 80 代理 ssh,以便我可以推送分支。
我听说螺旋状让你这样做,但我不确定具体如何做。
如果您知道任何可以让您执行此操作的代理服务器,请提及它们。
答案1
好的企业防火墙会检查任何端口的流量,因此更改端口可能不起作用。
如果您可以控制服务器,并且仍想尝试,您可以将 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 并设置以下内容:
- 安装 WebDav
- 将你的分支移至正确的位置
- 使用bzr-webdav插件连接
VPN 可能是一种选择,但如果ssh
被锁定,我希望它也被排除在外。
您可能只想和网络管理员谈谈。您需要做点什么,但他们却阻止了您。如果他们有阻止的理由ssh
,那么他们很可能会以相当负面的态度看待任何极端的规避尝试……
简而言之,与他们交谈可能更安全。
答案2
通过代理进行 SSH
如果防火墙允许,您可以运行 ssh 到任何端口,但这需要 ssh 服务器监听该端口。端口 80 不太可能起作用,因为大多数有防火墙的地方都会分析该端口上的流量并阻止任何非 HTTP 的内容。但端口 443(通常是 HTTPS 端口)通常可以工作,因为 SSH 和 HTTPS 在过滤软件看来非常相似,因此您的 SSH 会话将看起来像 HTTPS 会话。(可以区分 HTTPS 和 SSH,因此如果防火墙足够复杂,这将不起作用。)
如果您可以控制服务器,请让它除了监听 22(常规 ssh 端口)之外,还监听 443 端口。您可以在以下位置配置端口/etc/ssh/sshd_config
:添加一行
Port 443
除了Port 22
应该已经存在的之外。请注意,这假设 ssh 服务器不是 HTTPS 服务器。如果是,您需要找到防火墙允许您使用的另一个端口或找到另一个 ssh 服务器(请参阅下面的转发)。
如果您不需要在 Web 浏览器中设置 Web 代理,那么您可以尝试直接连接:
ssh -p 443 myserver.example.com
如果有效,请在您的中定义一个别名~/.ssh/config
:
Host myserver
HostName myserver.example.com
Port 443
如果你需要在 Web 浏览器中设置 Web 代理,请告诉 ssh 通过代理。安装螺旋状。在您的 中定义一个这样的别名~/.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
,并且想要访问 上的 SSH 服务器mytarget
,请安装netcat-openbsd(mygateway
或者,如果它没有运行 Ubuntu,请确保它有命令nc
)。将其放入您的~/.ssh/config
:
Host mytarget
ProxyCommand ssh mygateway nc %h %p
SSH 到 Apache
如果您要连接的主机已在运行 Apache 并监听端口 443,并且您可以控制该主机,则可以设置此 Apache 以接受 SSH 连接并转发它们。请参阅通过 HTTP(S) 隧道传输 SSH。
答案3
我刚刚在这里读到一个复杂的解决方案:
http://benctechnicalblog.blogspot.hu/2011/03/ssh-over-connect-over-port-80.html
即使您的家庭服务器也在端口 80 上运行 Web 服务器,您也可以通过端口 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>
现在您可以向本地主机发出 HTTP 连接请求,Web 服务器将为您建立隧道,您只需确保所有流量都通过您的代理:
ssh -o 'ProxyCommand nc -X connect -x myhost.example.com:80 localhost 22' myhost.example.com
确保本地主机与 SSH 的连接没有特权(以避免让陌生人进入......)
如果您位于仅允许端口 80 输出的路由器后面,这应该可以工作。
如果您使用代理(因此您需要在浏览器中设置代理才能访问网络),则需要先建立到您自己的主机的隧道,然后在该隧道内发出另一个 CONNECT 请求以访问您的主机。这更复杂,您需要为此使用 2 个 netcat。
一切皆有可能,但风险自负……
更新:
或者简单地,只需使用通过浏览器为您提供 SSH 的 Web 应用程序。http://en.wikipedia.org/wiki/Web-based_SSH
答案4
如果您无法控制服务器以将 SSH 端口更改为端口 80,或者您无法通过端口 80 进行 SSH,因为防火墙阻止您通过端口 80 传输此类数据,那么您可以尝试 TOR。
TOR 是一个巨大的网络。您的计算机连接到世界上某个地方的另一台计算机,该计算机再连接到另一台计算机,直到到达 SSH 服务器。这一切都是防火墙友好的,发生在端口 443 上(您的公司不会阻止该端口,否则……好吧,他们就不太聪明了)。它是为这种流量重新路由而设计的,而且也是加密的。这样,您就可以在任何端口上访问任何主机(也可以在端口 22 上访问服务器的 SSH)。