I am trying to SSH through a jumpbox, but SSH seems to be intent on checking host keys for the jumpbox, even though I'm telling it not to, using the normal -o StrictHostKeyChecking=no -o UserKnownHostsFile=no
command line options.
If I SSH directly to the jumpbox, I can have SSH ignore the error as expected:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa jumpuser@jumpbox
However, if I add the proxy jump option, I suddenly get the error. The error is NOT coming from the jumpbox there are no known_hosts files in any .ssh directory on the jumpbox, nor am I logging in as the jumpuser:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa -J jumpuser@jumpbox jumpuser@10.10.0.5
The error message:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
<redacted>.
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user/.ssh/known_hosts:10
remove with:
ssh-keygen -f "/home/user/.ssh/known_hosts" -R jumpbox
ECDSA host key for jumpbox has changed and you have requested strict checking.
Host key verification failed.
ssh_exchange_identification: Connection closed by remote host
Where user
is my regular user, not the user I am attempting to SSH as.
I have no clue what's going on here. Does SSH have a special override forcing hostkey checking for proxy jump situations? If so, it's supremely irritating, as it's going to make local VM provisioning a real pain.
ProxyJump запускает другой процесс ssh
, который не наследует аргументы командной строки, которые вы указываете в командной строке первой команды ssh
. Есть два возможных выхода:
Использовать эти опции в конфигурационном файле в ~/.ssh/config
-- это может сэкономить вам массу текста!
Host jumpbox
Пользовательский перемычка
StrictHostKeyChecking=нет
UserKnownHostsFile=/dev/null
Файл идентификатора ~/.ssh/id_jumpuser_rsa
, а затем вы можете подключиться так же, как ssh -J jumpbox jumpuser@10.10.0.5
.
Используйте вместо этого ProxyCommand
- он делает ту же самую работу, но более прозрачно, чтобы вы могли видеть, что на самом деле там происходит:
ssh -o ProxyCommand="ssh -o StrictHostKeyChecking=нет -o UserKnownHostsFile=/dev/null -i ~/. ssh/id_jumpuser_rsa -W %h:%p jumpuser@jumpbox" -i ~/.ssh/id_jumpuser_rsa jumpuser@10.10.0.5
Я был заядлым гуглером, и это мой первый результат для stackoverflow.
Для ssh через jumpbox / бастион без всяких хлопот, без системных модификаций и т. Д. Тогда вы должны использовать StrictHostKeyChecking = no
как для прокси-сеанса, перемычка. Также вы должны использовать StrictHostKeyChecking = no
в своей команде proxy_command.
Кроме того, не слишком умничай и пытайся использовать UserKnownHostsFile = / dev / null
для сеанса или для proxy_command, потому что ваша оболочка потеряет контекст при подключении по конвейеру и просто выйдет из строя. Я больше не устранял неполадки.
Эта команда была обнаружена при чистой загрузке файла из вновь созданного экземпляра на мою локальную рабочую станцию через Terraform local-exec
Provisioner
ssh -i ssh_server_key.pem -o StrictHostKeyChecking=no -o ProxyCommand="ssh -o StrictHostKeyChecking=no -i ssh_server_key.pem ec2-user@<BASTION_IP> nc <INTERNAL_IP> 22" ubuntu@<INTERNAL_IP>
Из отличного ответа @Jakuje я сделал этот сценарий для общего извлечения файлов через хост-бастион:
#!/usr/bin/env bash
set -e
ME=$(basename $0)
log_() { echo "[$ME] $@"; }
PRIVATE_IP=$1
BASTION=$2
SOURCE=$3
TARGET=$4
USER=${5:-ubuntu}
BASTION_USER=${6:-$USER}
log_ Copying ${USER}@${PRIVATE_IP}:${SOURCE} to ${TARGET} via ${BASTION_USER}@${BASTION}
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-o ProxyCommand="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -l ${BASTION_USER} -W ${PRIVATE_IP}:22 ${BASTION}" \
${USER}@${PRIVATE_IP}:${SOURCE} ${TARGET}
Это полезно, если вы настраиваете частный хост внутри центра обработки данных.