跳至主要內容

標籤「SSH」的 8 篇文章

查看所有標籤

SSH Local Forward 備忘錄

· 4 分鐘閱讀

這篇備忘錄記錄了 SSH Local Forward。

資訊

SSH Local Forward (本地端口轉發) 是一種 SSH 隧道技術,它允許你將本地機器上的一個端口的流量,通過 SSH 連接轉發到遠端 SSH 伺服器可訪問的另一個目標主機和端口。

這通常用於訪問防火牆後面的服務,或者在本地開發環境中模擬對遠端服務的訪問。

1. SSH Local Forward 的原理

當你設置一個本地端口轉發時:

  1. SSH 客戶端(你的本地機器)會在本地監聽一個指定的端口。
  2. 當有流量發送到這個本地端口時,SSH 客戶端會將這些流量通過已建立的 SSH 加密連接發送到遠端 SSH 伺服器。
  3. 遠端 SSH 伺服器接收到這些流量後,會將它們轉發到指定的目標主機和端口。
  4. 目標主機處理請求並將響應發回遠端 SSH 伺服器。
  5. 遠端 SSH 伺服器將響應通過 SSH 連接傳回本地 SSH 客戶端。
  6. 本地 SSH 客戶端將響應發送回最初發起請求的本地應用程式。

流程簡圖:

本地應用 (localhost:LPORT) <---SSH隧道---> 本地SSH客戶端 ---加密通道---> 遠端SSH伺服器 ---非加密通道---> 目標主機:TPORT

2. 語法

ssh -L [本地端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH伺服器]
  • -L:指定本地端口轉發。
  • [本地端口]:你本地機器上將要監聽的端口號。任何發送到 localhost:[本地端口] 的流量都將被轉發。
  • [目標主機]:遠端 SSH 伺服器能夠訪問的目標主機的 IP 地址或域名。
  • [目標端口]:目標主機上服務的端口號。
  • [SSH用戶]:用於登錄遠端 SSH 伺服器的用戶名。
  • [SSH伺服器]:遠端 SSH 伺服器的 IP 地址或域名。

3. 範例

範例 1:訪問防火牆後的遠端 Web 服務

假設:

  • 你的本地機器無法直接訪問 remote-web-server.com 的 80 端口。
  • 你有一台可以訪問 remote-web-server.com 的 SSH 伺服器 (ssh.example.com)。
  • 你希望通過本地的 localhost:8080 訪問 remote-web-server.com 的 Web 服務。

命令:

ssh -L 8080:remote-web-server.com:80 [email protected]

執行此命令後,當你在本地瀏覽器中訪問 http://localhost:8080 時,你的請求會通過 ssh.example.com 轉發到 remote-web-server.com 的 80 端口。

範例 2:安全地訪問遠端資料庫

假設:

  • 你本地機器無法直接訪問遠端資料庫伺服器 db.example.com 的 5432 端口 (PostgreSQL)。
  • 你有一台可以訪問該資料庫伺服器的 SSH 伺服器 (ssh.example.com)。
  • 你希望通過本地的 localhost:54320 連接到遠端資料庫。

命令:

ssh -L 54320:db.example.com:5432 [email protected]

執行此命令後,你可以配置你的本地資料庫客戶端(如 psql 或 DBeaver)連接到 localhost:54320,你的連接將安全地通過 SSH 隧道轉發到遠端資料庫。

範例 3:在後台運行隧道

如果你希望 SSH 隧道在後台運行,並且不執行遠端命令,可以使用 -N (不執行遠端命令) 和 -f (在後台運行) 選項。

ssh -fN -L 8080:remote-web-server.com:80 [email protected]

要停止這個後台運行的隧道,你需要找到 SSH 進程並終止它。

範例 4:訪問 SSH 伺服器本身的服務

如果你想訪問 SSH 伺服器上運行的服務,[目標主機] 可以是 localhost127.0.0.1

ssh -L 8000:localhost:8000 [email protected]

這將允許你通過本地的 localhost:8000 訪問 ssh.example.com 上運行的 8000 端口服務。

4. 安全注意事項

  • 身份驗證:確保你的 SSH 連接是安全的,最好使用公鑰認證而不是密碼。
  • 本地端口選擇:選擇一個未被佔用且高於 1024 的端口作為本地端口(非特權用戶無法綁定 1024 以下的端口)。
  • 目標主機可訪問性[目標主機] 必須是遠端 SSH 伺服器能夠訪問的主機。

總結

SSH Local Forward 是一個非常強大且常用的功能,它提供了一種安全、靈活的方式來訪問網絡受限的遠端服務。無論是繞過防火牆、訪問內部網絡服務還是本地開發,了解並熟練使用本地端口轉發都能極大地提高你的工作效率和安全性。

PLINK 備忘錄

· 4 分鐘閱讀

這篇備忘錄記錄了 PLINK。

資訊

PLINK (PuTTY Link) 是 PuTTY 套件中的一個命令行工具,主要用於在 Windows 環境下通過命令行執行 SSH、Telnet 和 Rlogin 連接。它對於腳本化和自動化遠端操作非常有用。

與 PuTTY GUI 相比,PLINK 提供了無需圖形界面的方式來連接遠端伺服器,非常適合在批處理文件、PowerShell 腳本或 CI/CD 環境中使用。

PLINK 是 PuTTY 套件的一部分。你不需要單獨安裝它,只需下載 PuTTY 官方網站提供的 PuTTY 套件。

  1. 訪問 PuTTY 官方網站https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
  2. 下載 plink.exe:你可以選擇下載獨立的 plink.exe 可執行文件,或者下載整個 PuTTY 安裝程式。
  3. plink.exe 放置到 PATH 路徑:為了方便在任何地方調用 plink,建議將 plink.exe 所在的目錄添加到 Windows 的環境變量 PATH 中。

PLINK 的基本語法與 SSH 類似,但有其特有的選項。

基本連接

plink [user@]host [command]

範例:連接到遠端伺服器並執行 ls -l 命令。

plink [email protected] ls -l /var/www

如果沒有指定命令,PLINK 會啟動一個交互式 Shell 會話。

端口指定

使用 -P 選項指定端口(注意是大寫 P)。

plink -P 2222 [email protected]

使用私鑰文件

PLINK 支持使用 PuTTY 專有的 .ppk 格式的私鑰文件進行身份驗證。你需要使用 PuTTYgen 工具將 OpenSSH 格式的私鑰轉換為 .ppk 格式。

plink -i C:\path	o\your\private_key.ppk [email protected]

傳輸輸出到文件

你可以將 PLINK 執行的遠端命令的輸出重定向到本地文件。

plink [email protected] "cat /etc/nginx/nginx.conf" > nginx_config.txt

執行多個命令

通過將命令用引號括起來,可以在遠端執行多個命令。

plink [email protected] "cd /var/www/html && git pull origin main"

3. 免密碼登錄 (使用私鑰和 PuTTYgen)

為了實現免密碼登錄,你需要:

  1. 生成 OpenSSH 密鑰對 (如果還沒有)。 在 Linux/WSL/Git Bash 中:ssh-keygen -t rsa -b 4096

  2. 將公鑰部署到遠端伺服器。 使用 ssh-copy-id 或手動將公鑰內容添加到遠端伺服器的 ~/.ssh/authorized_keys 文件中。

  3. 使用 PuTTYgen 將私鑰轉換為 .ppk 格式

    • 打開 PuTTYgen。
    • 點擊 Load,選擇你的 OpenSSH 私鑰文件 (id_rsa)。
    • 輸入私鑰的密碼(如果有)。
    • 點擊 Save private key,將其保存為 .ppk 格式。你可以選擇不設置密碼。
  4. 使用 PLINK 和 .ppk 文件連接

    plink -i C:\path	o\your\id_rsa.ppk [email protected] "your_command"
  • -ssh:強制使用 SSH 協議。
  • -batch:防止 PLINK 提示用戶輸入密碼或接受主機密鑰(適用於腳本)。
  • -pw password:直接在命令行中提供密碼(不安全,應盡量避免)。
  • -N:不執行遠端命令,僅用於端口轉發(隧道)。
  • -L, -R, -D:用於本地、遠端、動態端口轉發(SSH 隧道)。

5. 與批處理文件和 PowerShell 腳本結合

PLINK 在自動化任務中非常有用。

批處理文件範例 (deploy.bat)

@echo off
set [email protected]
set KEY="C:\path o\your\private_key.ppk"
set REMOTE_DIR=/var/www/html

echo 連接到 %HOST% 並部署...
plink -i %KEY% %HOST% "cd %REMOTE_DIR% && git pull origin main && npm install && npm run build"
if %ERRORLEVEL% NEQ 0 (
echo 部署失敗!
exit /b %ERRORLEVEL%
)
echo 部署成功!

總結

PLINK 是 Windows 用戶在命令行環境中執行 SSH 和其他遠端連接的強大工具。它在自動化腳本、CI/CD 流程以及無需圖形界面的遠端操作中扮演著重要角色。通過理解其基本用法和如何與私鑰文件結合,可以大大提高遠端管理的效率和安全性。

SSH 公鑰認證

· 5 分鐘閱讀

這篇備忘錄記錄了 SSH 公鑰認證。

資訊

SSH (Secure Shell) 公鑰認證是一種比密碼認證更安全、更便捷的遠端登錄方式。它使用非對稱加密(公鑰和私鑰對)來驗證用戶身份,無需每次都輸入密碼。

1. 原理

SSH 公鑰認證涉及兩部分:

  • 私鑰 (Private Key):保存在你的本地電腦上,是秘密的,絕對不能洩露
  • 公鑰 (Public Key):放置在你要連接的遠端伺服器上,可以公開分享。

當你嘗試連接遠端伺服器時:

  1. 客戶端向伺服器發送連接請求,並提供你的用戶名和公鑰 ID。
  2. 伺服器檢查其 ~/.ssh/authorized_keys 文件中是否有匹配的公鑰。
  3. 如果找到匹配的公鑰,伺服器會生成一個隨機字串,並使用該公鑰加密。
  4. 伺服器將加密後的字串發送回客戶端。
  5. 客戶端使用其私鑰解密該字串,並將解密後的內容發送回伺服器。
  6. 伺服器將收到的解密內容與其原始隨機字串進行比較。如果匹配,則表示客戶端擁有正確的私鑰,驗證成功,允許登錄。

2. 設置步驟

A. 生成 SSH 密鑰對 (在本地電腦上)

  1. 打開終端 (Linux/macOS) 或 Git Bash/WSL (Windows)。

  2. 運行 ssh-keygen 命令。

    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    • -t rsa:指定生成 RSA 算法的密鑰。
    • -b 4096:指定密鑰長度為 4096 位 (建議長度,比默認的 2048 位更安全)。
    • -C "[email protected]":添加註釋,通常是你的電子郵件地址,便於識別。
  3. 系統會提示你輸入文件儲存位置。默認通常是 ~/.ssh/id_rsa。直接按 Enter 即可使用默認路徑。

  4. 系統會提示你輸入密碼 (passphrase)。強烈建議設置一個密碼,這會為你的私鑰提供額外的保護。每次使用私鑰時都需要輸入此密碼。如果你不希望每次都輸入密碼,可以留空(不推薦)。

生成成功後,你會在 ~/.ssh/ 目錄下看到兩個文件:

  • id_rsa:你的私鑰 (Private Key)。
  • id_rsa.pub:你的公鑰 (Public Key)。

B. 將公鑰複製到遠端伺服器

有兩種主要方法:

i. 使用 ssh-copy-id (推薦)

ssh-copy-id 是一個非常方便的工具,它會自動將你的公鑰複製到遠端伺服器的 ~/.ssh/authorized_keys 文件中。

ssh-copy-id user@remote_host
  • user:你在遠端伺服器上的用戶名。
  • remote_host:遠端伺服器的 IP 地址或域名。

系統會提示你輸入遠端伺服器的密碼(第一次連接時),然後它會完成其餘的工作。

ii. 手動複製

如果你無法使用 ssh-copy-id,可以手動複製公鑰。

  1. 在本地查看公鑰內容

    cat ~/.ssh/id_rsa.pub

    複製完整的輸出內容(從 ssh-rsa 開始到你的電子郵件地址結束)。

  2. 連接到遠端伺服器 (使用密碼或已有的其他認證方式)。

    ssh user@remote_host
  3. 在遠端伺服器上創建 .ssh 目錄 (如果不存在) 並設置正確的權限。

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
  4. 將公鑰添加到 authorized_keys 文件

    echo "你的公鑰內容" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys

    "你的公鑰內容" 替換為你在步驟 1 中複製的公鑰字串。

  5. 設置 authorized_keys 文件的權限

    chmod 600 ~/.ssh/authorized_keys

    正確的權限非常重要,否則 SSH 服務器會拒絕使用該文件。

C. 測試連接

設置完成後,嘗試使用 SSH 連接到遠端伺服器:

ssh user@remote_host

如果一切順利,系統會提示你輸入私鑰的密碼 (如果你設置了),然後你就可以成功登錄而無需輸入遠端伺服器的用戶密碼。

3. SSH Agent (可選)

如果你設置了私鑰密碼,每次連接時都會被提示輸入。SSH Agent 可以幫助你解決這個問題。它是一個程序,在記憶體中保存你的解密私鑰,這樣你在一個會話中只需輸入一次密碼。

eval "$(ssh-agent -s)" # 啟動 ssh-agent
ssh-add ~/.ssh/id_rsa # 添加私鑰 (會提示輸入密碼)

4. 禁用密碼認證 (推薦)

為了進一步提高安全性,一旦確認公鑰認證正常工作,你可以在遠端伺服器的 SSH 配置中禁用密碼認證。

  1. 在遠端伺服器上編輯 SSH 服務器配置文件

    sudo vim /etc/ssh/sshd_config
  2. 查找並修改以下行

    PasswordAuthentication no

    (確保前面沒有 # 注釋符號)

  3. 重啟 SSH 服務

    sudo systemctl restart sshd # 或 sudo service ssh restart

總結

SSH 公鑰認證是遠端伺服器管理的基本安全實踐。它提供了更高的安全性、便利性和自動化潛力。遵循這些步驟,你可以輕鬆地為你的伺服器設置公鑰認證,並享受更安全高效的遠端連接。

OpenLDAP 中 slappasswd 產生的 SSHA 是什麼?

· 1 分鐘閱讀

slappasswd 指令是什麼?

slappasswd 指令是用來為 OpenLDAP 產生密碼的工具,預設使用 SSHA 對密碼進行雜湊處理。

認證機制

在 SSHA 中,產生的雜湊值最後 4 個位元組為鹽值(salt)。認證時,系統會將輸入的密碼與儲存的鹽值組合後產生雜湊,並比對是否與儲存的雜湊相符。

以下程式在輸入正確密碼(例如 admin)時,會產生與原始雜湊相同的結果。

require 'base64'
require 'digest'

pass = 'admin'
ssha = '{SSHA}23AUBfRZytVFNpe7onuFhyCSJOHRzCWh'
ssha =~ /{.+}(.+)/
salt256s = Base64.decode64(Regexp.last_match(1)).unpack('C*'[-4..-1])

salt = salt256s.pack('C*')
b_ssha = Digest::SHA1.digest(pass + salt)
Base64.strict_encode64(
(b_ssha.unpack('C*') + salt256s).pack('C*')
)

[EOL]

Windows OpenSSH Permission denied 問題

· 1 分鐘閱讀
  • 可以使用密碼登入(雖然設定中已停用)
  • 使用公鑰驗證時發生 Permission denied

連線至 localhost:22 時,出現以下錯誤:

hikari@localhost: Permission denied (publickey,keyboard-interactive).

image

原因

Administrators 群組(即「系統管理員使用者」)預設會從 C:\ProgramData\ssh\administrators_authorized_keys 讀取公鑰進行驗證。

需要將其改為 $env:userprofile\.ssh\authorized_keys

解決方法

以系統管理員權限開啟 C:\ProgramData\ssh\sshd_config,將以下兩行註解掉:

image

- Match Group administrators
- AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
+ #Match Group administrators
+ # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

儲存後,重新啟動服務。

Restart-Service sshd

Termux 上的 SSH

· 3 分鐘閱讀

這篇備忘錄記錄了在 Termux 上使用 SSH 的方法。

資訊

Termux 是一個 Android 上的終端模擬器和 Linux 環境應用程式,它允許你運行許多 Linux 命令和工具。SSH 是一種安全的網絡協議,用於在不安全的網絡上安全地執行網絡服務。

在 Termux 中,你可以將其作為 SSH 客戶端連接到遠端服務器,也可以將其設置為 SSH 服務器,以便從其他設備連接到你的 Android 設備。

1. 作為 SSH 客戶端

安裝 OpenSSH

Termux 提供了一個 OpenSSH 套件,你可以通過 pkg 命令安裝:

pkg update && pkg upgrade
pkg install openssh

連接到遠端服務器

安裝完成後,你可以使用 ssh 命令連接到遠端服務器:

ssh user@hostname_or_ip

例如:

你也可以使用 SSH 密鑰進行身份驗證,這比密碼更安全。

生成 SSH 密鑰

如果尚未生成,你可以在 Termux 中生成 SSH 密鑰對:

ssh-keygen

按照提示操作,通常可以直接按 Enter 使用默認值。公鑰會保存在 ~/.ssh/id_rsa.pub,私鑰在 ~/.ssh/id_rsa

上傳公鑰到遠端服務器

將你的公鑰複製到遠端服務器的 ~/.ssh/authorized_keys 文件中:

ssh-copy-id user@hostname_or_ip

或者手動複製:

cat ~/.ssh/id_rsa.pub | ssh user@hostname_or_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

2. 作為 SSH 服務器

啟動 SSH 服務器

Termux 內置了一個 SSH 服務器。默認情況下,它在端口 8022 上運行。 要啟動 SSH 服務器,只需運行 sshd 命令:

sshd
注意

每次 Termux 應用程式關閉或設備重啟後,你都需要重新運行 sshd 命令來啟動 SSH 服務器。

設置 SSH 密碼

如果你想使用密碼連接,你需要為你的 Termux 用戶設置一個密碼:

passwd

輸入並確認你的密碼。

從其他設備連接

現在,你可以從你的電腦或其他設備連接到 Termux SSH 服務器。你需要知道你的 Android 設備在局域網中的 IP 地址。

在你的電腦上:

ssh -p 8022 user@android_device_ip

其中 user 是你的 Termux 用戶名(通常是 u0_aXXX 這樣的字串,但對於 Termux SSH 服務器,你可以直接使用 sshd 運行時的用戶名,通常是 root 或者你當前的 shell 用戶)。

查找 Termux 用戶名

你可以在 Termux 中運行 whoami 命令來查看當前用戶名。 更可靠的方法是,當你啟動 sshd 後,它會使用當前的用戶身份。如果你沒有顯式設置用戶,它可以是 root (如果你以 root 權限運行) 或者默認的 Termux 用戶。

停止 SSH 服務器

要停止 SSH 服務器,你可以找到 sshd 進程並終止它:

pkill sshd

總結

Termux 提供了強大的 SSH 功能,無論是作為客戶端還是服務器,都能極大地增強你的 Android 設備的實用性。這使得在手機上進行開發、遠端管理或其他基於 SSH 的任務變得可能。

在 Windows 上停用 OpenSSH 的密碼驗證

· 1 分鐘閱讀

開啟具有系統管理員權限的終端機

編輯設定檔需要系統管理員權限,請以系統管理員身份開啟終端機。

在終端機圖示上按右鍵,選擇「以系統管理員身份執行」。

image

image

在終端機中開啟設定檔

執行以下命令:

notepad C:\ProgramData\ssh\sshd_config

image

編輯設定檔

- # PasswordAuthentication yes
+ PasswordAuthentication no

image

變更為

image

並儲存變更。

重新啟動 SSH 伺服器

返回終端機,執行以下命令以重新啟動 SSH 伺服器:

Restart-Service sshd

連線測試

測試設定是否已生效。

執行以下命令,若看到以下訊息:

ssh localhost
user@localhost: Permission denied (publickey,keyboaard-interactive).

即表示設定正確。

SSH 隧道

· 3 分鐘閱讀

這篇備忘錄記錄了 SSH 隧道。

什麼是 SSH 隧道?

資訊

SSH 隧道(也稱為 SSH 端口轉發)是一種通過 SSH 連接在客戶端和服務器之間創建加密隧道的方法。它允許你將網絡流量從一個端口轉發到另一個端口,即使這些端口原本無法直接訪問。

SSH 隧道有三種類型:

  1. 本地端口轉發 (Local Port Forwarding):將本地機器的端口轉發到遠端機器的端口。
  2. 遠端端口轉發 (Remote Port Forwarding):將遠端機器的端口轉發到本地機器的端口。
  3. 動態端口轉發 (Dynamic Port Forwarding):創建一個 SOCKS 代理,允許通過 SSH 連接動態轉發多個目的地。

1. 本地端口轉發 (Local Port Forwarding)

用途:訪問防火牆後的遠端服務。

語法:

ssh -L [本地端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH服務器]

範例: 假設你本地機器上的 8080 端口,通過 SSH 服務器(ssh.example.com)將流量轉發到遠端機器(remote.example.com)的 80 端口。

ssh -L 8080:remote.example.com:80 [email protected]

現在,你可以通過訪問本地的 localhost:8080 來訪問 remote.example.com 上的網頁服務。

2. 遠端端口轉發 (Remote Port Forwarding)

用途:讓遠端機器訪問本地機器上的服務。

語法:

ssh -R [遠端端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH服務器]

範例: 假設你希望遠端 SSH 服務器上的用戶可以通過 localhost:9000 訪問你本地機器上的 3000 端口(例如一個 Web 應用)。

ssh -R 9000:localhost:3000 [email protected]

現在,連接到 ssh.example.com 的用戶可以通過訪問 localhost:9000 來訪問你的本地服務。

3. 動態端口轉發 (Dynamic Port Forwarding)

用途:創建一個 SOCKS 代理,用於繞過防火牆或匿名上網。

語法:

ssh -D [本地端口] [SSH用戶]@[SSH服務器]

範例: 在本地機器上創建一個 SOCKS 代理,監聽 8181 端口。

ssh -D 8181 [email protected]

然後,你需要將你的瀏覽器或其他應用程式配置為使用 localhost:8181 作為 SOCKS 代理。所有通過這個代理的流量都將通過 ssh.example.com 加密隧道轉發。

保持隧道開啟

如果你希望 SSH 隧道在後台保持運行,可以使用 -N(不執行遠端命令)和 -f(在後台運行)選項:

ssh -fN -L 8080:remote.example.com:80 [email protected]

總結

SSH 隧道是一個非常強大且靈活的工具,它提供了安全地訪問網絡服務、繞過網絡限制以及增強隱私保護的方法。了解並熟練使用不同類型的端口轉發,可以大大提高你的網絡操作效率和安全性。