網際網路技術/SSH
SSH 是 Telnet 和 rsh 的安全替代品。客戶端和伺服器之間的所有通訊都經過加密。要訪問大多數 Unix 作業系統中的 SSH 客戶端(通常是 OpenSSH),在終端視窗中鍵入 ssh user@host.com。如果您沒有指定使用者名稱,將使用輸入命令的使用者($USER)。在 Windows 中,您需要下載第三方實用程式,例如 PuTTY 或 Cygwin。在 ssh(1) 手冊頁中查詢更多資訊。在其他作業系統(例如智慧手機)上,您必須使用基於 Web 的客戶端。Android 上有幾個 SSH 應用程式,包括 ConnectBot、Dropbear、ServerAssistant 和 Telnet/SSH 簡單客戶端。
SSH 實際上遠不止一種安全訪問遠端 shell 的方式。它可以用於許多其他安全傳輸資訊的方式。
安全 shell 客戶端方便地稱為 ssh。它通常用於訪問遠端主機。ssh 的典型用法是
ssh user@host
這意味著客戶端打算以 user 使用者身份登入 host 機器。身份驗證成功後,將在客戶端和 host 之間建立 SSH 會話。
Rsync 和 SFTP 是推薦的兩種傳輸檔案的方式,因為 SCP 存在無法修復的缺陷。
SFTP 與 FTP 沒有任何關係。SFTP 只是像 FTP 一樣工作,這意味著您可以像使用 FTP 一樣使用它。使用 SFTP 只需要 SSH 伺服器。FTP 伺服器與 SFTP 無關。檔案預設以二進位制形式傳輸。
sftp user@host
"rsync" 不屬於 SSH 套件,但幾乎無處不在。它在傳輸到或從遠端系統時使用 SSH 來保護連線。
rsync file user@host:/path/
或
rsync user@host:/path/file .
"rsync" 最好的部分之一是它只傳輸任何更改,如果目標上存在檔案的早期版本。這節省了時間和頻寬。"rsync" 還有許多有用的選項,包括 -a 選項,它將遞迴複製與保留時間、屬性、所有者和組等結合在一起。
SSH 套件仍然包含一個簡潔的實用程式 "scp",它代表安全複製,它提供了一種在機器之間複製檔案的好方法。在最近的版本中,它是 SFTP 的包裝器,但它幾乎與預設的 unix cp 命令完全一樣。scp 還允許您將檔案從遠端主機複製到遠端主機。scp 的一個例子
scp user@host.com:~/files/ .,這意味著將 host.com 機器上使用者主目錄中 files/ 目錄中的檔案(它將複製 files/ 目錄中的所有檔案)複製到 CWD(當前工作目錄)。
另一個很好的用途是使用它來加密從一臺機器到另一臺機器的任何資料的傳輸。作為一個極端的例子,您可以使用 SSH 將磁碟從一臺機器遠端移動到另一臺機器(類似於 ghost,但安全)。這可能不是 SSH 的最佳用途,也不是在網路上傳輸資料的最快方式,但它向您展示了 SSH 的強大功能。
scp,即安全複製,工作方式與 rcp 一樣。
- 複製到遠端主機 - 您必須使用冒號。REMOTE_PATH 不是必需的,所有 REMOTE_PATH 都是相對於使用者主目錄的。
scp FILE_PATH user@host:REMOTE_PATH
- 從遠端主機複製,
scp user@host:REMOTE_PATH LOCAL_PATH
注意:如果您的檔名包含空格,請按以下方式使用 scp:-
- 檔名是 /media/sda6/Tutorials/Linux Unix/linux_book.pdf,目標目錄是 home/narendra/data
$scp user@host:"/media/sda6/Tutorials/Linux\\ Unix/linux_book.pdf" /home/narendra/data
- 檔名是 /home/narendra/linux_book.pdf,目標目錄是 /media/Tutorials/Linux Unix/
- $
scp /home/narendra/linux_book.pdf user@host:"/media/Tutorials/Linux\\ Unix/"
- $
注意:如果您想複製整個目錄,請使用
scp -r user@host:"<syntaxhighlight_dirname>" <destination_dirname>
雖然 SSH 可以與密碼一起使用,但不建議這樣做,而且許多伺服器不允許使用密碼登入。相反,使用金鑰 - 這更安全,也更方便。
要建立 SSH 金鑰,
大多數現代 Unix 系統都包含 OpenSSH 客戶端。要生成金鑰,請執行
$ ssh-keygen
這將把您的私鑰儲存在$HOME/.ssh/id_rsa中,並將您的公鑰儲存在$HOME/.ssh/id_rsa.pub中。您可以使用不同的檔名,但這些是預設檔名,因此不更改它們最容易。
因為您的私鑰的安全性非常重要,所以如果檔案許可權不安全,SSH 將無法正常工作。SSH 會建立具有適當許可權的檔案和目錄,但有時會出錯。要修復許可權問題
$ chmod 600 ~/.ssh/KEY ~/.ssh/KEY.pub $ chmod 700 ~/.ssh
要使用 SSH 金鑰登入到遠端伺服器,您需要將公鑰放在該伺服器的授權金鑰列表中。
換句話說,您需要將本地 ~/.ssh/id_rsa.pub 檔案的副本追加到遠端 ~/.ssh/authorized_keys 檔案的末尾。
最簡單的方法是使用 ssh-copy-id。這需要某種其他形式的身份驗證,通常是密碼(因為您還沒有在伺服器上獲得金鑰,所以您還不能使用金鑰身份驗證)。
ssh-copy-id -i ~/.ssh/KEY user@host.example.net
手動執行上述 ssh-copy-id 命令自動為您執行的每個步驟,這種方法比較繁瑣
- 首先,在目標伺服器上建立遠端
~/.ssh資料夾(如果它不存在)
ssh user@host "mkdir ~/.ssh && chmod 700 ~/.ssh"
- 接下來上傳你的公鑰(不是私鑰)。
cd ~/.sshsftp user@host.example.net:.sshput KEY.pub
- 然後將你的公鑰追加到伺服器的授權金鑰列表中
ssh user@host.example.netcat ~/.ssh/KEY.pub >> ~/.ssh/authorized_keysrm ~/.ssh/KEY.pub
高階 *nix 使用者可以在一行程式碼中完成所有這些步驟
cat ~/.ssh/id_rsa.pub | ssh user@host.example.net "cat >> ~/.ssh/authorized_keys"
SSH 個人配置
[edit | edit source]你不需要設定~/.ssh/config檔案,但這會使身份驗證更容易。 重要的一點是指定你的使用者名稱和私鑰 - 如果在配置檔案中指定了這些內容,你就不需要在命令列中提供它們。 使用 HostName,你可以將 ssh 命令縮短為
$ ssh servername
例子
[edit | edit source]#Specific configuration applied to one host
#This configuration applies specifically to a host which uses Windows Domain login
Host Short_Name
HostName server1.example.com
User domain\username
IdentityFile ~/.ssh/KEY
# Use this login as default for all hosts in the one domain
# It will look for a key with the hostname in the key's file name
Host *.example.com
User domain\username
IdentityFile ~/.ssh/%h_KEY
# Generic configuration that applies to my private LAN.
# Of note, the options to forward X11 lets you run remote graphical
# programs while viewing and interacting with them locally.
Host localnetwork 192.168.1.0/24
User USERNAME
IdentityFile ~/.ssh/key_37_rsa
AddKeysToAgent yes
ForwardX11 yes
# In a pesky lab environment, add the following to your config
# CheckHostIP no
# Catch-all settings which apply these settings to all hosts,
# if the particular option has not yet already been set.
# If there are a lot of keys in the SSH agent, then IdentitiesOnly is needed
Host *
IdentitiesOnly yes
ServerAliveCountMax 2
ServerAliveInterval 20
你現在可以使用 ssh Short_Name 登入到 server1.example.com。 配置選項是按先匹配原則選擇的,因此將非常具體的規則放在開頭,將更一般的規則放在結尾。
使用 SSH 代理
[edit | edit source]大多數桌面環境現在都自動提供 SSH 代理。 因此,如果你想檢視詳細資訊,請查詢環境變數$SSH_AUTH_SOCK和$SSH_AGENT_PID,儘管只有前者用於連線到它,並且必須在任何需要連線到代理的程式中都可用。
金鑰可以很容易地手動新增到代理中,
ssh-add ~/.ssh/KEY
或者它們可以在第一次使用時透過在客戶端配置檔案中適當的規則集中將 AddKeysToAgent 設定為“yes”來自動新增。
但是,請記住,一旦你在代理中超過六個金鑰,就必須採取特殊措施來防止代理嘗試錯誤的金鑰,並以錯誤的順序防止登入。 具體來說,應該為每個主機將 IdentitiesOnly 設定為“yes”,最好使用客戶端配置檔案。 請參閱以下內容。
公鑰加密
[edit | edit source]SSH 與 Telnet 和“rsh” 最大的區別在於安全性。 SSH 使用 RSA、EcDSA 或 Ed25519 用於 公鑰加密。
- 你嘗試連線到的伺服器或域會為客戶端生成一對金鑰(公鑰和私鑰)。
- 客戶端第一次嘗試連線時,會獲得公鑰。 相應的私鑰是秘密的,儲存在伺服器上。
- 客戶端透過使用公鑰加密資料包,然後使用儲存在伺服器上的相應私鑰解密資料。
伺服器到客戶端的通訊也是以相同的方式進行的 - 伺服器使用客戶端的公鑰加密,客戶端使用其私鑰解密。
使用公鑰加密設定 OpenSSH
[edit | edit source]以下內容假定可以物理訪問伺服器或某些帶外等效物。
使用你發行版的包管理器,在伺服器上安裝 sshd(或 openssh-server),在客戶端上安裝 ssh(或 openssh-client)。 它們很可能已經安裝,因為它們通常是伺服器和工作站發行版預設安裝的一部分。 確保以下內容位於伺服器上的 /etc/ssh/sshd_config 中,並且未被註釋掉。 也就是說,它們前面沒有 #
PubkeyAuthentication yes PasswordAuthentication no
- 在伺服器上,
- 開啟伺服器上的 TCP 埠 22 以接收傳入連線。 這取決於你的防火牆。 非標準埠。
- 如果伺服器位於使用 DHCP 的路由器後面
- 停止使用 DHCP 併為你的伺服器分配一個靜態 IP 地址。 如果你不知道如何操作,請參閱 Gentoo 手冊或 Arch Linux Wiki 獲取說明。
- 將路由器上的外部 TCP 埠 22(或另一個埠)轉發到伺服器上的埠 22。
- 在客戶端上,建立並測試客戶端金鑰對
- 在客戶端命令列中,執行
ssh-keygen -f ~/.ssh/server.key(“rsa” 是預設值,不需要顯式指定“rsa”)。 考慮使用-C選項對金鑰對進行註釋。 - 將公鑰複製到可移動介質中,將該介質傳輸到伺服器並將其掛載。 將公鑰複製到伺服器,例如複製到那裡的 ~/.ssh/server.key 中。 然後將金鑰追加到 authorized_keys 檔案中,
cat ~/.ssh/server.key >> ~/.ssh/authorized_keys - 回到客戶端,測試新金鑰是否有效:
ssh -i ~/.ssh/server.key serve.example.com
- 在客戶端命令列中,執行
- (重新)啟動 sshd 服務。
- 使用金鑰從客戶端再次登入
提示:如果你在伺服器上登入的使用者名稱與你在客戶端上當前使用的使用者名稱相同,則不需要在伺服器上指定要登入的使用者名稱。
SSH 作為代理
[edit | edit source]如果你可以建立 SSH 連線,你(很可能)可以使用該連線作為 SOCKS5 代理,無需在遠端計算機上進行任何額外設定。 然後可以透過 SSH 連線安全地隧道傳輸流量。 如果你正在使用無線連線,你可以使用它來有效地保護你的所有流量免遭窺探。 你還可以使用它來繞過 IP 限制,因為你將顯示為從遠端計算機連線。 請注意,DNS 流量不會被隧道傳輸,除非採取了特定的措施來進行傳輸。
選擇一些較大的埠號(大於 1024,這樣你就可以用作非 root 使用者)。 在這裡,我選擇 1080,這是標準的 SOCKS 埠。 使用 -D 選項進行動態埠轉發。
ssh -D 1080 user@host
就是這樣。 現在,只要 SSH 連線保持開啟狀態,你的應用程式就可以使用你自己的計算機(localhost)上的埠 1080 上的 SOCKS 代理。 例如,在 Linux 上的 Firefox 中
- 轉到編輯 -> 首選項 -> 高階 -> 網路 -> 連線 -> 設定…
- 選中“手動代理配置”
- 確保“為所有協議使用此代理伺服器”已清除
- 清除“HTTP 代理”、“SSL 代理”、“FTP 代理”和“Gopher 代理”欄位
- 在“SOCKS 主機”中輸入“127.0.0.1”,在埠中輸入“1080”(或你選擇的任何埠)。
從你的網路瀏覽器中使用 SSH
[edit | edit source]即使你沒有安全的 shell 客戶端,你也可以使用支援 javascript 的網路瀏覽器從網路瀏覽器中使用 ssh。 為此,你必須在執行 SSH 伺服器的系統上安裝 AnyTerm、AjaxTerm 或 WebShell,或者使用像 WebSSH 這樣的第三方服務。
SSH 反向隧道
[edit | edit source]使用反向隧道,你可以使用遠端計算機(例如在 AWS 上)作為本地計算機的入口點。 因此,對遠端計算機 IP 上特定埠的請求將被轉發到你的本地計算機,並返回響應。 它被稱為**反向**隧道,因為這不是你的本地計算機向遠端計算機的該埠傳送資料,而是從遠端計算機到本地計算機發送資料。
用例:如果您的計算機位於 NAT 後面 - 沒有公網 IP 地址(或不是本地靜態 IP 地址) - 但您仍然希望將本地 HTTP 伺服器或某些資料庫或其他特定服務公開訪問。
另一個用例:如果 種子 因為使用公網 IP 地址,更多計算機將能夠獲取您的合法資料。
這樣的命令可以建立一個反向隧道,其中遠端機器上的 63368 埠透過 SSH 反向隧道轉發回源機器上的 8000 埠,透過在 4160 埠上連線 SSH。
ssh -R 63368:localhost:8000 -p 4160 host.example.net
格式如下
ssh -R port-incoming:localhost:port-local -p port-for-for-connecting host.example.net
遠端機器的 /etc/ssh/sshd_config 可以包含以下內容
AllowTcpForwarding yes
AllowAgentForwarding no
AllowStreamLocalForwarding yes
PermitTunnel yes
GatewayPorts yes # optional, for external visibility進一步閱讀
[edit | edit source]- OpenSSH 維基百科
- https://man.openbsd.org/ssh, https://man.openbsd.org/ssh_config
- LPI Linux 認證/安全 Shell (SSH)
- 構建 Beowulf 叢集/安裝、配置和管理/共享目錄和 SSH
- "Mediawiki:在 Gerrit 中設定 SSH 金鑰" 提供了一個關於設定 SSH 金鑰的分步教程。
- ArchWiki:OpenSSH
- Gentoo 手冊:SSH
- SSH 反向隧道:從雲獲取靜態 IP
- "Github:生成 SSH 金鑰" 提供了另一個關於設定 SSH 金鑰的分步教程。
- "如何在 Ubuntu 20.04 上設定 SSH 金鑰" 提供了一個類似的關於設定 SSH 金鑰的分步教程。
- "Ubuntu:SSH/OpenSSH/Keys" 提供了一個類似的關於設定 SSH 金鑰的分步教程。
- "配置 Git 透過 SSH 登入一次" 描述瞭如何在 macOS 和 Linux 系統上使用 ssh-agent,在每個會話中解鎖一次受密碼保護的私鑰,而不是每次使用該金鑰進行推送或拉取時都解鎖一次。