# 原理
SSH 提供「動態埠轉發(Dynamic Port Forwarding)」功能,在本機開一個 SOCKS5 Proxy 埠,所有送進這個埠的流量都會透過 SSH 加密通道,從遠端伺服器出去。
[本機應用程式] → [本機 SOCKS5 :1080] → [SSH Tunnel] → [遠端主機] → [目標網站]
不需要在伺服器上安裝任何 Proxy 軟體,SSH 本身就能做到。
# 前置條件
- 一台可以 SSH 連線的遠端 Linux 主機
- 本機安裝 OpenSSH client(Linux/macOS 內建;Windows 10/11 也已內建)
# 建立 SOCKS5 Proxy
# 基本指令
ssh -D 1080 -N -f user@remote_host |
參數說明:
| 參數 | 說明 |
|---|---|
-D 1080 | 在本機 1080 埠建立 SOCKS5 Proxy |
-N | 不執行遠端指令,只做轉發(建立 tunnel 專用) |
-f | 背景執行,連線建立後回到 shell |
user@remote_host | 遠端主機的使用者與位址 |
連線後,本機的 127.0.0.1:1080 就是一個 SOCKS5 Proxy。
# 指定 SSH Key
ssh -D 1080 -N -f -i ~/.ssh/id_rsa user@remote_host |
# 指定遠端 SSH Port(非預設 22)
ssh -D 1080 -N -f -p 2222 user@remote_host |
# 設定應用程式使用 Proxy
# Firefox
「設定」→「一般」→ 搜尋「Proxy」→「手動設定 Proxy」:
- SOCKS Host:
127.0.0.1 - Port:
1080 - 選擇 SOCKS v5
- 勾選「透過 SOCKS5 Proxy 解析 DNS」(避免 DNS 洩漏)
# Chrome(透過 SwitchyOmega 擴充套件)
安裝 SwitchyOmega 後新增 Proxy Profile:
- Protocol:
SOCKS5 - Server:
127.0.0.1 - Port:
1080
# Windows 系統全域 Proxy
Windows 11 已內建 SOCKS5 Proxy 支援。進入「設定」→「網路和網際網路」→「Proxy」→「手動設定 Proxy」,啟用後填入:
- 位址:
socks=127.0.0.1 - 連接埠:
1080
Windows 10 的「手動設定 Proxy」不支援 SOCKS5,若需全域導向建議改用 Proxifier 或 proxychains (WSL)。
# curl /wget 測試
curl --socks5 127.0.0.1:1080 https://ifconfig.me |
若回傳的 IP 是遠端主機的 IP,代表 Proxy 正常運作。
# 保持連線(避免 idle 斷線)
SSH 連線閒置一段時間可能被伺服器切斷。在 ~/.ssh/config 加入以下設定:
Host remote_host
ServerAliveInterval 60
ServerAliveCountMax 3
或在指令中加 -o 參數:
ssh -D 1080 -N -f -o ServerAliveInterval=60 user@remote_host |
# 用工作排程器讓 Tunnel 自動重連
-f 背景執行的 SSH 斷線後不會自動重連。在 Windows 上可以用工作排程器搭配 PowerShell 腳本,讓 Tunnel 在斷線後自動重啟。
建立 start-ssh-tunnel.ps1 :
while ($true) { | |
$proc = Get-Process -Name "ssh" -ErrorAction SilentlyContinue | | |
Where-Object { $_.CommandLine -match "\-D 1080" } | |
if (-not $proc) { | |
Write-Host "$(Get-Date) SSH tunnel 未運作,重新啟動..." | |
Start-Process "ssh" -ArgumentList "-D 1080 -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3 user@remote_host" -WindowStyle Hidden | |
} | |
Start-Sleep -Seconds 30 | |
} |
接著用工作排程器在登入時執行此腳本:
schtasks /create /tn "SSH-Tunnel" /tr "powershell -WindowStyle Hidden -File C:\path\to\start-ssh-tunnel.ps1" /sc onlogon /ru "%USERNAME%" |
這樣每次登入系統就會自動啟動監控腳本,偵測到 Tunnel 斷線時自動重啟。
# 查詢與關閉背景 Tunnel
查詢目前在背景執行的 SSH Tunnel:
Get-Process -Name "ssh" | Select-Object Id, StartTime, CommandLine |
關閉指定 Tunnel:
Stop-Process -Id <PID> |
或關閉所有 SSH 背景程序:
Get-Process -Name "ssh" | Stop-Process |
# 實際應用場景:改善 Telegram 連線品質
Telegram 在某些地區可能因為網路路由問題出現延遲或連線不穩,這時可以透過 Telegram 桌面版內建的 Proxy 功能,搭配本機的 SOCKS5 Proxy,讓流量走海外線路。
設定方式:
- 開啟 Telegram 桌面版,進入「設定」→「進階」→「連線類型」
- 選擇「使用自訂 Proxy」
- 填入:
- 類型:SOCKS5
- 伺服器:
127.0.0.1 - 連接埠:
1080
- 儲存後 Telegram 會立即套用,右下角出現綠燈代表連線正常
這個方法只影響 Telegram 本身的流量,不影響系統其他程式,也不需要全域 Proxy。
# 注意事項
ssh -D建立的 SOCKS5 Proxy 不支援帳號密碼驗證,任何能連到該埠的程式都可以直接使用。預設只監聽127.0.0.1(本機),所以個人使用安全上通常不是問題。若需要對外開放並加上帳密保護,應改用專用的 SOCKS5 Server,例如microsocks(輕量)或dante(功能完整)- SOCKS5 Proxy 若要對區網開放,改為
-D 0.0.0.0:1080,但務必確認防火牆設定 - 瀏覽器設定 Proxy 後,DNS 查詢建議也走 Proxy,避免 DNS 洩漏