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

Nei*_*eil 241 ssh ssh-tunneling port-forwarding

当我打开这个 ssh 隧道时:

ssh -nXNT -p 22 localhost -L 0.0.0.0:8984:remote:8983
Run Code Online (Sandbox Code Playgroud)

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

channel 1: open failed: administratively prohibited: open failed
Run Code Online (Sandbox Code Playgroud)

这个错误是什么意思,你可以在哪台机器上解决这个问题?

hyp*_*air 172

通道 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)联机帮助页中的完整语法。

  • 需要注意的一个极端情况:当您尝试使用 SSH 创建一个 tap/tun 设备并且 SSH 允许时,您可能会收到此错误,但内核不允许。这可能发生在 LXC 容器中。有关确切的详细信息,请参阅 https://blog.felixbrucker.com/2015/10/01/how-to-enable-tuntap-inside-lxc/,但在这种情况下,您可能需要添加 `lxc.cgroup.devices。 allow = c 10:200 rwm` 到你的容器的配置,并确保如果 `/dev/net/tun` 不存在,`mknod /dev/net/tun c 10 200; chmod 666 /dev/net/tun` 在容器中启动时运行。 (5认同)
  • @St.Antario,“AllowTcpForwarding”允许您通过 SSH 转发 TCP 端口,这就是“-L 0.0.0.0:8984:remote:8983”参数所请求的。如果“AllowTcpForwarding”设置为“no”,SSH 将拒绝端口转发请求,导致您看到该错误。 (2认同)
  • 尝试将 `AllowTCPForwarding` 的大写字母编辑为 `AllowTcpForwarding`,但 SE 想要更改至少 6 个字符。所以请注意,正确的情况是第一次正确使用的 `Tcp` 版本。 (2认同)

cob*_*lla 67

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

ssh -L 1234:localhost:1234 user@remote
Run Code Online (Sandbox Code Playgroud)

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

教训:确保远程主机可以通过 DNS 或/etc/hosts.

  • 在我的情况下,这就像错误输入目标主机名一样简单,所以当然它没有解决,但我的眼睛太久没看到错别字了。 (3认同)
  • 谢谢,这对我来说是个问题。我在本地创建了 IP 的主机名,但不在远程 ssh 服务器上。 (2认同)
  • “您隧道的目标主机名”有点难以破译。你能给出一个具体可行的例子,让我以你的例子为例,用我的目标主机名(一旦我理解你的意思)替换你的例子中的“目标主机名”并进行这项工作? (2认同)
  • 我什至不确定你的评论是否有意义。您说远程计算机没有本地主机的条目。但接下来说远程主机必须解析*目标*主机名而不是本地主机名。同样,提供前后情况的完整具体示例也会有所帮助。 (2认同)
  • @TerrenceBrannon 在上面的命令中,“localhost”是 *tunnel* 的目标主机名。创建 SSH 隧道时,ssh 命令首先登录远程系统(“user@remote”),然后从远程端建立到列出的目标主机的隧道(在上面的命令中为“localhost”)。执行此操作时,它使用*远程*主机上的主机名解析方案。因此,如果您通过 SSH 连接的计算机无法解析“localhost”,您将收到此错误消息。 (2认同)

Nei*_*eil 28

至少有一个答案是,由于某种原因,使用 ssh 无法访问“远程”机器。错误信息是荒谬的。

  • +1,管理禁止的消息会让人相信它是防火墙阻塞,但是当没有防火墙阻塞但打开失败时您会收到相同的消息,因为没有到远程主机的路由。 (12认同)
  • 不,不是;我一直使用 icmp-admin-prohibited 作为防火墙配置中的拒绝标志。 (2认同)

小智 21

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

(与 Neil 的答案基本相同 - 但我确实发现这是我这边的问题)[我的文件中有机器名称的别名~/.ssh/config- 而远程机器对该别名一无所知......


小智 12

当您使用 ssh 选项ControlPathControlMaster共享一个套接字连接以在多个客户端连接(从一个客户端到同一用户@服务器)之间重用时,此错误最终会弹出。打开太多(不管它意味着什么,在我的情况下大约有 20 个连接)会产生此消息。关闭任何以前的连接让我打开更新,再次达到限制。

  • 小心,它不是`MaxSession`而是`MaxSessions`。尽管有一些保护措施,但不要破坏您的 ssh 服务器配置... (3认同)

tin*_*lyx 8

就我而言,我不得不替换localhost127.0.0.1

ssh -L 1234:localhost:3389 user@remote
Run Code Online (Sandbox Code Playgroud)

使其工作。

我试图rdesktop -L localhost:1234按照亚马逊关于通过 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
Run Code Online (Sandbox Code Playgroud)


Sha*_*dur 7

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

检查您的 iptables 设置。

  • 不必要。当主机无法为请求提供服务时生成该消息。这种情况通常是因为管理员阻止了连接,但也可能是它没有明确阻止但没有到所需主机的路由。AFAIK `ssh` 没有逻辑来确定连接失败的原因,它只是假设如果您尝试连接,则它存在,如果您无法到达那里,则连接必须被故意阻止。 (7认同)
  • 使用未解析的主机名时,我刚刚得到“行政上禁止”,所以它似乎是一个包罗万象的东西。也许 ssh 正在做一些翻译? (3认同)
  • 呃,没有。表示“没有到主机的路由”的 ICMP 响应类型和表示“管理禁止”的 ICMP 响应类型之间存在明显差异,除非有人故意错误配置路由器,否则后者的含义与它在锡上所说的完全相同。 (2认同)

小智 7

这也会发生在/etc/sshd_config

AllowTcpForwarding no 
Run Code Online (Sandbox Code Playgroud)

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


Tor*_*xed 5

我非常惊讶没有人提到这可能是 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)
Run Code Online (Sandbox Code Playgroud)

如果remote无法解析,或者您输入了一个未知的语法,就像我在这里所做的那样,我已经将 a 添加user@到端口转发逻辑(这将不起作用),则可能会出现这种情况。


lau*_*hub 5

一个类似的问题

另一个可能的线索

我在使用~/.ssh/authorized_keyswith 时遇到了同样的问题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
Run Code Online (Sandbox Code Playgroud)

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

channel 2: open failed: administratively prohibited: open failed
Run Code Online (Sandbox Code Playgroud)

在远端

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

Received request to connect to host 127.0.0.1 port 10001, but the request was denied.
Run Code Online (Sandbox Code Playgroud)

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

command="/home/user/tunnel",no-X11-forwarding,no-pty,permitopen="localhost:10000",permitopen="localhost:10001" ssh-rsa AAAA...
Run Code Online (Sandbox Code Playgroud)

如何解决

我通过替换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...
Run Code Online (Sandbox Code Playgroud)

SSH 似乎不明白这localhost是 的快捷方式127.0.0.1,因此消息 inauth.log管理上禁止的消息。

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