Если вы подключаетесь через 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"
Этот скрипт:
- Создаёт временный файл с настройками MAC для JumpHost;
- Подключается через -J, используя этот файл;
- Удаляет временный файл после себя.
Обратите внимание на 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.