能否通过80端口进行SSH连接?

我在一个不允许我通过默认端口进行ssh的网络防火墙后面。因此,我无法将任何bzr分支推送到我的代码库。我想知道是否有可能通过80端口来代理ssh,以便我可以推送这些分支。
我听说corkscrew可以做到这一点,但我不确定具体如何操作。
如果你知道任何可用的代理服务器可以实现这一功能,请务必提及。

2man ssh显示了端口:主机:主机端口。所以尝试使用ssh 80:server.com或类似的命令。 - MarkovCh1
那是用于通过-L或-R建立隧道的。所以您需要另一个盒子来进行隧道传输。 - Caesium
1请参阅 http://unix.stackexchange.com/a/190612/4319 - imz -- Ivan Zakharyaschev
5个回答

一个好的企业防火墙会检查流量,无论端口如何变化都可能不起作用。
如果您对服务器有控制权,并且仍然想尝试一下,您可以将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并设置一些东西:
  1. 安装WebDav
  2. 将您的分支移动到正确的位置
  3. 使用bzr-webdav插件进行连接

使用VPN可能是一个选择,但如果ssh被锁定,我预计也会被排除在外。

你可能只想与网络管理员交谈。你需要做一些事情,而他们正在阻止你。如果他们有阻止ssh的理由,他们可能会对任何试图绕过它的极端尝试持否定态度...

简而言之,与他们交谈可能更安全。


8+1与您的IT部门讨论您的需求。在许多环境中,包括我的环境,在这种活动下可能会被解雇。 - Panther
1此外,如果他要让ssh服务器在另一个端口上监听,他可以在/etc/ssh/sshd_config文件中有两个Port行,每个端口一个,从而使其同时在22号和80号端口上监听。 - Azendale
我会避免列出一个长长的名单(讨论其中一些项目很快就会变得非常政治化),但是这个问题涉及到除了员工试图规避公司自己IT部门忠实执行的公司政策之外的许多情况。我完全支持人们与IT讨论他们的工作需求,但这并不总是适用,有时IT部门甚至回答说:“没关系,但我们不会为了适应你而进行任何更改。”另外,很可能VPN会封锁端口22,但却不封锁其他端口,所以我认为这是值得尝试的。 - Eliah Kagan
@Panther 那么一些人可能会更高兴地结束那个企业制度。 - NeverEndingQueue

通过代理进行SSH连接

如果防火墙允许,您可以在任何端口上运行ssh,但这需要ssh服务器在该端口上监听。端口80不太可能工作,因为大多数有防火墙的地方会分析该端口上的流量,并阻止任何不是HTTP的内容。但通常情况下,端口443(通常是HTTPS端口)可以工作,因为SSH和HTTPS在过滤软件中看起来非常相似,所以您的SSH会话将看起来像一个HTTPS会话。(如果防火墙足够复杂,它是可以区分HTTPS和SSH的,所以这种方法可能不适用。)

如果您对服务器有控制权,请使其除了22号端口(正常的ssh端口)外,还监听443号端口。您可以在/etc/ssh/sshd_config中配置端口:添加一行

Port 443

除了应该已经存在的端口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通过代理进行。安装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连接

如果您可以通过上述技术之一访问外部机器,但无法访问您感兴趣的机器,请使用该方法来转发连接。假设您可以通过名为mygateway的机器进行ssh连接,并且您想要连接到mytarget上的SSH服务器,请在mygateway上安装netcat-openbsd(或者,如果它没有运行Ubuntu,请确保它具有nc命令)。将以下内容添加到您的~/.ssh/config文件中:

Host mytarget
ProxyCommand ssh mygateway nc %h %p

SSH连接到Apache

如果您想要连接的主机已经运行着Apache并且监听在443端口上,并且您对该主机有控制权,您可以设置Apache接受SSH连接并将其转发。请参考通过HTTP(S)隧道传输SSH


1你可以在https中使用nc代替corkscrew吗?是的吗?http://stackoverflow.com/a/15577758/32453 - rogerdpack

我刚刚在这里读到一个高级的解决方案。

http://benctechnicalblog.blogspot.hu/2011/03/ssh-over-connect-over-port-80.html

即使你的家庭服务器在端口80上运行一个Web服务器,你仍然可以通过端口80 SSH回家。

假设家庭服务器运行Apache。这个想法涉及在你的服务器上启用mod_proxy,然后将其限制为只能连接到本地主机(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请求以访问您的主机。这更加复杂,您需要使用两个netcat工具。

一切皆有可能,但请自行承担风险...

更新:

或者,简单地使用一个通过浏览器提供SSH服务的Web应用程序。http://en.wikipedia.org/wiki/Web-based_SSH


对不起,我不得不充当魔鬼的拥护者。

我知道可能有个理由这样做,但是为什么你的网络/防火墙管理员不开放你要找的特定端口呢?从安全角度来看,你愿意冒险让网页检查漏过什么吗?如果配置为绕过标准流量的80端口,你就置自己于危险。

我同意上面的一些建议,点对点VPN可能是更安全的选择。再次强调,从安全角度考虑,我很想知道你真正绕过安全策略的原因,以及为什么不能将服务器放在DMZ或骨干网中进行访问。仅代表个人观点,祝你好运。


3并不总是能够与网络管理员交谈,而且网络管理员也并非总是讲理的。 - Jeremy Bicha
举个例子,假如你正在咖啡馆里坐着,连接着WiFi,但管理员限制了访问(而你现在仍然需要连接)。 - old-ufo

如果您无法控制服务器将SSH端口更改为80端口,或者如果防火墙阻止您通过80端口传输此类数据而无法通过80端口进行SSH,则可以尝试使用TOR。
TOR是一个庞大的网络。您的计算机连接到世界某个地方的另一台计算机,该计算机连接到另一台计算机,直到达到SSH服务器。这全部都是防火墙友好的,在443端口上进行(您的公司没有阻止,否则...他们不太聪明)。它专为这种流量重定向设计,并且也是加密的。这样,您就可以访问任何主机上的任何端口(也包括22端口的服务器的SSH)。
https://www.torproject.org网站上查看更多信息。

只是提醒一下:这个链接实际上指向的是tor-project.org,尽管它显示为torproject.org,而前者是某种恶意软件/钓鱼网站。我觉得我应该编辑答案,假设这只是一个打字错误? - audiodude