跳轉到內容

OpenSSH/Cookbook/客戶端配置檔案

100% developed
來自華夏公益教科書

 

SSH 客戶端配置檔案

[編輯 | 編輯原始碼]

客戶端配置檔案的使用,ssh_config(5),可能是最被低估和未被認識的功能,儘管它具有很大的實用性和靈活性。配置檔案可用於透過應用指定設定來建立特定系統或場景的快捷方式。客戶端,ssh(1),優先考慮作為執行時選項在命令列中應用的設定。然後應用使用者自己的配置檔案中的設定,通常是 ~/.ssh/config。最後,如果存在,將應用全域性客戶端設定,通常來自系統範圍的配置檔案 /etc/ssh/ssh_config。因此,正如在關於 客戶端配置檔案 的章節中提到的,優先順序如下

  1. 透過 shell 的執行時引數
  2. 使用者自己的配置
  3. 系統範圍的配置

即使在使用者的配置檔案和系統的全域性配置檔案中,也是應用第一個匹配的配置。因此,特定配置必須始終位於檔案開頭,而更通用的設定則位於檔案末尾。

SSH 客戶端配置基礎

[編輯 | 編輯原始碼]

配置檔案中的每個節都以 HostMatch 指令開頭。然後應用節中的指令(如果相關)。稍後將詳細介紹 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 wssh wwwssh 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

上面,根據使用哪個帳戶,不同的金鑰將應用於同一個遠端主機。

建立隧道後自動啟動本地 VNC

[編輯 | 編輯原始碼]

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 建立隧道,而 PermitLocalCommandLocalCommand 在隧道完成後將客戶端連線到隧道。如果隧道失敗,ExitOnForwareFailure 確保 SSH 會話結束,以便可以正確調查故障,而不是將客戶端連線到空閒狀態。

透過共同可訪問的外部主機進行 VNC - 方法一

[編輯 | 編輯原始碼]

透過一層或多層 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。

ProxyCommandProxyJump 接受令牌 %%、%h、%n、%p 和 %r。

CertificateFileControlPathIdentityAgentIdentityFileKnownHostsCommandLocalForwardMatch execRemoteCommandRemoteForwardRevokedHostKeysUserKnownHostsFile 接受令牌 %%、%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。

客戶端令牌的描述如下,與伺服器配置中使用的令牌有所不同

OpenSSH 客戶端配置令牌查詢表
令牌 描述
%% 字面上的“%”。
%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 版本實際支援的功能。

 

華夏公益教科書