我正在尝试通过跳转箱进行 SSH,但 SSH 似乎有意检查跳转箱的主机密钥,尽管我使用常规-o StrictHostKeyChecking=no -o UserKnownHostsFile=no
命令行选项告诉它不要这样做。
如果我直接通过 SSH 连接到跳转箱,我可以让 SSH 按照预期忽略错误:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa jumpuser@jumpbox
但是,如果我添加代理跳转选项,我会突然收到错误。错误不是来自跳转箱,因为跳转箱上的任何 .ssh 目录中都没有 known_hosts 文件,我也没有以跳转用户身份登录:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa -J jumpuser@jumpbox [email protected]
错误信息:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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
我的常规用户在哪里user
,而不是我尝试以 SSH 身份使用的用户。
我不知道这是怎么回事。SSH 是否有一个特殊的覆盖,强制检查代理跳转情况下的主机密钥?如果有,那么至高无上令人恼火,因为它会让本地虚拟机配置变得非常麻烦。
答案1
发出ProxyJump
另一个ssh
进程,该进程不会继承您在第一个命令的命令行上指定的命令行参数ssh
。有两种可能的解决方法:
在配置文件中使用这些选项
~/.ssh/config
——它也可以为您节省大量的输入!Host jumpbox User jumpuser StrictHostKeyChecking=no UserKnownHostsFile=/dev/null IdentityFile ~/.ssh/id_jumpuser_rsa
然后您就可以像 一样连接。
ssh -J jumpbox [email protected]
改用
ProxyCommand
选项——它做同样的工作,但更透明,这样你就可以看到实际发生了什么:ssh -o ProxyCommand="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa -W %h:%p jumpuser@jumpbox" -i ~/.ssh/id_jumpuser_rsa [email protected]
答案2
根据@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}
如果您在数据中心内配置私有主机,它很有用。
答案3
作为一个热心的 Google 用户,这是我在 stackoverflow 上找到的第一个结果。
要通过 jumpbox/bastion 进行 ssh,无需任何麻烦,也无需修改系统等。那么您必须将StrictHostKeyChecking=no
二者用于代理会话,即 jumper。您还必须StrictHostKeyChecking=no
在 proxy_command 中使用。
此外,不要太自作聪明,尝试使用UserKnownHostsFile=/dev/null
session 或 proxy_command,因为你的 shell 在管道传输时会丢失上下文并失败。我没有进一步排除故障。
这条命令是在我通过以下方式从新建实例干净地下载文件到本地工作站时发现的:地形 local-exec
提供者
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>