在管理外網服務器時,出於安全等因素的考慮,咱們通常不會把全部服務器都設置成可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" 表示不使用密碼登陸。spa
由於咱們已經把咱們電腦上的ssh的public key拷貝到目標機器的.ssh/authorized_keys文件裏了,理論上來講,應該是能夠登陸成功的,但上面的命令卻顯示登陸失敗,哪裏錯了呢?code
其實很簡單,ssh的key登陸是要public key和private key成對存在的,雖然public key已經拷貝到了目標機器,但咱們此時是在跳板機上,而跳板機上並無咱們本身機器的private key。進程
那咱們把private key拷貝到跳板機能夠不?it
不行,由於private key一旦拷貝到跳板機,那其餘能登陸到跳板機的人就均可以拿到咱們的private key了,這很是不安全。io
那怎麼辦呢?
這個問題其實能夠經過ssh的agent forwarding來解決,咱們先看下具體操做,而後再講解其工做原理。
咱們先退回到本身的機器上,而後執行如下流程:
$ 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 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跳板機的知識就講到這吧,但願對你們有所幫助。
完。
更多原創文章,請關注我微信公衆號: