0%

ssh config

ssh 設定

ssh 是遠端操控 unix 基礎的好工具。
因為 ssh 的強大,所以 ssh 的選項特別多和繁雜。
如果要簡化這些,有些聰明的方法。
就是透過 ssh config 把常用的設定放在設定檔中。

讓我們來看看我們有那些可以設定。

  • 別名
  • ip/hostname
  • user
  • key file
  • port
  • host key checking
  • agent forward
  • local forward
  • remote forward
  • x11 forward
  • gateway port
  • proxycommand
  • proxyjump

別名 (host)

指定連線的別名,本來我們需要指定 user 和 ip 等資訊。
透過 host 可以指定為我們喜歡的別名。
而這個別名可以包含其他更多的選項及設定。
如果是常常使用的連線,可以節省很多宅宅的生命。

1
2
3
4
5
6
7
8
9
host vps
hostname 1.2.3.4
user ubuntu
port 3322
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
ProxyCommand ssh v-n nc %h %p
LocalForward 5005 172.17.0.2:5005
LocalForward 3128 proxy.hinet.net:80

上面的是在 .ssh/config 裡的一個連線的設定。
原來我們用指令要輸入的可能是

1
2
$ ssh -p 3322 -i ~/.ssh/id_rsa -L 5005:172.17.0.2:5005 \
-L 3128:proxy.hinet.net:80 ubuntu@1.2.3.4

有了前面 .ssh/config 中的設定,現在只要用 ssh vps 就可以代表上面長長一串的ssh 選項。
是不是讓我們浪費的生命舜間少了很多。

下面我們再對其他的設定多些說明。

ip/hostname

我們還是以上面的config中的vps來說明.

1
hostname 1.2.3.4

這兒我們設定了 hostname 是 1.2.3.4 的 ip 。
也可以設定真正的 hostname ,例如 ns1.hinet.net 。

user

如果沒有指定 user ,ssh 一般是使用目前的用戶名來登入。
如果和遠端不同,就必須指定登入的用戶名。
我們在 .ssh/config 中指定就可以不必輸入不同的username。

1
user ubuntu

key file

我們的範例中指定的是預設的 identity file。
有時不同的遠端會使用不同的key file。例如 ~/.ssh/vps.pem 。
或是不同的位置。

1
IdentityFile ~/.ssh/id_rsa

port

遠端的機器可能為了安全的理由,將連線的 port 改為了不常用的 port。

1
port 3322

在我們的例子裡使用的是 3322 ,可能為任意值。

host key checking

ssh 是一個很注重安全的工具。
對於 server 機器也有相應的檢查機制。
只是如果遠端的機器的 ip 如果是跳動不固定的。
有時就會有一定的煩惱,每次都要去確認。
好處是我們會注意到遠端的改變,需要我們去注意這樣的變動。
缺點就是這樣的訊息有時也很惱人。

1
StrictHostKeyChecking no

有了上面的設定,就會直接在known_hosts加入而不在檢查。

agent forward

有時遠端的機器只是一個跳板,我們的ssh-agent可以轉發我們本機的key
為了安全,我們不該把 key 放在跳板機,那是相當危險的。
因為一些跳板機是很多不同的人都可以連到的,代表你的key有機會瀉漏出去。
透過 agent forward 就可以不用把 key 放在跳板機,又可以使用到 ssh key agent 的方便。
尤其是為了安全我們會讓 key file 加上 passphase,就算遠端安全。
passphase在連線時重複輸入也很煩人。
這時有了 agent forward 就可以簡化又不失安全。

1
ForwardAgent yes

local/remote/x11 forward

這些選項都需要輸入非常長的 ssh 選項,不小心打錯了就會想讓人砸了鍵盤。
有了設定檔,可以確保不會出錯,又少輸入了很多keyboard,少死了很多打字需要的細胞。

1
2
3
LocalForward 5005 172.17.0.2:5005
RemoteForward 3128 proxy.hinet.net:80
ForwardX11 yes

上面的設定讓本地的 5005 對應到遠端 172.17.0.2 的 5005 port。
remote forward部分是將遠端的 3128 port 對應到本地的 proxy.hinet.net 的 80 port。
ForwardX11 是讓本地的X11 server 對應到遠端的 x11,
讓遠端的 GUI 程式可以在本地的 x11 server 呈現。

gateway port

如果沒有指定(-g),只能本地的localhost可以對應 local forward,搭配 GatewayPorts yes
可以分享 local forward,讓區網的其他機器也可以連線到遠端的 port 。

1
GatewayPorts yes

ProxyCommand

有時為了安全,我們的遠端機器可能是位於內網的防火牆之內,
這時就需要透過 ProxyCommand 來連線。

1
ProxyCommand ssh j nc %h %p

上面的例子就是連線到遠端是透過 j 這台機器的 nc 建立 proxy 連線。

ProxyJump

這是一個比較新的選項。因為常常我們需要透過另一個 ssh 的連線來建立遠端的連線。
因些會有這個覺選項來讓透過 ssh 通道連線就有了這個選項。

1
2
3
4
5
6
7
host vps
hostname 1.2,3,4
user ubuntu
proxyjump j
host j
hostname 4.3.2.1
user j

上面的例子就是要建立 vps 的連線是透過 j 的 ssh 通道建立 vps的連線。

後記

ssh 的毛特別多,也說明他的功能特別強大。
值得多花些時間去了解,讓我們在遠端連線時更安全,更方便。