如何透過 SSH 連線到只能從跳轉主機尋址和存取的伺服器?

如何透過 SSH 連線到只能從跳轉主機尋址和存取的伺服器?

我可以透過 SSH 從本機 A 登入跳轉主機伺服器ssh BB。

伺服器 C 只能尋址(位址為 C.internal)並且可以透過 B 從伺服器 C 存取ssh C

如何直接從本機透過 SSH 連線到 C?

SSH 指令和設定檔是什麼樣的?

A 上的 ssh 設定:

Host B
    User userB
    HostName B.example.com
    IdentityFile ~/.ssh/keyB

B 上的 ssh 設定:

Host C
  HostName C.internal
  User userC
  IdentityFile ~/.ssh/keyC

是否可以在不~/.ssh/keyC從主機 B 複製到本機電腦 A 的情況下執行此操作?

答案1

有幾個選項,但沒有一個是「單一命令」:

您可以向 B 執行一個 SSH 指令,然後只向 C 執行第二個 SSH 指令;您需要新增-t選項以使其適用於互動式 SSH:

  • ssh -t hostB "ssh hostC"
  • ssh -t hostB "ssh -t hostC htop"
  • ssh hostB ssh hostC ls -la /etc

如果您想要一種從 A「直接」透過 SSH 到 C 的方法,您將需要一些額外的裝置來轉發 ssh-agent 連接從B到本機系統(即與通常情況相反ssh -A)。

  1. 透過 SSH 連接到主機 B,然後在手動指定的路徑啟動 ssh-agent。使用 SSH“流轉發”功能允許本地客戶端存取遠端代理進程:

    HostA$ ssh -t -L /tmp/agent:/tmp/agent HostB \
        "ssh-agent -a /tmp/agent sh -c 'ssh-add ~/.ssh/keyC && sleep infinity'"
    

    (ssh/config 選項是LocalForward。)

  2. 只要上述連線正在運行,您就可以使用常規 ProxyJump 配置從 HostA 連接到 HostC,並使用僅存在於 HostB 上的金鑰:

    HostA$ export SSH_AUTH_SOCK=/tmp/agent
    HostA$ ssh -J HostB HostC
    

    (ssh/config 選項是IdentityAgentProxyJump。)


另一種選擇是從 B 複製keyC到 A 並存儲在安全硬體上例如 TPM 晶片或智慧卡(具有 PIV 模式的 Yubikey 也算在內)。這允許在機器 A 上本地使用密鑰,而不會被盜。

(對於 Linux 上的 TPM2.0,您可以選擇tpm2-pkcs11ssh-tpm-agent;Windows 上的 TPM2.0 可以透過 PuTTY-CAC 使用。對於具有 PIV 的 Yubikey,有適用於 Windows 和 Linux 的 PKCS#11 模組。我正在使用來自Ebay 的eToken 5110。

答案2

您需要一個 ssh_config 文件,例如 global/etc/ssh/ssh_config或 as user ~/.ssh/config

Host B
  HostName 10.0.0.1
  User username_on_B
  IdentityFile ~/.ssh/id_rsa_for_B
  ForwardAgent yes

# final destination
Host C
  HostName C.internal
  User your_username_on_C
  ProxyJump B
  IdentityFile ~/.ssh/id_rsa_for_C

現在,從A,您可以ssh C

相關內容