SSH隧道错误:“通道1:打开失败:在管理上被禁止:打开失败”


184

当我打开此ssh隧道时:

ssh -nXNT -p 22 localhost -L 0.0.0.0:8984:remote:8983

尝试访问在localhost:8984上运行的HTTP服务器时出现此错误:

channel 1: open failed: administratively prohibited: open failed

此错误是什么意思,您可以在哪台计算机上解决此问题?


也许我缺少一些东西,但是为什么要尝试使用ssh客户端访问Web服务器?
Faheem Mitha

为什么在这里转发X11(-X选项)?如果只想转发HTTP,则没有必要。另外,恕我直言,恕我直言ssh可能是使Web服务器在多个端口上可用的错误解决方案。
Marcel G

29
我发现这意味着“无法解析主机名remote”。
RobM

3
从下面的十二个答案中可以看出,该错误消息尽管看起来非常具体,但仍应理解为一般错误。通常,解决方案是在远程服务器上打开一个外壳并尝试相同的连接,以查看实际原因。您将在以下最常见的实际原因中找到答案。
斯特凡纳·古里科

DNS解析故障可能会导致该错误以及连接可能会冻结,直到超时:superuser.com/a/700677
user423430

Answers:


122

渠道1:打开失败:管理员禁止:打开失败

以上消息是指您的SSH服务器拒绝了SSH客户端打开边通道的请求。这通常来自-D-L-w,作为SSH流中分离的通道都需要跨渡的转发数据。

由于您正在使用-L(也适用于-D),因此有两个问题正在导致您的SSH服务器拒绝该请求:

  • AllowTcpForwarding (如史蒂夫·布佐纳斯(Steve Buzonas)所述)
  • PermitOpen

这些选项可以在中找到/etc/ssh/sshd_config。您应确保:

  • AllowTCPForwarding 不存在,被注释掉或设置为 yes
  • PermitOpen不存在,被注释掉或设置为any[1]

此外,如果使用SSH密钥进行连接,则应检查与SSH密钥对应的条目~/.ssh/authorized_keys中没有no-port-forwardingpermitopen语句[2]。

PermitTunnel如果您尝试使用-w选项,则该选项与您的特定命令无关,但也与此主题相关。

[1] sshd_config(5)联机帮助页中的完整语法。

[2] authorized_keys(5)联机帮助页中的完整语法。


在这里,我专门添加了sshd_config以使其正常工作:TCPKeepAlive是AllowTCPForwarding是PermitOpen任何我有一些“打开失败”的现象,但这似乎很正常。事情进展顺利。
皮埃尔·锡伯

4
需要注意的一个极端情况:尝试使用SSH创建Tap / Tun设备时,会出现此错误,而SSH允许,但内核不允许。这可以在LXC容器中发生。有关确切详细信息,请参见blog.felixbrucker.com/2015/10/01/…,但在这种情况下,您可能需要添加lxc.cgroup.devices.allow = c 10:200 rwm到容器的配置中,并确保如果/dev/net/tun不存在,请 mknod /dev/net/tun c 10 200; chmod 666 /dev/net/tun在容器的启动时运行。
Azendale '16

@Azendale,这很有趣,谢谢。它会产生完全相同的错误消息,还是有些不同?
hyperair '16

1
@ St.Antario,AllowTcpForwarding允许您通过SSH转发TCP端口,这是-L 0.0.0.0:8984:remote:8983参数所请求的。如果AllowTcpForwarding设置为no,SSH将拒绝端口转发请求,从而导致您看到该错误。
hyperair

2
尝试编辑的大写AllowTCPForwardingAllowTcpForwarding,但是SE希望至少6个字符改变。因此,只需注意正确的大小写就是Tcp第一次使用的正确版本。
dbreaux

51

在一个非常奇怪的情况下,我在尝试创建本地隧道时也遇到了此错误。我的命令是这样的:

ssh -L 1234:localhost:1234 user@remote

问题是,在远程主机上,/etc/hosts没有用于“ localhost”的条目,因此ssh服务器不知道如何设置隧道。这种情况下非常不友好的错误消息;很高兴我终于明白了。

课程:确保远程主机可以通过DNS或解析隧道的目标主机名/etc/hosts


2
谢谢,这是我的问题。我在本地创建了IP的主机名,但没有在远程ssh服务器上创建。
dev_feed

2
“您的隧道的目标主机名”很难解读。您能否举一个具体可行的示例,让我以您的示例为例,并用我的目标主机名替换您示例中的“目标主机名”(一旦我理解您的意思),然后进行这项工作?
泰伦斯·布兰农

1
我什至不确定您的评论是否有意义。您说远程计算机没有本地主机的条目。但是然后说,远程主机必须解析目标主机名而不是本地主机名。再次提供一个完整的具体示例,可以说明前后的情况。
泰伦斯·布兰农

1
上面命令中的@TerrenceBrannon,“ localhost”是隧道的目标主机名。创建SSH隧道时,ssh命令首先登录到远程系统(user@remote),然后从远端设置到列出的目标主机的隧道(在上面的命令中为localhost)。这样做时,它将在远程主机上使用主机名解析方案。因此,如果您通过SSH登录的计算机无法解析localhost,则会收到此错误消息。
cobbzilla

1
就我而言,这就像输入目标主机名一样简单,因此当然它无法解决,但是我的眼睛错过了输入错字的时间太长了。
兰德尔(Randall)

25

至少一个答案是由于某种原因,ssh无法访问计算机“ remote”。错误消息只是荒谬的。


2
不,不是;我一直使用icmp-admin-prohibited作为防火墙配置中的拒绝标志。
2011年

9
+1,在管理上受禁止的消息将使您认为这是防火墙的阻塞,但是,在没有防火墙的阻塞但由于没有通往远程主机的路由而导致打开失败时,您会收到相同的消息。
史蒂夫·布佐纳斯

1
我刚刚花了几分钟寻找这个问题,在我看来,该问题的消息毫无意义。值得庆幸的是,在检查中间站日志文件时,它非常清楚。
yaccz 2013年

确实,如果“远程”无法访问-因为它已关闭,离线,不存在,主机名无法解析-那么您将看到此错误消息。
Michael Martinez

18

如果无法在服务器上解析“远程”,则将收到该错误。替换为IP地址,看看是否可以解决您的问题...

(与Neil的回答基本相同-但我肯定是这方面的问题)[我在~/.ssh/config文件中有一个机器名称的别名-而远程机器对此别名一无所知...


-D在浏览器中将(DynamicForward)用作SOCKS代理时,您可能还会看到相同的错误。即试图访问隧道主机无法解析的网站。
tims

10

当您使用ssh选项ControlPathControlMaster共享一个套接字连接以在多个客户端连接(从一个客户端到同一user @ server)之间重用时,将明确弹出此错误。打开太多(在我的情况下,〜20个连接意味着什么)会产生此消息。关闭以前的所有连接,就可以再打开一次,达到上限。


我来到这里寻找在哪里设置ControlMaster多路复用限制。如果有人知道,欢迎与他们分享。
clacke

1
clacke:根据bugs.debian.org/cgi-bin/bugreport.cgi?bug=546854的说明,您可以在/ etc / ssh / sshd_config文件中添加MaxSession参数来进行设置。根据手册页,默认情况下设置为10。
奥利弗·2013年

@oliver:确认,MaxSession有效,谢谢。在我的工作簿上升至64。
Matej Kovac 2014年

2
小心,这不是MaxSession而是MaxSessions。虽然也有一些保护,不破坏你的SSH服务器的配置...
斯特凡纳·古里科

8

“管理员禁止”是特定的ICMP消息标志,其归结为“管理员明确希望此连接被阻止”。

检查您的iptables设置。


5
不必要。当主机无法处理请求时,将生成该消息。这种情况通常是因为管理员已阻止了连接,但也可能是它没有被明确阻止,但没有通往所需主机的路由。AFAIK ssh没有逻辑来确定连接失败的原因,它只是假设如果您尝试连接,则该连接存在,并且如果您无法到达该连接,则必须故意阻止了该连接。
史蒂夫·布佐纳斯

2
嗯不 在ICMP响应的类型为“无通往主机的路由”和“管理上禁止”的响应之间存在明显的区别,除非有人故意错误配置了路由器,否则后者的含义与在路由器上所说的完全一样。
2014年

1
当我使用无法解析的主机名时,我只是被“行政上禁止”,因此这似乎是万能的。也许ssh正在做一些翻译?
2014年

5

一个类似的问题

另一个可能的线索

使用时~/.ssh/authorized_keys,我遇到了同样的问题permitopen

autossh创建隧道时,需要两个端口:

  • 一个用于连接(10000),
  • 一个用于监视(10001)。

在客户端

这给我监控端口带来了类似的问题:

autossh -M 10001 -o GatewayPorts=yes -o ServerAliveInterval=60  -o TCPKeepAlive=yes -T -N -R :10000:localhost:22 -i ~/.ssh/id_rsa user@remote

我收到了该消息(10分钟后):

channel 2: open failed: administratively prohibited: open failed

在远端

我的/var/log/auth.log包含:

Received request to connect to host 127.0.0.1 port 10001, but the request was denied.

在我~/.ssh/authorized_keys(远端),我有这个:

command="/home/user/tunnel",no-X11-forwarding,no-pty,permitopen="localhost:10000",permitopen="localhost:10001" ssh-rsa AAAA...

如何解决

我通过将localhost实例替换为来解决此问题127.0.0.1

command="/home/user/tunnel",no-X11-forwarding,no-pty,permitopen="127.0.0.1:10000",permitopen="127.0.0.1:10001" ssh-rsa AAAA...

似乎SSH无法理解这localhost是的捷径127.0.0.1,因此消息auth.log管理上禁止的消息。

我在这里了解的是,管理上的含义是“由于服务器端的特定配置”。


本地主机可能映射到:: 1(ipv6),并且由于某些原因您未在此处收听
Jo Rhett

4

/etc/sshd_config

AllowTcpForwarding no 

组。将其切换yes为允许TCP转发。


4

就我而言,我必须替换localhost127.0.0.1

ssh -L 1234:localhost:3389 user@remote

使它工作。

我试图rdesktop -L localhost:1234遵循Amazon 关于通过SSH隧道连接到AWS EC2说明。我曾尝试根据/etc/ssh/sshd_config投票最高的答案进行更改(客户端和服务器均运行Ubuntu 16.04 LTS)。我还检查了localhost位于/etc/hosts两侧。

直到我将ssh命令本身更改为:

ssh -L 1234:127.0.0.1:3389 user@remote

非常感谢!
ThibautBarrère,

3

需要一些故障排除活动才能找到明确的答案:

  • 检查是否在用户的ssh配置中启用了端口转发,
  • 启用ssh(-v)的详细信息,
  • 检查本地主机上的ssh日志和远程主机上的安全日志,
  • 测试不同的远程端口,
  • 检查您的iptables设置(如Shadur所说)。

3

我将远程放置在-L参数中时遇到了这个错误,而且0.0.0.0是多余的,您可以忽略它以得到相同的结果,并且我认为您应该添加-g使其起作用。

这是我用于隧道的行: ssh -L 8983:locahost:8984 user@remote -4 -g -N

-4 tells to use only ipv4
-g Allows remote hosts to connect to local forwarded ports.
-N Do not execute a remote command.  This is useful for just forwarding ports (protocol version 2 only). I use this to clog the terminal so I don't forget to close it since generally I need the tunnels temporarily.

3

这也可能是由于无法绑定到本地端上的端口所致。

ssh -Nn -L 1234:remote:5678 user@remote

此命令试图绑定本地计算机上的侦听端口1234,该端口映射到远程计算机上端口5678上的服务。

如果本地计算机上的端口1234已被另一个进程使用(可能是后台ssh -f会话),则ssh将无法侦听该端口,并且隧道将失败。

问题在于此错误消息可能意味着多种含义,并且“行政上禁止”有时会给出错误的想法。因此,除了检查DNS,本地与远程之间的防火墙以及sshd_config外,还要检查本地端口是否已被使用。采用

lsof -ti:1234

以确定在1234上正在运行的进程。对于lsof,您可能需要sudo才能列出其他用户拥有的进程。那你可以用

ps aux | grep <pid>

找出那个过程是什么。

要在一个命令中获得所有这些:

ps aux | grep "$(sudo lsof -ti:1234)"


2

令我惊讶的是,没有人提到这可能是DNS问题。

journalctl -f
channel 3: open failed: administratively prohibited: open failed
Mar 10 15:24:57 hostname sshd[30303]: error: connect_to user@example.com: unknown host (Name or service not known)

如果remote无法解析,或者您输入了未知的语法(如我在此处所做的那样user@),则将其显示在端口转发逻辑中(这将不起作用)。


2

就我而言,问题是由于在服务器旨在强行更改我的帐户的同时请求没有外壳访问权限的隧道。由于缺少外壳,我看不到它,只收到了错误

channel 2: open failed: administratively prohibited: open failed  

我的隧道配置如下:

ssh -p [ssh-port] -N -f -L [local-port]:127.0.0.1:[remote-port]
[server-address]

直接登录到服务器时显示错误(不带-N -f):

WARNING: Your password has expired. You must change your password now
and login again!

我通过使用shell访问权限登录并更改了密码来解决了该问题。然后,我可以简单地使用隧道,而无需再次访问shell。


1

尝试通过SSH与仅被授权使用SFTP连接的用户进行连接时出现此问题。

例如,这是在服务器的中/etc/ssh/sshd_config

Match group sftponly
    ForceCommand internal-sftp
    ChrootDirectory /usr/chroot/%u
    [...]
Match

因此,在这种情况下,要使用SSH,您将必须从等效sftponly组中删除该用户,或者使用不限于SFTP的用户进行连接。


1

检查/etc/resolv.conf您要访问的服务器上是否为空ssh。几次我发现这与一个空/etc/resolv.conf文件有关

如果不是root用户,则可以通过在公共主机名上尝试一些pingtelnet(80)来检查服务器,即:

root@bananapi ~ # telnet www.google.com 80
telnet: could not resolve www.google.com/80: Name or service not known

将名称服务器记录添加到后/etc/resolv.conf

root@bananapi ~ # telnet www.google.com 80
Trying 74.125.195.104...
Connected to www.google.com.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.0 302 Found
Location: http://www.google.ro/?gws_rd=cr&ei=8fStVZ-hMIv6UvX6iuAK

但是,您还应该检查为什么/etc/resolv.conf为空(如果适用,通常由服务器上的dhcp客户端填充名称服务器记录)。


1

在SSH调试Debian时,我收到了相同的消息。事实证明,远程系统没有可用空间。释放一些磁盘空间并重新启动后,隧道开始工作。


0

我在cygwin上看到了这个错误,这在Linux上也应该如此,并为我工作。在我的情况下,我已经完成ssh -ND *:1234 user@127.0.0.1,当我将浏览器连接到该comp-socks服务器时,它进行了浏览,但是在我运行该ssh命令的comp上,出现了该错误在控制台上处理每个请求-至少要访问一个站点,尽管浏览器是通过代理检索到的,或者至少在我看到主流时代的程度上如此。但是进行此更改可以摆脱失败的消息

http://linuxindetails.wordpress.com/2010/02/18/channel-3-open-failed-administratively-prohibited-open-failed/

While trying to do some SSH tunneling, here is the error I got :
channel 3: open failed: administratively prohibited: open failed
To avoid this kind of error, have a look at the SSH daemon configuration file :
/etc/ssh/sshd_config
Add possibly the following line :
root@remote-server:~# echo “PermitTunnel yes” >> /etc/ssh/sshd_config
Then, restart your sshd server :
root@remote-server:~# service ssh restart
or

root@remote-server:~# /etc/init.d/ssh restart

默认情况下会启用AFAIK隧道,因为禁用不会添加任何安全层,主要只是添加第三方隧道带来的不便。我在尝试从异地位置代理到内部服务器时遇到了类似的问题,并且启用了隧道+使用默认操作将iptables刷新为ACCEPT
史蒂夫·布佐纳斯

@SteveBuzonas我在/ etc / sshd_config中看到了这一点,因此a)不会禁用隧道b)关于我的回答,解决方案可能不是一个好主意。这是sshd_config关于该选项的内容#要禁用隧道明文密码,请在此处更改为no!#PermitTunnel no
barlop 2012年

@SteveBuzonas检查您的那一台,它可能设置为no,并且您可以进行隧道传输,因为默认情况下确实启用了隧道。
barlop 2012年

我想到的是AllowTCPForwarding,您正在谈论的评论# To disable tunneled clear text是关于PasswordAuthentication设置为no,PermitTunnel该设置允许通过tun / tap允许第2层或第3层网络隧道,并且默认为no。L,R和D选项使用TCP转发而不是用于隧道的设备。
史蒂夫·布佐纳斯

0

另一种情况是您尝试访问的服务未运行。前几天,我遇到了这个问题,只是想起我尝试连接的httpd实例已停止。

解决该问题的步骤将从最简单的开始,即转到另一台计算机,看看您是否可以在本地连接,然后将自己重新连接到客户端计算机。至少这将使您能够确定通信未发生的时间点。您可以采用其他方法,但这对我有用。


有用的一般提示,但不能解决所提出的问题。
凯尔·琼斯

0

检查路由器的DNS重新绑定保护。我的路由器(pfsense)默认情况下启用了DNS重新绑定保护。它导致SSH出现“通道打开:在管理上禁止失败:打开失败”错误


0

我有同样的问题,我意识到这是DNS。流量通过隧道传输,但是DNS请求没有。尝试手动编辑DNS主机文件并添加您要访问的服务。


0

我的情况:

$ssh -D 8081 localhost >>log1.txt 2>&1 &

----wait for 3 days

$tail -f log1.txt
channel 963: open failed: connect failed: Connection refused
channel 963: open failed: connect failed: Connection refused
channel 971: open failed: connect failed: Connection reset by peer
channel 982: open failed: connect failed: Connection timed out
channel 979: open failed: connect failed: Connection timed out
channel 1019: open failed: administratively prohibited: open failed
accept: Too many open files
channel 1019: open failed: administratively prohibited: open failed
accept: Too many open files
channel 1019: open failed: administratively prohibited: open failed

$ps  axu | grep 8081
root       404  0.0  0.0   4244   592 pts/1    S+   05:44   0:00 grep --color=auto 8081
root       807  0.3  0.6   8596  6192 ?        S    Mar17  76:44 ssh -D 8081 localhost

$lsof -p 807 | grep TCP
ssh     807 root 1013u  sock     0,8      0t0 2076902 protocol: TCP
ssh     807 root 1014u  sock     0,8      0t0 2078751 protocol: TCP
ssh     807 root 1015u  sock     0,8      0t0 2076894 protocol: TCP
.....

$lsof -p 807 | wc -l
1047

$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   malcolm-desktop

$ssh localhost
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-53-generic i686)

----after restart ssh -D 8081 localhost
$ lsof -p 1184 | grep TCP
ssh     1184 root    3u  IPv4 2332193      0t0   TCP localhost:37742->localhost:ssh (ESTABLISHED)
ssh     1184 root    4u  IPv6 2332197      0t0   TCP ip6-localhost:tproxy (LISTEN)
ssh     1184 root    5u  IPv4 2332198      0t0   TCP localhost:tproxy (LISTEN)
ssh     1184 root    6u  IPv4 2332215      0t0   TCP localhost:tproxy->localhost:60136 (ESTABLISHED)
ssh     1184 root    7u  IPv4 2336142      0t0   TCP localhost:tproxy->localhost:32928 (CLOSE_WAIT)
ssh     1184 root    8u  IPv4 2336062      0t0   TCP localhost:tproxy->localhost:32880 (CLOSE_WAIT)

0

我在博客中写入以下内容时遇到此错误:

/etc/ssh/sshd_config 有类似的东西:

Match Group SSHTunnel_RemoteAccessGroup
    AllowTcpForwarding yes
    PermitOpen=sshbeyondremote.server.com:22

但是~/.ssh/config有:

Host remote.server.com
  HostName remote.server.com
  Port 10022
  User useronremote
  IdentityFile ~/.ssh/keys/key1/openssh.keyforremote.priv
  LocalForward 2222 SSHBeyondRemote.server.com:22

请注意SSHBeyondRemote.server.com:22sshbeyondremote.server.com:22之间大小写(大小写)的不同。

解决问题后,我再也看不到问题了。

我正在使用:

OpenSSH客户端的版本:

  • OpenSSH_7.2p2 Ubuntu-4ubuntu2.4,OpenSSL 1.0.2g 2016年3月1日

OpenSSH服务器的版本:

  • OpenSSH_7.6p1 Debian-4,OpenSSL 1.0.2n 2017年12月7日

1
如果您要链接,升级,引用或以其他方式引用您所隶属的事物,则必须明确披露该隶属关系。仅仅说“放在一起(链接)时”是不够的(因为直到我弄清楚您正在链接到自己的博客之后,我才理解它的含义);仅具有与您的Stack Exchange用户名匹配的URL是不够的。参考资料:如何成为垃圾邮件发送者,  避免公开的自我宣传,……(续)
Scott

(续)…… 我们何时应执行从属关系要求?   您可以在用户资料页面中自由提及自己的博客,雇主,开发的任何知名软件,编写的书籍,与您有联系或与之有关联的任何其他项目,等等。。
斯科特(Scott)

0

其他名称解析原因:我的/ etc / hosts的服务器名称(而不是localhost)的IP地址错误,如下所示:

127.0.0.1     localhost
192.168.2.45  server.domain.com server

但是配置的服务器IP(以及使用host / dig命令解析的DNS名称)为192.168.2.47。由先前的IP重新配置引起的简单错字。修复/ etc / hosts之后,隧道连接可以正常工作:

ssh user@server.domain.com -L 3456:127.0.0.1:5901

奇怪的是,当我在隧道中使用localhost文字IP时,实际IP导致了失败。发行版:Ubuntu 16.04 LTS。


0

我收到该消息的原因不是最常见的,但值得一提。我已经通过脚本生成了一个隧道列表,并且为了确保列显示,我将每个最后一个字节打印在两个字节上。当我尝试打开到192.168.66.08的隧道转发时,它总是失败,因为gethostbyaddr将'08'解释为无效的八进制数字:)


0

似乎此消息有很多可能的根本原因。在我的情况下,因为我没有正确提供密钥文件,所以无法访问遥控器。

-L选项添加隐式SSH跳转(有效地使用显式SSH主机作为堡垒/跳转服务器)。通过显式执行跳转并使用“ proxycommand”创建到目标计算机的登录外壳,可能更容易调试此错误。

一旦工作成功,您就可以根据目标计算机的端口转发端口localhost(假设它可以自己登录):

-N -L 1234:localhost:1234
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.