使用 SSH ProxyCommand 來連上內網主機

By Shaform, Sat 28 October 2017, in category Notes

linux, SSH

以前使用 NLG 實驗室工作站時常會需要記下每台機器的 port 要如何連,感覺很不方便,於是就向學長學習,寫了類似像下面的 nlg 程式:

#!/bin/bash
NLG_WKS_3F={NLG_WKS_3F_HOST}
NLG_WKS_2F={NLG_WKS_2F_HOST}
case $1 in
    [3-9])
        ssh $USER@$NLG_WKS_3F -p 2200$MACHINE
        ;;
    "a")
        ssh $USER@$NLG_WKS_2F
        ;;
    "b")
        ssh $USER@$NLG_WKS_2F -p 22002
        ;;
    *)
        ;;
esac

如此一來,要連線時,只要打以下指令就行了:

nlg b

後來才知道,其實可以使用 .ssh/config 來設定連線的 Hosts。於是修改 .ssh/config 如下:

Host nlg-wks-2
User {USER}
HostName {NLG_WKS_3F_HOST}
Port 22002

Host nlg-wks-b
User {USER}
HostName {NLG_WKS_2F_HOST}
Port 22002

如此一來,要連線時,只要打以下指令就行了:

ssh nlg-wks-b

然而,由於奇怪的 port 對應,使得這麼做必須在 .ssh/config 裡增加許多行數。後來才發現,其實可以用 ProxyCommand 來做到先自動連上其中一台機器,再自動從那台機器連到內網的其他機器。

在連外網連不到的機器時,用 ProxyCommand 而非自己連兩次 ssh 還有一個好處,就是可以把用來認證的 ssh private key 存在本機,而不存在 NLG-WKS 伺服器裡,避免被同學偷看 private key,但卻可以用這個 private key 在跳板過程裡,用來認證最後想連上的主機。

實際作法如下,首先在 .ssh/config 新增用來跳板的主機:

Host nlgs
Hostname {NLG_WKS_3F_HOST}
User {USER}

緊接著新增跳板項目:

Host nlg-wks-*
User {USER}
ProxyCommand ssh -q -W %h:%p nlgs

具體的意思是,在連 nlg-wks-* 機器時,會先連上 nlgs 機器,然後再從 nlgsnlg-wks-* (因此 nlgs 機器本身,要看得懂 nlg-wks-* 才行,幸好之前在處理 LDAP 時已經順便把 DNS 都設了)。

如此一來,就能用以下指令,先跳到一個主機,再跳到其他主機了:

ssh nlg-wks-b

如此一來,就能更方便的做實驗了。