網際網路技術/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 Simple Client。
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
傳輸方法 B:分步操作
[edit | edit source]手動執行上述 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"(或您選擇的任何埠)。
從您的 Web 瀏覽器使用 SSH
[edit | edit source]即使您沒有安全的 shell 客戶端,您也可以在支援 JavaScript 的 Web 瀏覽器中使用 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 金鑰的分步教程。
- "透過 SSH 配置 Git 以一次登入" 描述瞭如何使用 ssh-agent(在 macOS 和 Linux 系統上)在每次會話中解鎖一次密碼保護的私鑰,而不是在每次使用金鑰進行推送或拉取時都解鎖。