macOS sshuttle proxy 無法透過 SSH 傳送資料到遠端伺服器

作業系統網路技術

🧐 什麼是 sshuttle?sshuttle 是一款透明 proxy 代理工具,可將你所有的 IP 流量透過 SSH 連線進行轉送,就像 VPN 一樣,但不需要在遠端伺服器上有 root 權限。它的運作方式包含:在本機監聽並有選擇性地透過遠端主機轉送;轉向所有 IP 層級的流量(不只是瀏覽器);使用防火牆/NAT 規則(如 Linux 上的 iptables,macOS 上的 pf)等。

Adsense

🧱 1. macOS 的圖形介面防火牆(應用層級防火牆)

✅ 它是什麼:

  • 位置:系統設定 → 網路 → 防火牆
  • 管理哪些應用程式可接受外部連線
  • 圖形化介面,操作簡單,適合一般使用者

🔒 運作方式:

  • 使用 socketfilterfw 監控應用層行為
  • 不會直接封鎖 IP、通訊埠或協定
  • 可允許或阻擋特定應用程式(如 Chrome、Dropbox、SSHD)

🟢 適合用於:

  • 基本安全需求(例如阻擋隨機程式對外監聽)
  • 非技術背景的使用者
Adsense

⚙ 2. pf 防火牆(Pocket Filter)(CLI/進階用)

✅ 它是什麼:

  • 基於 OpenBSD pf 的低階防火牆
  • 設定檔為 /etc/pf.conf
  • 使用 pfctl 控制

🔒 它的功能:

  • 可以根據 IP 位址、通訊埠、網路介面、協定等條件篩選流量
  • 支援進階網路功能:
    • NAT、重新導向、速率限制、阻擋掃描等

🛠️ 適用於:

  • 客製化防火牆設定
  • 精細控制封包流量(封包層)
  • 系統管理員或開發者使用情境

📌 Tip

因此 sshuttle 依賴 macOS 的 pf 防火牆來插入 NAT 與封包重導規則,如果 pf 沒有啟用,或設定錯誤,sshuttle 可能會靜默失敗或無法正常運作。


❓ 為什麼在 macOS 上需要先執行 sudo pfctl -f /etc/pf.conf

  1. sshuttle 使用 pf 來攔截與轉送 IP 封包
    • 因為 macOS 不支援 iptables,所以它使用 pfctl 來加入臨時規則。
    • 但如果 pf 沒有被啟用或設定錯誤,則無法加載新規則。
  2. ❌ 預設下 /etc/pf.conf 可能是空的或無效
    • 若此設定檔錯誤或缺乏必要 anchor,sshuttle靜默失敗或僅部分功能有效
    • 執行: sudo pfctl -f /etc/pf.conf 可確保 pf 被載入有效設定,讓 sshuttle 在執行時得以插入其規則。
  3. 🔄 sshuttle 會動態注入 pf 規則
    • 但若 pf 未啟用或狀態異常,這些規則不會生效

macOS 要求 pf 必須處於啟用與正確配置狀態,sshuttle 才能正常透過 SSH 代理流量。

🔍 若沒有執行會發生什麼?

如果 pf 沒有運行或配置錯誤,sshuttle 可能會:

  • 看似已連線,但實際上沒有流量被導向
  • 無法建立正確的 port forwarding
  • 無法攔截 DNS 或 TCP/IP 流量
  • 版本較舊的 sshuttle 可能會完全失敗且無提示
Adsense

🧠 總結

不需要在執行 sshuttle 前每次都執行 pfctl -f /etc/pf.conf,但在某些情況下是必要的

  1. 剛開機後,macOS 預設關閉 pf
  2. /etc/pf.conf 曾被清空或異常
  3. 發現 sshuttle 無法轉送流量或完全沒作用
  4. 出現錯誤訊息如:pfctl: pf not enabled

Comments

標題和URL已復制