我在 Openstack 上的堡垒后面运行了一些测试服务器。测试堆栈经常被删除和创建。创建堆栈后,我运行一组 Ansible 脚本来安装和配置服务器。我几乎完全自动化了这个过程,但当ssh-keyscan
远程主机位于堡垒主机后面时,我似乎无法开始工作。
这就是我所拥有的~/.ssh/config
Host bastion
HostName 1.2.3.4
User myuser
IdentityFile ~/.ssh/private_key.pem
Host remote-host1
HostName 192.168.0.123
User myuser
IdentityFile ~/.ssh/private_key.pem
ProxyCommand ssh -W %h:%p bastion
如果我尝试跑步,ssh-keyscan remote-host1
我会
getaddrinfo remote-host1: Name or service not known
运行ssh remote-host1
有效但会提示
The authenticity of host '192.168.0.123 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?
我正试图避免这种情况。
我知道有一个 SSH 选项-o StrictHostKeyChecking=no
,可以使用ssh_args
配置选项将其传递给 Ansible。但我不想使用它。我还知道,使用 ssh-keyscan 而不检查指纹会导致中间人攻击。在这个测试环境场景中,我愿意承担风险,因为只有我的 IP 被列入白名单才能访问。
答案1
快速谷歌搜索建议ssh-keyscan 不遵守 ssh 配置文件和所有其他 ssh 技巧。(虽然这个线程很旧了)。
使用 Ansible,您可以将 keyscan 任务委托给您的堡垒主机,然后在本地附加您的 known_hosts 文件:
- hosts: localhost
gather_facts: no
tasks:
- command: "ssh-keyscan {{ new_host }}"
register: new_host_fingerprint
delegate_to: bastion
- lineinfile:
dest: /root/ssh/known_hosts
line: "{{ item }}"
with_items: "{{ new_host_fingerprint.stdout_lines }}"
其中new_host
是创建主机的 IP 地址(在您的示例中为 192.168.0.123)。
答案2
SSH 到堡垒并ssh-keyscan
从那里运行:
ssh bastion ssh-keyscan remote-host1