利用ssh穿越多個跳板機最簡單最高效的辦法
【小宅按】對於雲計算環境下多跳網路拓撲更為常見,一級一級ssh登錄比較低效,拷貝文件更不方便了。本文描述一種方法,可對一個向上生長的樹形跳板拓撲的任意節點,按自定義名字進行簡單/直接/快速的ssh訪問和scp/sftp等文件拷貝。
一般大家知道ssh可以用~/.ssh/{id_rsa, id_rsa.pub, authorized_keys}三個文件進行無密碼登錄遠程ssh server進行命令行下的工作(若拷貝文件可以用scp/sftp)。但是對於雲計算環境下多跳網路拓撲更為常見,一級一級ssh登錄比較低效,拷貝文件更不方便了。本文描述一種方法,可對一個向上生長的樹形跳板拓撲的任意節點,按自定義名字進行簡單/直接/快速的ssh訪問和scp/sftp等文件拷貝。
1. 在每個節點產生公鑰私鑰對
- ssh-keygen -t rsa 運行此命令產生公鑰私鑰,一路回車可以不設置保護密碼
- 檢查是否產生了這倆文件 ~/.ssh/id_rsa,~/.ssh/id_rsa.pub
- 記住這個公鑰私鑰對所屬的用戶名
2. 把本機公鑰放到每一個直連下一跳的~/.ssh/authorized_keys
- cat ~/.ssh/id_rsa.pub | ssh username@next_jumper cat - >> ~/.ssh/authorized_keys, 此處需要username的密碼
- 嘗試ssh username@next_jumper 這時不需要密碼應該能登錄
- 對中間跳板機之間的每個登錄關係做如上驗證
3. 作為訪問起點的client需要額外設置
- 確保ssh client支持ProxyJump語句(openssh 7.5版本之後,mac mojave和ubuntu 18.04開始)
- 創建~/.ssh/config文件,描述跳板機的樹形級聯拓撲結構(下面舉例描述兩條路徑client->jumper1->jumper2a->jumper3->node1, client->jumper1->jumper2b->jumper4->node2|192.168.103.0/24, 注意,第一級jumper不帶ProxyJump語句, Port為22也可以預設不寫):
Host jumper1
User <user_of_jumper1>
Hostname <ip_of_jumper1>
Host jumper2a
User <user_of_jumper2a>
Port 2222
Hostname <ip_of_jumper2a>
ProxyJump jumper1
Host jumper2b
User <user_of_jumper2b>
Hostname <ip_of_jumper2b>
ProxyJump jumper1
Host jumper3
User <user_of_jumper3>
Hostname <ip_of_jumper3>
ProxyJump jumper2a
Host jumper4
User <user_of_jumper4>
Hostname <ip_of_jumper4>
ProxyJump jumper2b
Host node1 n1
User <user_of_node1>
Hostname <ip_of_node1>
ProxyJump jumper3
Host node2 n2
User <user_of_node2>
Hostname <ip_of_node2>
ProxyJump jumper4
Host 192.168.103.*
User <username_on_target>
ProxyJump jumper4
- 參照步驟2把client公鑰放置到每個葉子節點<node1, node2, 192.168.103.*>
4. 驗證如下命令,應可以無密碼執行
ssh node1
ssh n1
ssh node2
ssh n2
ssh 192.168.103.254
scp myfile node1:./
scp n1:./myfile /tmp/
sftp n2
sftp 192.168.103.2
5. client設置ControlMaster高速復用ssh連接
將如下加入到~/.ssh/config文件頂部,第一次ssh登錄之後再次ssh登陸,幾乎沒有無延時。一段時間內重用連接不需要認證過程(對於密碼登陸方式就是不要求輸入密碼了)
Host *
ServerAliveInterval 10
TCPKeepAlive yes
ControlPersist yes
ControlMaster auto
ControlPath ~/.ssh/master_%r_%h_%p
6.增量同步遠程機器的指定目錄
lftp這個老古董可以利用sftp經由ssh的config跳板通道,進行文件拷貝同步等動作。
#把client本地/root/project/下的文件增量同步到遠程n1上的/root/project/
lftp sftp://n1 -e "mirror -R /root/project/"
#把遠端n1上的/root/project/下的文件增量同步到client本地/root/project/
lftp sftp://n1 -e "mirror /root/project/"
# lftp還有多線程參數加速同步或者下載,讀者可自行發掘。
更多精彩內容,請滑至頂部點擊右上角關注小宅哦~