通过多个主机或堡垒的 SSH

A23*_*A23 5 ssh amazon-web-services

目前,按照正常程序,我们在云网络的每个公共子网中都有一个堡垒服务器,我们尝试通过以下配置访问它 -

Host webserverA
    User myuser
    Hostname 192.168.1.10
    ForwardAgent yes
    Port 22
    ProxyCommand ssh -q bastionA nc %h %p
    IdentityFile ~/webserver.pem
Run Code Online (Sandbox Code Playgroud)

有没有办法让我将此模型扩展到拥有另一个堡垒服务器?

堡垒B -> 堡垒A -> 网络服务器A ?

原因是我想将其视为信任链。当发生相当糟糕的事件时删除某些内容。

CoT 我的意思是,如果一组用户离开,我们可以更改第一组密钥,以便我们可以阻止他们进一步访问。

use*_*686 9

方法 1 – 洋葱(嵌套隧道)

使用 OpenSSH 7.3 及更高版本:

Host webserverA
    ProxyJump bastionA,bastionB
Run Code Online (Sandbox Code Playgroud)

通过命令行相同:

$ ssh -J bastionA,bastionB webserverA
Run Code Online (Sandbox Code Playgroud)

或者(也与 7.3 一起使用;不要将其与以上版本混用):

Host webserverA
    ProxyJump bastionB

Host bastionB
    ProxyJump bastionA
Run Code Online (Sandbox Code Playgroud)

使用旧版本 – 大部分相同(但不会自动复制选项,如ssh -v):

Host webserverA
    ProxyCommand ssh bastionB -W %h:%p

Host bastionB
    ProxyCommand ssh bastionA -W %h:%p
Run Code Online (Sandbox Code Playgroud)

此方法在本地启动所有连接,ssh -W为每个步骤设置隧道。因此,身份验证在本地发生(ForwardAgent 和 GSSAPIDelegateCredentials 不是必需的),并且您的本地.ssh/config身份也适用于每个步骤。服务器端,只需要基本的“TCP 转发”支持,与使用-W或时相同-L

然而,每一层都会增加额外的开销,因为它最终会在 SSH 中携带 SSH in SSH in SSH。

请注意,每个主机,除了最外面的一个,在它之前通过服务器列出一个 ProxyCommand。如果您有 3 个服务器,您将使用 [webserverA 通过 bastionC]、[bastionC 通过 bastionB] 和 [bastionB 通过 bastionA]。

方法 2 – 逐跳

Host webserverA
    ProxyCommand ssh bastionA -A ssh bastionB -W %h:%p
Run Code Online (Sandbox Code Playgroud)

此方法逐跳启动连接,ssh在每一跳上运行以连接到下一跳。因此ForwardAgent必须启用ssh-agent 并且必须启用(或者GSSAPIDelegateCredentials如果您使用 Kerberos);任何其他特殊.ssh/config设置都必须复制到所有堡垒主机。

另一方面,它产生较少的协议开销(每一步最多两层)。

(编辑:添加-A到始终请求代理转发。)