S(ecure)SH(hell) 廣泛用於伺服器連線。除了單純連線之外,還有許多細節值得了解:

  • 埠轉發
  • 用戶端選項
  • 伺服器端選項

埠轉發可以把本機某個埠上的網路流量重新導向到遠端機器的另一個埠,反之亦然。

1. 埠轉發

埠轉發是最常使用的功能。基本上有三種:

  1. 本機埠轉發(Local port forwarding)
  2. 遠端埠轉發(Remote port forwarding)
  3. 動態埠轉發(Dynamic port forwarding)

1.1 本機埠轉發

本機埠轉發是 SSH 的一項功能,可以把本機某個埠上的網路流量重新導向到遠端伺服器上指定的目的埠。它讓你可以存取遠端伺服器上的服務或資源,就像它們在本機上執行一樣。

ssh -L <local_port>:<destination_host>:<destination_port> <username>@<SSH_server>

在上面的指令中:

<local_port> 是想要在本機上重新導向流量的埠號。 <destination_host> 是想要把流量轉發過去的遠端機器主機名稱或 IP 位址。 <destination_port> 是遠端機器上想要把流量轉發過去的埠號。 <username> 是你在 SSH 伺服器上的使用者名稱。 <SSH_server> 是 SSH 伺服器的主機名稱或 IP 位址。

範例:

假設你想把本機 8080 埠的流量轉發到 IP 位址為 192.168.1.100 的遠端機器上、執行於 80 埠的網頁伺服器。可以使用以下指令:

ssh -L 8080:192.168.1.100:80 [email protected]

這個指令會建立與 ssh-server.example.com 的 SSH 連線,並把本機 8080 埠收到的所有流量轉發到遠端機器的 80 埠。

1.2 遠端埠轉發

遠端埠轉發是 SSH 的一項功能,可以把遠端伺服器某個埠上的網路流量重新導向到本機或本機所在區域網路內另一台機器的指定目的埠。它讓你可以把本機執行的服務或資源,暴露給遠端伺服器所在的網路。

ssh -R <remote_port>:<destination_host>:<destination_port> <username>@<SSH_server>

在上面的指令中:

<remote_port> 是想要在遠端機器上重新導向流量的埠號。 <destination_host> 是想要從遠端機器把流量轉發過去的機器主機名稱或 IP 位址。 <destination_port> 是目的機器上想要把流量轉發過去的埠號。 <username> 是你在 SSH 伺服器上的使用者名稱。 <SSH_server> 是 SSH 伺服器的主機名稱或 IP 位址。 遠端埠轉發讓你可以從本機存取遠端機器上的服務。

請確保你有這台伺服器的 SSH 存取權限,以及建立埠轉發所需的權限。

1.3 動態埠轉發

動態埠轉發讓你可以在本機上建立一個 SOCKS 代理,透過 SSH 通道路由流量,並從遠端伺服器出口。

ssh -D <local_port> [email protected]

<local_port> 換成想要用於 SOCKS 代理的埠號。預設情況下,它會綁定到 localhost。

SSH 連線建立之後,把應用程式(例如瀏覽器)設定成使用以下設定的 SOCKS 代理:

SOCKS Host: localhost SOCKS Port: <local_port>(與 SSH 指令中指定的埠相同) 這讓你可以把網路流量透過遠端伺服器路由,就像身處那個網路一樣存取資源。

1.4 伺服器設定

為了使用埠轉發,需要修改 /etc/ssh/sshd_config 裡的 sshd_config 檔案。

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes

2. 用戶端選項

2.1 命令列中的選項

以下是一些可以用來自訂與強化 SSH 連線的額外選項:

  1. -C:在 SSH 連線期間啟用資料壓縮,改善在慢速網路連線下的效能。它會在資料透過網路傳送之前先壓縮。
  2. -F:指定替代的 SSH 設定檔,取代預設的 ~/.ssh/config。這讓你可以針對特定的 SSH 連線使用自訂設定檔。
  3. -N:建立 SSH 連線時不執行遠端指令。當你只需要設定埠轉發或建立安全通道、不需要執行遠端指令時,這個選項很有用。
  4. -T:停用遠端伺服器上的虛擬終端機配置。當你想在沒有終端機的情況下執行 SSH 時很有用,例如在指令碼中執行 SSH 指令。
  5. -q:安靜模式。抑制大部分警告和診斷訊息,讓 SSH 連線更安靜,適合用於指令碼。
  6. -4-6:這些選項分別強制 SSH 用戶端使用 IPv4(-4)或 IPv6(-6)位址。預設情況下,SSH 兩者都會使用。
  7. -L:指定本機埠轉發,讓你可以把本機某個埠的流量轉發到遠端伺服器。
  8. -R:指定遠端埠轉發,讓你可以把伺服器上某個遠端埠的流量轉發到本機。
  9. -D:指定動態埠轉發,也就是 SOCKS 代理。它讓你可以在本機建立 SOCKS 代理,把流量透過 SSH 通道路由。
  10. -o:讓你可以直接在命令列上指定設定選項。例如,可以用 -o "User=username" 來指定 SSH 連線要使用的使用者名稱。
  11. -v-vv-vvv:提高 SSH 用戶端的詳細程度。指定 -v 會提高除錯輸出的細節程度,-vv-vvv 則提供更詳細的除錯資訊。

這些選項在使用 SSH 用戶端(ssh)連線到遠端伺服器時,提供了額外的控制與彈性。請記得參考 SSH 手冊(man ssh)以取得完整的選項清單、說明及其具體用法細節。

2.2 用戶端設定檔

這些設定可以寫進一個檔案裡。

3. 伺服器設定

sshd_config 檔案是 OpenSSH 伺服器(sshd)的主要設定檔,通常位於大多數 Linux 系統的 /etc/ssh/ 目錄下。sshd_config 檔案包含各種控制 SSH 伺服器行為與功能的設定。以下是 sshd_config 檔案中常見的幾個關鍵設定:

  1. Port: 指定 SSH 伺服器監聽傳入連線的埠號。預設是 22 埠,但可以更改以提升安全性。
  2. PermitRootLogin: 決定是否允許 root 使用者直接透過 SSH 登入。可以設為 yesnoprohibit-password
  3. PasswordAuthentication: 指定 SSH 連線是否允許以密碼進行驗證。可以設為 yesno。一般建議停用密碼驗證、改用金鑰驗證以提升安全性。
  4. PubkeyAuthentication: 啟用或停用公開金鑰驗證。應設為 yes,讓使用者可以用 SSH 金鑰進行驗證。
  5. AllowUsers/AllowGroups/DenyUsers/DenyGroups: 這些指令控制哪些使用者或群組被允許或拒絕存取 SSH 伺服器。可以指定個別使用者名稱或群組名稱。
  6. PermitEmptyPasswords: 決定驗證時是否允許空白密碼。應設為 no 以禁止空白密碼。
  7. ChallengeResponseAuthentication: 啟用或停用挑戰回應驗證。若想停用這種驗證方式,應設為 no
  8. AllowTcpForwarding/AllowStreamLocalForwarding/AllowAgentForwarding: 這些選項控制是否允許特定類型的埠轉發。可以設為 yesno 來啟用或停用轉發能力。
  9. LoginGraceTime: 指定以秒為單位的時間,在此期間內若使用者尚未成功登入,SSH 伺服器允許驗證的時間過後就會關閉連線。有助於防止暴力破解攻擊。
  10. TCPKeepAlive: 決定是否傳送 TCP keep-alive 訊息以維持 SSH 連線。大多數情況下應設為 yes

這些只是 sshd_config 檔案中眾多設定選項的一部分範例。請注意,修改 sshd_config 檔案需要 root 或管理員權限。變更檔案後,需要重新啟動 SSH 伺服器(sshd)才能讓新設定生效。

4. 小結

本文討論了:

  1. SSH 埠轉發
  2. 用戶端選項
  3. 伺服器端設定