
我想透過 Linux 跳轉主機建立 SSH 隧道,方法如下:
主機A 是基於Windows 的,並具有用於與跳轉主機(主機B)進行身份驗證的私鑰主機B 是基於Linux 的,並且具有具有私鑰的不同用戶,用於與DMZ 中的主機進行身份驗證主機C 是基於Windows 的,並且只能透過 SSH(或實體)從主機 B 訪問,我已經嘗試過ssh -v -N user2@HostC -J user1@HostB -L [port]:HostC:[remote_port]
並且它正在工作,但只有密碼,它不斷要求它,儘管在所有必要的主機上都有密鑰。
有人可以幫忙解決這個話題嗎?
PS 如果我在所有三台主機上使用相同的金鑰對,它可以工作,但出於安全原因,我想使用具有不同金鑰對的不同用戶。
答案1
初步說明
- 我不使用 Windows,但希望這不會有太大影響。
- 通常,當我說「A」、「B」、「C」時,我真正的意思分別是「A 上的使用者」、「B 上的使用者 1」、「C 上的使用者 2」。例如,「B 的密鑰」表示「B 上可用的使用者 1 的密鑰」。這是為了簡潔起見。
分析
這是如何-J
運作:
-J destination
透過先與所描述的跳轉主機建立 ssh 連接destination
,然後建立從那裡到最終目的地的 TCP 轉送來連接到目標主機。
這ssh -J user1@B user2@C
意味著不是相當於從A連接到B,然後從B到C。 B 上沒有呼叫 SSH 用戶端,因此永遠不會使用允許您從 B 連接到 C 的金鑰。
解決方案
解決一般問題的最優雅的方法是讓 C 接受(或)A 的金鑰。你說:
如果我在所有三台主機上使用相同的金鑰對,它就可以工作,但出於安全原因,我想使用具有不同金鑰對的不同使用者。
您可以使用不同的對。據我所知,目前有一個密鑰對允許您從 A 連接到 B,還有一對單獨的密鑰對允許您從 B 連接到 C。在 C 上授權 A 用於進行身份驗證的任何金鑰。可能是舊密鑰(B上已授權的密鑰);但它可能是專門為此連接創建的新密鑰。
然後,當你ssh -J user1@B user2@C
在A上做的時候,你需要使用允許A連接到B的密鑰和允許 A 連接到 C 的密鑰。使用-i
如果需要的話一次甚至兩次。
替代解決方案
如果從A連線到B後實際從B連線到C,則可以使用已經註冊的金鑰。
# from A
ssh -t user1@B 'ssh user2@C'
(至少在 Linux 中是這樣;我不確定 Windows 中的參考是如何運作的)。
該命令ssh
在 B 上運行以連接到 C,因此它將使用 B 的密鑰。
關於連接埠轉發
您原來的指令使用了-N
and -L
,所以我知道唯一的目標是轉送連接埠。您使用 A 到 C 連接轉發端口,目的地也是 C;因此轉送封包的最後一站是從 C 上的 SSH 伺服器到 C。或許如果[remote_port]
是這樣,那麼您不需要上述任何解決方案;所有你需要的是:
ssh -NL [port]:C:[remote_port] user1@B
這將使轉送封包的最後一站是從 B 上的 SSH 伺服器到 C。
如果最後一站必須從 C 到 C,那麼行動方案取決於您選擇的解決方案。
在 C 上授權 A 金鑰的解決方案將允許您無需密碼即可使用原始命令。
在 B 上執行的解決方案
ssh
將要求您將連接埠從 A 轉送到 B,並分別從 B 轉送到 C。ssh -L [port]:localhost:[relay_port] user1@B 'ssh -NL [relay_port]:C:[remote_port] user2@C'