Skip to main content

🌐 Docker Surfshark VPN with Proxy 跨區翻牆架構

又到咗四年一度嘅世界杯,又係善用公司資源嘅時侯。

公司部電腦係唔可以裝 VPN,雖然 Firefox 有 Extension 可以用到 VPN,但平日都要連去日本用 AI,所以唔想攪到佢。咁就諗到個方法係用屋企部陳年 tablet 用 Wifi 連去公司機,再經 VPN 出去。

最初 Gemini 係推薦用 Gluetun + Squid,但睇文件見 Gluetun 有內置 proxy 就試下飛走 Squid 簡單啲,但係 Gluetun 內置 proxy 功能似乎唔夠全面,睇波係唔 work 的,所以都係要用返 Squid 先得。

比較奇怪係用唔到香港,唔知係公司問題定乜…

Important

以下內容由 AI 生成並以人手加以俢改

這個架構成功實現了:「內聯網電腦 ➔ 本地 Proxy (Gluetun/Squid) ➔ Gluetun VPN (Surfshark OpenVPN TCP) ➔ 成功繞過公司防火牆 ➔ 跨區互聯網」。


📁 1. 檔案與資料夾結構

請確保所有檔案都擺放喺同一個資料夾入面(例如 surfshark-squid/):

surfshark-squid/
├── .env              # 存放敏感資料與動態國家設定
├── squid.conf        # Squid Proxy 的權限設定
└── docker-compose.yml # Docker 容器編排設定檔

⚙️ 2. 設定檔內容

📝 ① .env (國家與帳號密碼設定檔)

將容易變動的國家名稱以及敏感的 VPN 帳號資料抽離到此檔案:

CONTAINER_SUFFIX=JP
HOST_PORT=0.0.0.0:3839
CONTAINER_PORT=3128
VPN_TYPE=openvpn
OPENVPN_USER=XXXXXXXXXXXXXXXX
OPENVPN_PASSWORD=XXXXXXXXXXXXXXXXX
WIREGUARD_PRIVATE_KEY=XXXXXXXXXXXXXXXXXXXX
WIREGUARD_ADDRESSES=x.x.x.x/16
VPN_COUNTRY=Japan

📝 ② squid.conf (Squid 代理伺服器設定)

允許內聯網(LAN)的電腦連接,並隱藏真實 IP:

acl localnet src 192.168.0.0/16
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
http_access allow localnet
http_access deny all
http_port 3128
forwarded_for off
request_header_access Via deny all

上面係 Gemini 比我嘅建議,不過我係咁樣 set:

# 允許所有來源連線 (僅建議測試使用)
acl all_access src all
http_access allow all

# Default Listening Port
http_port 0.0.0.0:3128

# Cache & Log Locations
coredump_dir /var/spool/squid

# 關閉快取(若只需轉發流量)
cache deny all


# 隱藏轉發標頭,增加匿名性
forwarded_for off
request_header_access Via deny all

📝 ③ docker-compose.yml (核心編排檔)

安全重點:Squid 的 3128 埠口必須開在 VPN 容器上,且 Squid 必須強制使用 VPN 的網絡模式 (network_mode)。同時開啟了 OpenVPN TCP 443 模式以繞過封鎖,並啟用 DoT 加密 DNS。

version: '3'

services:
  vpn:
    image: qmcgaw/gluetun
    container_name: surfshark_vpn2_${CONTAINER_SUFFIX}
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      # VPN 基本設定
      - VPN_SERVICE_PROVIDER=surfshark
      - VPN_TYPE=${VPN_TYPE:-openvpn} # 預設使用 OpenVPN
      # 填入你的 Surfshark OpenVPN 帳號密碼 (通常是一串很長的隨機字元,需在後台取得)
      - OPENVPN_USER=${OPENVPN_USER}
      - OPENVPN_PASSWORD=${OPENVPN_PASSWORD}
      # 關鍵設定:強制使用 TCP
      - OPENVPN_PROTOCOL=tcp
      # 你想跨區連線的國家 (例如 Japan, Taiwan, US)
      - SERVER_COUNTRIES=${VPN_COUNTRY}
      # 開啟內建的 DNS over TLS (DoT)
      - DOT=on
      - BLOCK_SURVEILLANCE=off
      - BLOCK_ADS=off
      - HTTPPROXY=on
      - HTTPPROXY_LISTENING_ADDRESS=0.0.0.0:3888
      - HTTPPROXY_LOG=on
    ports:
      # 將 Squid 的 3128 Port 開放給內聯網連接 (重要:這裡必須寫在 VPN 容器下)
      - "${HOST_PORT}:${CONTAINER_PORT}"
      - "0.0.0.0:3888:3888" # Gluetun Porxy server
    restart: unless-stopped

  squid:
    image: ubuntu/squid
    container_name: squid_proxy2_${CONTAINER_SUFFIX}
    # 核心設定:讓 Squid 強制使用 VPN 容器的網絡
    network_mode: "service:vpn"
    depends_on:
      - vpn
    volumes:
      - ./squid.conf:/etc/squid/squid.conf:ro
    restart: unless-stopped

🚀 3. 常用操作指令

  • 啟動服務:docker compose –env-file .\.env up -d
  • 關閉服務:docker compose down
  • 檢查 VPN 連線狀態(日誌):docker logs -f surfshark_vpn2
  • 手動更換國家:1. 打開 .env 修改 VPN_COUNTRY 2. 執行 docker compose restart vpn 即可

🔒 4. 安全與隱私狀態

  1. 內容絕對保密:所有流量在離開你電腦前已被 VPN 加密,並偽裝成普通 HTTPS (Port 443) 流量。公司 IT 睇唔到你睇緊咩網頁、入咗咩密碼。
  2. 無 DNS 洩漏:Gluetun 內建 Unbound DNS 並開啟了 DoT (DNS over TLS),所有網址查詢直接在加密通道內完成,公司 DNS 伺服器完全無法監測。
  3. 安全建議(辦公室生存):公司 IT 雖然睇唔到內容,但睇得到「流量大小」。盡量避免長時間狂睇 4K 影片或下載巨型檔案,避免大流量引起 IT 同事注意。