🧐 什麼是 sshuttle?sshuttle
是一款透明 proxy 代理工具,可將你所有的 IP 流量透過 SSH 連線進行轉送,就像 VPN 一樣,但不需要在遠端伺服器上有 root 權限。它的運作方式包含:在本機監聽並有選擇性地透過遠端主機轉送;轉向所有 IP 層級的流量(不只是瀏覽器);使用防火牆/NAT 規則(如 Linux 上的 iptables,macOS 上的 pf)等。
🧱 1. macOS 的圖形介面防火牆(應用層級防火牆)
✅ 它是什麼:
- 位置:系統設定 → 網路 → 防火牆
- 管理哪些應用程式可接受外部連線
- 圖形化介面,操作簡單,適合一般使用者
🔒 運作方式:
- 使用
socketfilterfw
監控應用層行為 - 不會直接封鎖 IP、通訊埠或協定
- 可允許或阻擋特定應用程式(如 Chrome、Dropbox、SSHD)
🟢 適合用於:
- 基本安全需求(例如阻擋隨機程式對外監聽)
- 非技術背景的使用者
⚙ 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
- ✅
sshuttle
使用pf
來攔截與轉送 IP 封包- 因為 macOS 不支援
iptables
,所以它使用pfctl
來加入臨時規則。 - 但如果
pf
沒有被啟用或設定錯誤,則無法加載新規則。
- 因為 macOS 不支援
- ❌ 預設下
/etc/pf.conf
可能是空的或無效- 若此設定檔錯誤或缺乏必要 anchor,
sshuttle
會靜默失敗或僅部分功能有效 - 執行:
sudo pfctl -f /etc/pf.conf
可確保pf
被載入有效設定,讓sshuttle
在執行時得以插入其規則。
- 若此設定檔錯誤或缺乏必要 anchor,
- 🔄
sshuttle
會動態注入pf
規則- 但若
pf
未啟用或狀態異常,這些規則不會生效
- 但若
macOS 要求
pf
必須處於啟用與正確配置狀態,sshuttle
才能正常透過 SSH 代理流量。
🔍 若沒有執行會發生什麼?
如果 pf
沒有運行或配置錯誤,sshuttle
可能會:
- 看似已連線,但實際上沒有流量被導向
- 無法建立正確的 port forwarding
- 無法攔截 DNS 或 TCP/IP 流量
- 版本較舊的
sshuttle
可能會完全失敗且無提示
🧠 總結
你不需要在執行 sshuttle 前每次都執行 pfctl -f /etc/pf.conf
,但在某些情況下是必要的:
- 剛開機後,macOS 預設關閉
pf
/etc/pf.conf
曾被清空或異常- 發現
sshuttle
無法轉送流量或完全沒作用 - 出現錯誤訊息如:
pfctl: pf not enabled
Comments