轉,原文: https://segmentfault.com/a/1190000020326898?utm_source=tag-newest
----------------------------------------------------
在管理外網服務器時,出於安全等因素的考慮,我們一般不會把所有服務器都設置成可ssh直連,而是會從中挑選出一台機器作為跳板機,當我們想要連接外網服務器時,我們要先通過ssh登錄到跳板機,再從跳板機登錄到目標服務器。
下面我們用實驗來展示一下跳板機的登錄流程。
在該實驗中,我們用機器192.168.57.3來代表目標服務器,該服務器不能ssh直連,只能通過跳板機連接,用機器192.168.56.5來代表跳板機,該跳板機可以用ssh直接連接。
為了方便測測試,我們先把我們自己電腦上的ssh的public key拷貝到跳板機及目標服務器的.ssh/authorized_keys文件里,這樣我們就可以無密碼登錄了。
下面是測試流程:
- ssh登錄跳板機。
$ ssh u3@192.168.56.5 Last login: Sun Sep 8 19:51:48 2019 from 192.168.56.1 u3@h3:~$
- 從跳板機登錄到目標服務器。
u3@h3:~$ ssh -o "PasswordAuthentication no" u2@192.168.57.3 u2@192.168.57.3: Permission denied (publickey,password).
該命令中的參數 -o "PasswordAuthentication no" 表示不使用密碼登錄。
因為我們已經把我們電腦上的ssh的public key拷貝到目標機器的.ssh/authorized_keys文件里了,理論上來說,應該是可以登錄成功的,但上面的命令卻顯示登錄失敗,哪里錯了呢?
其實很簡單,ssh的key登錄是要public key和private key成對存在的,雖然public key已經拷貝到了目標機器,但我們此時是在跳板機上,而跳板機上並沒有我們自己機器的private key。
那我們把private key拷貝到跳板機可以不?
不行,因為private key一旦拷貝到跳板機,那其他能登錄到跳板機的人就都可以拿到我們的private key了,這非常不安全。
那怎么辦呢?
這個問題其實可以通過ssh的agent forwarding來解決,我們先看下具體操作,然后再講解其工作原理。
我們先退回到自己的機器上,然后執行以下流程:
- 開啟ssh-agent,然后將我們的private key添加到ssh-agent中。
$ eval $(ssh-agent)
Agent pid 8350 $ ssh-add Identity added: /home/yt/.ssh/id_rsa (yt@arch) Identity added: /home/yt/.ssh/id_ed25519 (yt@arch)
- ssh登錄到跳板機(不過此次加上了-A參數,表示開啟agent forwarding)。
$ ssh -A u3@192.168.56.5 Last login: Sun Sep 8 21:13:01 2019 from 192.168.56.1 u3@h3:~$
- 從跳板機登錄到目標機器。
u3@h3:~$ ssh u2@192.168.57.3 Last login: Sun Sep 8 20:45:03 2019 from 192.168.57.4 u2@h2:~$
由上可見,這次從跳板機登錄目標機器是成功了的,原因就是我們開啟了agent forwarding,但它是怎么幫助我們從跳板機上登錄目標機器的呢?
當我們在跳板機上ssh登錄目標機器時,目標機器會要求跳板機用對應的ssh的private key做認證,但跳板機是沒有這個key的,這個key保存在我們自己的電腦上,又因為我們在從自己的電腦ssh登錄跳板機時開啟了agent forwarding,所以跳板機會把該認證請求轉發給我們自己的電腦,我們自己電腦在收到這個認證請求時,會找ssh-agent進程進行認證,而又因為開始的時候,我們通過ssh-add命令將我們的private key加入到了ssh-agent中,所以,此次認證是成功的,我們的機器把認證結果再轉給跳板機,跳板機再將該結果轉給目標機器,就這樣,在跳板機沒有我們的ssh的private key的情況下,登錄目標機器還是成功了。
這個就是跳板機的登錄流程,不過,這只是一種最基本的方式,其實還有更簡單的方式,我們還是用實驗看下。
還是先退回到我們自己的機器,然后執行下面的命令:
$ ssh -J u3@192.168.56.5 u2@192.168.57.3 Last login: Sun Sep 8 21:09:13 2019 from 192.168.57.4 u2@h2:~$
喔,居然用一條命令就直接成功了,根本就沒有經歷從跳板機到目標機器的過程。
該命令中的-J參數是用來指定跳板機的,該命令執行后,ssh會幫我們先登錄跳板機,然后再登錄目標機器,一切都是自動的。
用-J參數指定跳板機還有一個好處就是在使用scp拷貝文件時更加方便。
如果是普通方式,我們要先將文件拷貝到跳板機上,再從跳板機上拷貝到目標機器,非常麻煩,如果使用-J參數,我們用一條命令就可以搞定了。
$ scp -J u3@192.168.56.5 abc.txt u2@192.168.57.3:/home/u2/ abc.txt
完美!
有關ssh跳板機的知識就講到這吧,希望對大家有所幫助。
完。
更多原創文章,請關注我微信公眾號: