it-swarm.cn

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

当我打开此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

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

210
Neil

渠道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/authorized_keys_中与您的SSH密钥相对应的条目没有_no-port-forwarding_或permitopen语句[2]。

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

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

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

134
hyperair

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

ssh -L 1234:localhost:1234 [email protected]

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

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

55
cobbzilla

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

27
Neil

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

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

19
jacquesjtheron

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

11
Matej Kovac

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

检查您的iptables设置。

8
Shadur

就我而言,我必须在以下位置用127.0.0.1替换localhost

ssh -L 1234:localhost:3389 [email protected]

使它工作。

我正在尝试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 [email protected]
6
tinlyx

一个类似的问题

另一个可能的线索

使用~/.ssh/authorized_keyspermitopen时遇到相同的问题。

当我使用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 [email protected]

我收到了该消息(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...

如何解决

我通过用127.0.0.1替换localhost个实例来解决此问题:

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无法理解localhost127.0.0.1的快捷方式,因此auth.log中的消息和管理上禁止消息。

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

5
lauhub

/etc/sshd_config

AllowTcpForwarding no 

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

4
user578125

我曾经因为将遥控器放在-L参数中而收到此错误,但是0.0.0.0是多余的,您可以忽略它以得到相同的结果,并且我认为您应该添加-g使其起作用。

这是我用于隧道的行:ssh -L 8983:locahost:8984 [email protected] -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
Marciano

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

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

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

ssh -Nn -L 1234:remote:5678 [email protected]

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

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

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

lsof -ti:1234

以确定哪个进程在1234上运行。您可能需要Sudo来使lsof列出其他用户拥有的进程。那你可以用

ps aux | grep <pid>

找出那个过程是什么。

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

ps aux | grep "$(Sudo lsof -ti:1234)"
3
Mnebuerquo

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

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。

2
Pieter Van Gorp

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

journalctl -f
channel 3: open failed: administratively prohibited: open failed
Mar 10 15:24:57 hostname sshd[30303]: error: connect_to [email protected]: unknown Host (Name or service not known)

如果remote无法解析,或者您输入了未知的语法(例如我在此处添加[email protected]到端口转发逻辑(不起作用)。

2
Torxed

尝试建立隧道时,我有相同的消息。远端的dns伺服器发生问题。恢复工作后,问题已解决。

2
Leonardo Brunnet

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

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

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

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

1
Mike

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

1
SlavaSt

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

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

[email protected] ~ # telnet www.google.com 80
telnet: could not resolve www.google.com/80: Name or service not known

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

[email protected] ~ # 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
Ender

我在 我的博客 中编写 此条目 时遇到此错误:

/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在 case (大写)之间的区别

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

我正在使用:

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日
0
Zach Pfeffer

我在cygwin上看到了这个错误,这在Linux上也应该如此,并为我工作。在我的情况下,我完成了ssh -ND *:1234 [email protected],当我将浏览器连接到该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 :
[email protected]:~# echo “PermitTunnel yes” >> /etc/ssh/sshd_config
Then, restart your sshd server :
[email protected]:~# service ssh restart
or

[email protected]:~# /etc/init.d/ssh restart
0
barlop

除了上面的注释之一之外,还添加了以下内容:“ DNS解析失败可能会导致此错误”-还请确保您正确拼写了主机名。

我只花了一个多小时来尝试调试所有ssh设置,结果发现我在命令中拼写了amazonaws,这等同于上面的DNS解析失败注释。

0
Brad Dwyer

Asus RT68U路由器的固件(Merlin Asus)具有允许SSH端口转发的设置,必须启用该设置:

enter image description here

如以下所述设置了动态端口转发: 动态隧道故障排除

0
gatorback

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

0
Philippe De Muyter

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

0
meffect

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

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

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

-N -L 1234:localhost:1234
0
nobar

我的情况:

$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
diyism

其他名称解析原因:我的/ 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 [email protected] -L 3456:127.0.0.1:5901

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

0
Fjor

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

0
Data

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

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

0
Andre M