- Вопрос или проблема
- Немного подробнее
- Ответ или решение
- Как исправить ошибку "open failed: administratively prohibited: open failed" при использовании SSH-туннелирования
- 1. Проверка параметров конфигурации SSH-сервера
- 2. Проверка разрешений на агент SSH
- 3. Поиск проблем с разрешением имен
- 4. Убедитесь в правильности команд
- 5. Настройка сертификатов (если применимо)
- 6. Идентификация и обход ошибок
- Заключение
Вопрос или проблема
Я использую SSH-туннель на Windows (с использованием Putty) уже какое-то время.
На Windows с Putty всё всегда нормально, но на Mac или Cygwin иногда появляется сообщение об ошибке:
open failed: administratively prohibited: open failed
Я полагаю, что вы отключили TCP-перенаправление на сервере. В файле конфигурации вашего сервера /etc/ssh/sshd_config
убедитесь, что следующая строка отсутствует или закомментирована; если нет, закомментируйте её.
AllowTcpForwarding no
Существует более широкое обсуждение этой ошибки с SSH-туннелями на Unix StackExchange. В двух словах, это не специфическая ошибка; существует множество возможностей, которые следует исследовать.
Если в конфигурации sshd уже есть все параметры для включения перенаправления портов, но вы все равно получаете эту проблему, проверьте /var/log/secure
на наличие чего-то вроде этого – sshd: error: connect_to XXX: unknown host (Name or service not known)
Если SSH-хост не может разрешить хост, к которому вы хотите туннелировать, он вернёт общую ошибку о том, что невозможно открыть канал.
Дважды проверьте имя хоста туннеля или разрешение DNS на SSH-сервере.
open failed: administratively prohibited: open failed
Это означает, что служба SSH (на удалённом сервере) не позволяет перенаправление SSH-агента (AllowAgentForwarding no
).
Если вы не можете изменить конфигурацию на удалённом сервере, вы всё равно можете выполнить SSH на один сервер, а затем на другой.
Обычно вы могли бы использовать опцию ProxyJump
в вашем .ssh/config
, но в этом случае вы не можете.
Вы можете попробовать принудительно отключить перенаправление агента на вашем клиенте (ForwardAgent no
), что, вероятно, не сработает.
Если вы хотите выполнить SSH на сервер Y через сервер X, то как обходное решение вы можете определить следующий раздел в файле конфигурации SSH:
Host remotehost
ForwardAgent no
HostName 192.168.X.IP
RemoteCommand ssh 192.168.Y.IP
RequestTTY yes
После загрузки вы можете просто выполнить: ssh remotehost
.
Просто для истории, даже если это не полезно вам конкретно
Ошибки выводятся в вашу консоль через stderr, так что если вы просто хотите игнорировать их, добавление 2>/dev/null
в конец вашего вызова ssh
будет работать идеально. Например:
ssh -C -D 3210 example@connexion 2>/dev/null
Это полезно, если прокси-туннель фактически работает нормально, но вы просто не хотите видеть ошибки.
В моем случае: машина, к которой я туннелю, не моя, так что я не могу изменить sshd_config
(не то чтобы это было вашей проблемой), и я также использую тот же соединение для оболочки. Появление этих сообщений об ошибках в моей консоли во время открытого окна vim вызывает довольно раздражающее поведение дисплея.
У меня была проблема с аналогичными симптомами. Однако в конечном итоге моя проблема была связана с хранилищем и tcpforwarding с учётными данными, предоставленными хранилищем.
Когда вы создавали файл signed-cert.pub
, как указано в документации, вы можете столкнуться с проблемами, потому что существует параметр permit-port-forwarding
, который должен быть включён.
Проверьте сертификат, который вы создали с помощью хранилища, следующим образом:
ssh-keygen -Lf signed-cert.pub
Вы должны увидеть следующий результат:
signed-cert.pub:
Type: [email protected] user certificate
Public key: RSA-CERT SHA256:somehash
Signing CA: RSA SHA256:somehash (using rsa-sha2-256)
Key ID: "vault-token-somehash"
Serial: somehash
Valid: from 2024-01-01T14:44:04 to 2024-01-01T14:46:34
Principals:
ubuntu
Critical Options: (none)
Extensions:
permit-port-forwarding
permit-pty
В моём случае у меня не было включено permit-port-forwarding
. Вы должны иметь что-то аналогичное следующему коду:
vault write ssh-client-signer/roles/my-role -<<"EOH"
{
"algorithm_signer": "rsa-sha2-256",
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": {
"permit-pty": "",
"permit-port-forwarding": ""
},
"key_type": "ca",
"default_user": "ubuntu",
"ttl": "30m0s"
}
EOH
Вы можете подумать, что это то же самое, что и в документации, но в разделе default_extensions
отсутствует свойство permit-port-forwarding
(не знаю почему, так как они указали его в allowed_extensions
).
Таким образом, в случае хранилища это не AllowTcpForwarding
, что я продолжал видеть снова и снова при отладке.
Немного подробнее
Я хотел бы предоставить немного больше информации, потому что эта на вид простая проблема заняла у меня несколько дней для решения.
Я использовал команду для подключения к ssh-хосту следующим образом:
ssh -v -i signed-cert.pub -i ~/.ssh/id_rsa -L 5432:localhost:5432 -N $SERVER_USER@$SERVER_ADDR
Команда работала правильно (я включил -v
, чтобы дать больше информации), однако, когда я хотел подключиться (в моем случае с postgres) с помощью команды psql -h localhost -p 5432 -U username -W
, я получал следующий ответ:
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
И когда я перехожу в терминал с командой ssh, я получал следующее:
debug1: channel 1: new [direct-tcpip]
channel 1: open failed: administratively prohibited: open failed
debug1: channel 1: free: direct-tcpip: listening port 5432 for localhost port 5432, connect from 127.0.0.1 port 32924 to 127.0.0.1 port 5432, nchannels 2
Это сообщение привело меня сюда, сюда, сюда и на множество других сайтов снова и снова.
После долгой отладки, обновления ОС, кучи изменений в конфигурации и около 4 дней, я осознал, что мог делать туннелирование с моего компьютера, даже с параметрами. После множества дополнительных тестов (играясь с /etc/hosts
, ip4
и .ssh/authorized_keys
модификациями) я понял, что мой компьютер переопределял -i signed-cert.pub -i ~/.ssh/id_rsa
, когда у меня есть мой ssh ключ в .ssh/authorized_keys
. Это был момент «Эврика», который привёл меня к следующей странице и этой части документации хранилища, в которой я задумался, почему в мире они не включают эту часть с самого начала? Они активируют расширение, но не включают его.
Другим важным аспектом были логи из /var/log/auth.log
, упомянутые время от времени в моих поисках (этот лог принадлежит серверу).
Jan 1 14:10:15 ip-172-26-3-55 sshd[496555]: refused local port forward: originator 127.0.0.1 port 32924, target localhost port 5432
В любом случае, я пишу этот ответ с несколькими логами в надежде, что, если у кого-то будет та же проблема, они обратятся сюда, получив информацию из логов. Удачи!
Для меня проблема заключалась в том, что я указал -L 9999:[email protected]:8443
вместо -L 9999:192.168.0.111:8443
Ответ или решение
Как исправить ошибку "open failed: administratively prohibited: open failed" при использовании SSH-туннелирования
Ошибка "open failed: administratively prohibited: open failed" может возникнуть при попытке установить SSH-туннель, и она указывает на проблемы с настройками SSH-сервера или конфигурацией туннеля. В данном ответе мы рассмотрим несколько возможных причин этой ошибки и способы их устранения.
1. Проверка параметров конфигурации SSH-сервера
Первым делом проверьте файл конфигурации SSH-сервера, который обычно находится по пути /etc/ssh/sshd_config
. Вам нужно убедиться, что следующие параметры настроены правильно:
-
Убедитесь, что параметр
AllowTcpForwarding
не установлен вno
. Если эта строка присутствует, закомментируйте её или измените наyes
:# AllowTcpForwarding no AllowTcpForwarding yes
-
После изменения файла конфигурации перезапустите службу SSH:
sudo systemctl restart sshd
2. Проверка разрешений на агент SSH
Если вы используете SSH-агент для управления ключами, убедитесь, что на сервере включено перенаправление агента SSH. Для этого проверьте, установлен ли параметр AllowAgentForwarding
в yes
в файле sshd_config
:
AllowAgentForwarding yes
3. Поиск проблем с разрешением имен
Если сервер SSH не может разрешить имя хоста, к которому вы пытаетесь подключиться, это также может привести к этой ошибке. Проверьте файл /etc/hosts
или выполните тестовые запросы в командной строке, чтобы убедиться, что хост доступен:
ping <hostname>
Кроме того, проверьте логи сервера SSH, обычно находящиеся в /var/log/auth.log
или /var/log/secure
, чтобы увидеть возможные ошибки.
4. Убедитесь в правильности команд
Проверьте команду, которую вы используете для создания SSH-туннеля. Например, ошибка может возникнуть, если вы указываете неправильный формат:
ssh -L 9999:<hostname>:<port> user@ssh_server
Убедитесь, что <hostname>
— это IP-адрес или корректное имя хоста, и что порт доступен для локального подключения.
5. Настройка сертификатов (если применимо)
Если вы используете подписанные сертификаты SSH (например, с Vault), убедитесь, что в их параметрах (например, permit-port-forwarding
) указано разрешение на форвардинг портов. Вы можете проверить сертификат с помощью следующей команды:
ssh-keygen -Lf signed-cert.pub
Убедитесь, что в разделе Extensions
присутствует:
permit-port-forwarding
Если эта опция отсутствует, вы можете добавить её с помощью правильной конфигурации Role в Vault.
6. Идентификация и обход ошибок
Если после выполнения всех вышеперечисленных шагов проблема не устранена, вы можете рассмотреть возможность игнорирования ошибки, добавив 2>/dev/null
к вашей команде SSH. Однако это не является решением проблемы, а только временной мерой:
ssh -C -D 3210 user@ssh_server 2>/dev/null
Заключение
Ошибка "open failed: administratively prohibited: open failed" может быть вызвана различными проблемами, начиная от неправильных настроек конфигурации SSH-сервера и заканчивая проблемами с разрешением имен. Убедитесь, что вы проверили все перечисленные аспекты, и теоретически проблема должна быть решена. Если вы не имеете доступа к SSH-серверу для внесения необходимых изменений, возможно, вам стоит обратиться к администратору системы.