SSH Config 那些你所知道和不知道的事

SSH(Secure Shell)是什麼?是一項創建在應用層和傳輸層基礎上的安全協議,爲計算機上的 Shell(殼層)提供安全的傳輸和使用環境。也是專爲遠程登錄會話和其他網絡服務提供安全性的協議。它能夠有效防止遠程管理過程中的信息泄露問題。通過 SSH 可以對所有傳輸的數據進行加密,也能夠防止 DNS 欺騙和 IP 欺騙。

具體生成 SSH Key 方式請參考:Github ssh key生成,免密登錄服務器方法。這裏以 id_ecdsa(私鑰) 和 id_ecdsa.pub(公鑰) 爲例。

本篇文章主要介紹 SSH 相關的使用技巧。通過對 ~/.ssh/config 文件的配置你可以大大簡化 SSH 相關的操作,如:

Host example                       # 關鍵詞
    HostName example.com           # 主機地址
    User root                      # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa # 認證文件
    # Port 22                      # 指定端口

通過執行 $ ssh example 我就可以登錄我的服務器。而不需要敲更多的命令 $ ssh [email protected]。又如我們想要向服務器傳文件 $ scp a.txt example:/home/user_name。比以前方便多了。

更過相關幫助文檔請參考 $ man ssh_config 5

配置項說明

SSH 的配置文件有兩個:

$ ~/.ssh/config            # 用戶配置文件
$ /etc/ssh/ssh_config      # 系統配置文件

下面來看看常用的配置參數。

Host
用於我們執行 SSH 命令的時候如何匹配到該配置。

  • *,匹配所有主機名。
  • *.example.com,匹配以 .example.com 結尾。
  • !*.dialup.example.com,*.example.com,以 ! 開頭是排除的意思。
  • 192.168.0.?,匹配 192.168.0.[0-9] 的 IP。

AddKeysToAgent
是否自動將 key 加入到 ssh-agent,值可以爲 no(default)/confirm/ask/yes。

如果是 yes,key 和密碼都將讀取文件並以加入到 agent ,就像 ssh-add。其他分別是詢問、確認、不加入的意思。添加到 ssh-agent 意味着將私鑰和密碼交給它管理,讓它來進行身份認證。

AddressFamily
指定連接的時候使用的地址族,值可以爲 any(default)/inet(IPv4)/inet6(IPv6)。

BindAddress
指定連接的時候使用的本地主機地址,只在系統有多個地址的時候有用。在 UsePrivilegedPort 值爲 yes 的時候無效。

ChallengeResponseAuthentication
是否響應支持的身份驗證 chanllenge,yes(default)/no。

Compression
是否壓縮,值可以爲 no(default)/yes。

CompressionLevel
壓縮等級,值可以爲 1(fast)-9(slow)。6(default),相當於 gzip。

ConnectionAttempts
退出前嘗試連接的次數,值必須爲整數,1(default)。

ConnectTimeout
連接 SSH 服務器超時時間,單位 s,默認系統 TCP 超時時間。

ControlMaster
是否開啓單一網絡共享多個 session,值可以爲 no(default)/yes/ask/auto。需要和 ControlPath 配合使用,當值爲 yes 時,ssh 會監聽該路徑下的 control socket,多個 session 會去連接該 socket,它們會儘可能的複用該網絡連接而不是重新建立新的。

ControlPath
指定 control socket 的路徑,值可以直接指定也可以用一下參數代替:

  • %L 本地主機名的第一個組件
  • %l 本地主機名(包括域名)
  • %h 遠程主機名(命令行輸入)
  • %n 遠程原始主機名
  • %p 遠程主機端口
  • %r 遠程登錄用戶名
  • %u 本地 ssh 正在使用的用戶名
  • %i 本地 ssh 正在使用 uid
  • %C 值爲 %l%h%p%r 的 hash

請最大限度的保持 ControlPath 的唯一。至少包含 %h,%p,%r(或者 %C)。

ControlPersist
結合 ControlMaster 使用,指定連接打開後後臺保持的時間。值可以爲 no/yes/整數,單位 s。如果爲 no,最初的客戶端關閉就關閉。如果 yes/0,無限期的,直到殺死或通過其它機制,如:ssh -O exit。

GatewayPorts
指定是否允許遠程主機連接到本地轉發端口,值可以爲 no(default)/yes。默認情況,ssh 爲本地迴環地址綁定了端口轉發器。

HostName
真實的主機名,默認值爲命令行輸入的值(允許 IP)。你也可以使用 %h,它將自動替換,只要替換後的地址是完整的就 ok。

IdentitiesOnly
指定 ssh 只能使用配置文件指定的 identity 和 certificate 文件或通過 ssh 命令行通過身份驗證,即使 ssh-agent 或 PKCS11Provider 提供了多個 identities。值可以爲 no(default)/yes。

IdentityFile
指定讀取的認證文件路徑,允許 DSA,ECDSA,Ed25519 或 RSA。值可以直接指定也可以用一下參數代替:

  • %d,本地用戶目錄 ~
  • %u,本地用戶
  • %l,本地主機名
  • %h,遠程主機名
  • %r,遠程用戶名

LocalCommand
指定在連接成功後,本地主機執行的命令(單純的本地命令)。可使用 %d,%h,%l,%n,%p,%r,%u,%C 替換部分參數。只在 PermitLocalCommand 開啓的情況下有效。

LocalForward
指定本地主機的端口通過 ssh 轉發到指定遠程主機。格式:LocalForward [bind_address:]post host:hostport,支持 IPv6。

PasswordAuthentication
是否使用密碼進行身份驗證,yes(default)/no。

PermitLocalCommand
是否允許指定 LocalCommand,值可以爲 no(default)/yes。

Port
指定連接遠程主機的哪個端口,22(default)。

ProxyCommand
指定連接的服務器需要執行的命令。%h,%p,%r

如:ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p

User
登錄用戶名

相關技巧

管理多組密鑰對

有時候你會針對多個服務器有不同的密鑰對,每次通過指定 -i 參數也是非常的不方便。比如你使用 github 和 coding。那麼你需要添加如下配置到 ~/.ssh/config

Host github
    HostName %h.com
    IdentityFile ~/.ssh/id_ecdsa_github
    User git
Host coding
    HostName git.coding.net
    IdentityFile ~/.ssh/id_rsa_coding
    User git

當你克隆 coding 上的某個倉庫時:

# 原來
$ git clone [email protected]:deepzz/test.git

# 現在
$ git clone coding:deepzz/test.git

vim 訪問遠程文件

vim 可以直接編輯遠程服務器上的文件:

$ vim scp://[email protected]//home/centos/docker-compose.yml
$ vim scp://example//home/centos/docker-compose.yml

遠程服務當本地用

通過 LocalForward 將本地端口上的數據流量通過 ssh 轉發到遠程主機的指定端口。感覺你是使用的本地服務,其實你使用的遠程服務。如遠程服務器上運行着 Postgres,端口 5432(未暴露端口給外部)。那麼,你可以:

Host db
    HostName db.example.com
    LocalForward 5433 localhost:5432

當你連接遠程主機時,它會在本地打開一個 5433 端口,並將該端口的流量通過 ssh 轉發到遠程服務器上的 5432 端口。

首先,建立連接:

$ ssh db

之後,就可以通過 Postgres 客戶端連接本地 5433 端口:

$ psql -h localhost -p 5433 orders

多連接共享

什麼是多連接共享?在你打開多個 shell 窗口時需要連接同一臺服務器,如果你不想每次都輸入用戶名,密碼,或是等待連接建立,那麼你需要添加如下配置到 ~/.ssh/config

ControlMaster auto
ControlPath /tmp/%r@%h:%p

禁用密碼登錄

如果你對服務器安全要求很高,那麼禁用密碼登錄是必須的。因爲使用密碼登錄服務器容易受到暴力破解的攻擊,有一定的安全隱患。那麼你需要編輯服務器的系統配置文件 /etc/ssh/sshd_config

PasswordAuthentication no
ChallengeResponseAuthentication no

關鍵詞登錄

爲了更方便的登錄服務器,我們也可以省略用戶名和主機名,採用關鍵詞登錄。那麼你需要添加如下配置到 ~/.ssh/config

Host deepzz                        # 別名
    HostName deepzz.com            # 主機地址
    User root                      # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa # 認證文件
    # Port 22                      # 指定端口

那麼使用 $ ssh deepzz 就可以直接登錄服務器了。

代理登錄

有的時候你可能沒法直接登錄到某臺服務器,而需要使用一臺中間服務器進行中轉,如公司內網服務器。首先確保你已經爲服務器配置了公鑰訪問,並開啓了agent forwarding,那麼你需要添加如下配置到 ~/.ssh/config

Host gateway
    HostName proxy.example.com
    User root
Host db
    HostName db.internal.example.com                  # 目標服務器地址
    User root                                         # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa                    # 認證文件
    ProxyCommand ssh gateway netcat -q 600 %h %p      # 代理命令

那麼你現在可以使用 $ ssh db 連接了。

參考文檔

[1] https://www.freebsd.org/cgi/man.cgi?query=ssh_config

[2] https://zh.wikipedia.org/wiki/Secure_Shell

[3] http://wowubuntu.com/ssh-tips.html

本文原鏈接:https://deepzz.com/post/how-to-setup-ssh-config.html參與評論 »

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章