OpenSSH/Cookbook/客戶端配置檔案
客戶端配置檔案的使用,ssh_config(5),可能是最被低估和未被認識的功能,儘管它具有很大的實用性和靈活性。配置檔案可用於透過應用指定設定來建立特定系統或場景的快捷方式。客戶端,ssh(1),優先考慮作為執行時選項在命令列中應用的設定。然後應用使用者自己的配置檔案中的設定,通常是 ~/.ssh/config。最後,如果存在,將應用全域性客戶端設定,通常來自系統範圍的配置檔案 /etc/ssh/ssh_config。因此,正如在關於 客戶端配置檔案 的章節中提到的,優先順序如下
- 透過 shell 的執行時引數
- 使用者自己的配置
- 系統範圍的配置
即使在使用者的配置檔案和系統的全域性配置檔案中,也是應用第一個匹配的配置。因此,特定配置必須始終位於檔案開頭,而更通用的設定則位於檔案末尾。
配置檔案中的每個節都以 Host 或 Match 指令開頭。然後應用節中的指令(如果相關)。稍後將詳細介紹 Match。下面兩個主機都使用基本的 Host 指令設定了各自的快捷方式。兩個主機的設定之後是兩個更通用的節,適用於兩個完整的域。最後是一個應用 IdentitiesOnly 到所有傳出連線的節。
Host www
HostName www.example.org
User fred
IdentityFile %d/.ssh/fred.www.key
Host git
HostName git.example.org
User paz
IdentityFile %d/.ssh/paz.git.key
Host *.example.org
ConnectTimeout 2
AddKeysToAgent yes
Host *.example.com
ConnectTimeout 5
Port 2022
Host *
IdentitiesOnly yes
特定配置首先出現,並變得越來越通用,直到最後應用 IdentitiesOnly 到所有傳出會話。example.org 域中的主機使用預設的 SSH 埠 22,而 example.com 域中的主機使用埠 2022 覆蓋了預設埠。使用 example.org 域時,金鑰會自動新增到代理,而使用 example.com 域時則不會。
可以使用 ssh www 訪問第一個主機,使用 ssh git 訪問第二個主機。一般來說,最好設定 IdentitiesOnly,以便在身份驗證時只嘗試指定的金鑰。否則,金鑰將按其在代理中發現的順序嘗試,這可能是不可預測的。如果沒有 IdentitiesOnly,結果可能是連線因嘗試登入次數過多而被阻止,甚至在嘗試正確的金鑰之前就被阻止。
每個節都可以有多個快捷方式。
Host w www www.example.org
HostName www.example.org
User fred
IdentityFile %d/.ssh/example.org-fred.ed25519
上面,可以使用 ssh w、ssh www 或 ssh www.example.org 訪問同一個主機。
有時需要訪問同一遠端系統上的多個帳戶,每個帳戶都有一個單獨的金鑰。Match 塊在 ssh_config(5) 中可以將每個帳戶與其對應的金鑰配對。
Match host www.example.org user git
IdentityFile %d/.ssh/example.org-git.ed25519
Match host www.example.org user fred
IdentityFile %d/.ssh/example.org-fred.ed25519
Match host www.example.org user backup
IdentityFile %d/.ssh/example.org-backup.ed25519
Host www.example.org
IdentitiesOnly yes
AddKeysToAgent yes
上面,根據使用哪個帳戶,不同的金鑰將應用於同一個遠端主機。
LocalCommand 指令可以在身份驗證成功後啟動本地程式。如果將其與其他指令結合使用,則有很多可能性。這裡,一旦 VNC 隧道建立,客戶端就會連線到它。
Host make-tunnel tunnel
Hostname 198.51.100.120
User tunneler
IdentitiesOnly yes
IdentityFile %d/.ssh/tunneler-vnc-tunnel
LocalForward 5900 localhost:5900
ExitOnForwardFailure yes
PermitLocalCommand yes
LocalCommand remmina -c vnc://:0
LocalForward 建立隧道,而 PermitLocalCommand 和 LocalCommand 在隧道完成後將客戶端連線到隧道。如果隧道失敗,ExitOnForwareFailure 確保 SSH 會話結束,以便可以正確調查故障,而不是將客戶端連線到空閒狀態。
透過一層或多層 NAT 進行網路連線可能是一個問題。尤其是在越來越多的服務提供商提供的傳統 IPv4 網路中,載波級 NAT 變得越來越普遍的情況下。可以透過公共可訪問的第三臺機器在公共區域連線兩個端點。如果有三臺機器 A、B 和 C,其中 A 需要連線到 C,A 和 C 都無法直接連線到對方,但兩者都可以訪問主機 B,那麼如果 A 和 C 都可以訪問 B,就可以透過 B 建立隧道。A 和 C 都需要在 C 上擁有有效的帳戶,即使只是為了轉發。不需要完整的 shell 訪問許可權。
在主機 B 上,需要為 C 和 A 建立帳戶。
在主機 C 上
Host hostc
HostName server.example.com
IdentityFile %d/.ssh/test-fw6b
AddKeysToAgent yes
RemoteForward 7900 localhost:5900
RemoteForward 7901 localhost:5901
啟動 VNC 伺服器,然後讓系統使用 ssh hostc 建立到主機 B 的 SSH 連線。主機 B 的配置實際上不需要修改,除非需要鎖定隧道的金鑰或其他限制。
在主機 A 上
Host tunnel
LocalForward 5900 localhost:7900
LocalForward 5901 localhost:7901
PermitLocalCommand yes
LocalCommand remmina -c vnc://:0
ExitOnForwardFailure yes
透過輸入 ssh tunnel 啟動 SSH 連線,Remmina 將透過主機 C 上的隧道自動連線到主機 C。
系統範圍的客戶端配置檔案 /etc/ssh/sshd_config 是一種提供實際上是新的本地預設設定的便捷方法。正如多次提到的,配置選項是根據第一個匹配的優先順序應用的,因此任何系統範圍的全域性選項都應儘可能通用。當自定義本地環境時,系統範圍的預設設定非常有用,包括透過 Kerberos 身份驗證或甚至 基於主機的身份驗證 等方式進行 LAN 訪問,後者將在其自己的章節中介紹。
Host 172.16.4.*
HostKeyAlias a.pool.example.org
ConnectTimeout 4
Host 172.16.5.*
HostKeyAlias b.pool.example.org
ConnectTimeout 2
Host 172.16.*
HostbasedAuthentication yes
Host *
IdentitiesOnly yes
上面允許對特定子網進行基於主機的身份驗證。它還全域性設定 IdentitiesOnly。
Host *.pool.example.org
VerifyHostKeyDNS no
GSSAPIAuthentication yes
GSSAPIKeyExchange yes
GSSPITrustDNS yes
GSSAPIRenewalForcesRekey yes
GSSAPIDelegateCredentials yes
上面為 pool.example.org 域中的所有系統設定了系統範圍的選項,以便可以使用 Kerberos 身份驗證。
有關 ssh_config(5) 的手冊頁有一個關於“令牌”的部分,這些令牌可以在節中用於代替系統資訊,例如遠端主機名、遠端帳戶名或本地帳戶名等等。當在 /etc/ssh/ssh_config 或 /etc/ssh/ssh_config.d/* 中為所有本地帳戶設定系統範圍的客戶端配置檔案時,這些令牌非常有用。
一些客戶端配置指令可以使用令牌來代替某些值,這些值是在執行時確定的。
LocalCommand 接受所有令牌。
Hostname 接受令牌 %% 和 %h。
ProxyCommand 和 ProxyJump 接受令牌 %%、%h、%n、%p 和 %r。
CertificateFile、ControlPath、IdentityAgent、IdentityFile、KnownHostsCommand、LocalForward、Match exec、RemoteCommand、RemoteForward、RevokedHostKeys 和 UserKnownHostsFile 接受令牌 %%、%C、%d、%h、%i、%j、%k、%L、%l、%n、%p、%r 和 %u。
KnownHostsCommand 還接受令牌 %%、%C、%d、%f、%H、%h、%I、%i、%j、%K、%k、%L、%l、%n、%p、%r、%t 和 %u。
客戶端令牌的描述如下,與伺服器配置中使用的令牌有所不同
| 令牌 | 描述 |
|---|---|
| %% | 字面上的“%”。 |
| %C | %l%h%p%r%j 的雜湊值。 |
| %d | 本地帳戶的主目錄。 |
| %f | 遠端伺服器主機金鑰的指紋。 |
| %H | 搜尋的known_hosts主機名或地址。 |
| %h | 遠端主機名。 |
| %I | KnownHostsCommand執行的原因:當透過地址查詢主機時為 ADDRESS(僅當CheckHostIP啟用時),透過主機名搜尋時為 HOSTNAME,或者準備用於目標主機的金鑰演算法偏好列表時為 ORDER。 |
| %i | 本地帳戶的 UID。 |
| %j | ProxyJump 選項的內容,如果此選項未設定,則為空字串。 |
| %K | 遠端伺服器主機金鑰的 base64 編碼。 |
| %k | 如果指定了主機金鑰別名,則為別名,否則為命令列上給出的原始遠端主機名。 |
| %L | 本地主機名。 |
| %l | 本地主機名,包括域名。 |
| %n | 原始遠端主機名,如命令列中所給。 |
| %p | 遠端埠。 |
| %r | 遠端帳戶名。 |
| %T | 如果請求了隧道轉發,則分配的本地 tun(4) 或 tap(4) 網路介面,否則為“NONE”。 |
| %t | 伺服器主機金鑰的型別,例如 ssh-ed25519。 |
| %u | 本地帳戶名。 |
如往常一樣,請檢視所討論系統上的 ssh_config(5),以瞭解已安裝的 OpenSSH 版本實際支援的功能。