# 原理

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,讓流量走海外線路。

設定方式:

  1. 開啟 Telegram 桌面版,進入「設定」→「進階」→「連線類型」
  2. 選擇「使用自訂 Proxy」
  3. 填入:
    • 類型:SOCKS5
    • 伺服器: 127.0.0.1
    • 連接埠: 1080
  4. 儲存後 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 洩漏