Исправление ошибки SSH Corrupted MAC при подключении через JumpHost

Если вы подключаетесь через SSH с Windows на Linux через промежуточный хост (JumpHost), ошибка «Corrupted MAC on input» может превратиться в настоящий квест. Обычно её исправляют указанием MAC-алгоритма вручную – например, через -m hmac-sha2-256 или -o “MACs …”. Но когда в цепочке появляется JumpHost (-J), эти опции внезапно перестают работать. Почему? Давайте разберёмся, как обойти это ограничение только через командную строку, не трогая конфиги.

Почему JumpHost игнорирует параметры MAC

Когда вы используете -J, SSH создаёт вложенное подключение через промежуточный сервер. Вот в чём загвоздка: параметры командной строки (вроде -m или -o) применяются только к целевому хосту, а не к JumpHost. Это особенность реализации OpenSSH. Если упрощённо, команда вроде:

ssh -J user@jump_host -m hmac-sha2-256 user@target_host

…отправит -m к target_host, но не к jump_host. А ошибка MAC возникает как раз на этапе подключения к JumpHost. Отсюда и путаница.

Проверить это можно, добавив -vvv к команде – в выводе увидите, что для JumpHost запускается отдельный процесс SSH без ваших параметров.

Решение 1: Замена -J на ProxyCommand

Вместо -J используйте старый добрый ProxyCommand. Это даст контроль над обоими подключениями. Пример:

ssh -o "ProxyCommand=ssh -W %h:%p -m hmac-sha2-256 user@jump_host" user@target_host

Здесь:

  • -W %h:%p указывает пробросить соединение через JumpHost;
  • -m hmac-sha2-256 применяется именно к JumpHost (то, что нужно!).

Этот метод работает, потому что вы явно задаёте параметры для каждого этапа. Кстати, ProxyCommand – это то, что скрывается за -J в современных версиях OpenSSH (начиная с 7.3). Иногда «дедовские» методы оказываются гибче.

Решение 2: Временный конфиг для JumpHost

Если хочется использовать именно -J, придётся подружиться с опцией -F (указание альтернативного конфига). Но есть нюанс: файл конфигурации должен быть доступен для многократного чтения (JumpHost и целевой хост обращаются к нему отдельно).

Вариант для Zsh:

В Zsh можно создать временный файл «на лету» через =(…):

ssh -F =(echo -e "Host jump_hostn MACs hmac-sha2-256") -J user@jump_host user@target_host

Здесь =(…) создаёт временный файл с указанными настройками, который можно читать несколько раз.

Для других оболочек (Bash, Fish):

Придётся вручную создать временный файл:

TMP_CONF=$(mktemp)
cat << EOF > $TMP_CONF
Host jump_host
MACs hmac-sha2-256
Host *
Include ~/.ssh/config
EOF
ssh -F "$TMP_CONF" -J user@jump_host user@target_host
rm "$TMP_CONF"

Этот скрипт:

  1. Создаёт временный файл с настройками MAC для JumpHost;
  2. Подключается через -J, используя этот файл;
  3. Удаляет временный файл после себя.

Обратите внимание на Include ~/.ssh/config – это сохраняет ваши основные настройки SSH, добавляя к ним временные правки.

Почему не работают «быстрые» способы

Популярный совет вроде ssh -J user@jump_host -o “MACs …” user@target_host не сработает, потому что опция -o применится только к target_host. То же самое с попытками изменить порядок аргументов – SSH обрабатывает их в строгой последовательности.

Иногда помогает явное указание алгоритмов для обоих хостов (но это не гарантировано):

ssh -J user@jump_host -o "MACs hmac-sha2-256" -m hmac-sha2-256 user@target_host

Но если JumpHost упорно использует старый алгоритм, такой фокус не пройдёт. Лучше вернуться к ProxyCommand или временному конфигу.

Итог:

Чтобы победить «Corrupted MAC» при использовании JumpHost, либо:

1. Замените -J на ProxyCommand, явно задав параметры для JumpHost;

2. Создайте временный конфиг с -F, если настаиваете на -J.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное