Skip to content

Shadowsocks Sidecar 代理

在 Kubernetes 中以 Sidecar 模式部署 Shadowsocks,透過 Azure Internal LoadBalancer 對內網提供 SOCKS5 代理服務。

概述

Shadowsocks 是一款輕量級的加密代理協定,常用於建立安全的網路通道。在 Kubernetes 環境中,可以將 Shadowsocks 部署為內網的 SOCKS5 代理服務,讓叢集外的內網機器能透過它存取特定的網路資源。

本方案的特色在於採用 Sidecar 模式:在同一個 Pod 中同時運行 ss-serverss-local 兩個容器。ss-server 僅監聽 localhost,由 ss-local 連入並對外暴露 SOCKS5 埠。這種設計避免了直接將 Shadowsocks 協定暴露到網路上,僅對外提供標準的 SOCKS5 介面。

核心內容

Sidecar 架構設計

Pod 內部的資料流如下:

外部客戶端 → LoadBalancer:1080 → ss-local (0.0.0.0:1080)
                                    ↓ (localhost)
                                  ss-server (127.0.0.1:8388)
                                    ↓ (加密通道)
                                  目標伺服器

ss-server 綁定 127.0.0.1:8388,僅接受同 Pod 內的連線。這是關鍵的安全設計——Shadowsocks 的原生協定不對外暴露,外部只能看到標準的 SOCKS5 介面。

ss-local 連線至 127.0.0.1:8388(上游 ss-server),同時在 0.0.0.0:1080 對外提供 SOCKS5 代理服務。

兩個容器均使用 chacha20-ietf-poly1305 加密演算法,並啟用 TCP Fast Open、TCP No Delay 與 UDP Relay 以優化傳輸效能。

密碼管理

Shadowsocks 的共享密碼透過 Kubernetes Secret 管理。Secret 以 stringData 形式定義,兩個容器均以 secretKeyRef 方式注入相同的 SS_PASSWORD 環境變數。這確保密碼不會寫死在 Deployment YAML 中。

網路暴露

Service 採用 Azure Internal LoadBalancer,綁定至固定內網 IP 10.30.196.60,僅暴露 TCP 1080 埠(SOCKS5)。內網機器可直接透過此 IP 使用代理服務。

使用方式

部署完成後,內網機器可透過以下方式使用:

測試連線: curl --socks5 <LB-IP>:1080 https://ifconfig.me

設定環境變數: export ALL_PROXY=socks5://<LB-IP>:1080,讓支援 SOCKS5 的應用程式自動走代理。

部署注意事項

原始筆記中發現 ss-local-b 參數前缺少 - 號(寫成 "b" 而非 "-b"),這會導致 ss-local 無法正確綁定監聽位址。部署前務必確認所有 args 的格式正確。

關鍵要點

  • Sidecar 模式將 ss-server 限制在 localhost,僅對外暴露標準 SOCKS5 介面,提升安全性
  • chacha20-ietf-poly1305 提供現代化的加密保護,搭配 TCP Fast Open 與 No Delay 優化效能
  • 密碼透過 Kubernetes Secret 管理,避免明文暴露在部署設定中
  • 透過 Azure Internal LoadBalancer 綁定固定 IP,讓內網客戶端有穩定的代理入口
  • 注意 YAML 中 args 列表的格式,缺少 - 前綴是常見的部署錯誤

實際應用

此架構適合需要為內網機器提供安全出口的場景,例如讓開發環境或 CI/CD 管線透過加密通道存取外部資源。相較於 Squid Proxy(Kubernetes 部署) 的 HTTP/HTTPS 代理,Shadowsocks SOCKS5 代理支援更廣泛的協定,且傳輸內容經過加密。

部署設定參考

以下為實際部署時使用的完整設定,供日後查詢與複製使用。

環境參數

項目
Namespaceingress-basic
加密方式chacha20-ietf-poly1305
SOCKS5 監聽埠1080
ss-server 監聽埠8388(僅 localhost)
LoadBalancer IP10.30.196.60
LoadBalancer 類型Azure Internal

Kubernetes YAML(Secret + Deployment + Service)

yaml
apiVersion: v1
kind: Secret
metadata:
  name: ss-password
  namespace: ingress-basic
type: Opaque
stringData:
  password: "supershadowsocket"

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ss-proxy
  namespace: ingress-basic
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ss-proxy
  template:
    metadata:
      labels:
        app: ss-proxy
    spec:
      containers:
      - name: ss-server
        image: shadowsocks/shadowsocks-libev:latest
        command: ["ss-server"]
        args:
          - "-s"
          - "127.0.0.1"
          - "-p"
          - "8388"
          - "-m"
          - "chacha20-ietf-poly1305"
          - "-k"
          - "$(SS_PASSWORD)"
          - "--fast-open"
          - "--no-delay"
          - "-u"
        env:
        - name: SS_PASSWORD
          valueFrom:
            secretKeyRef:
              name: ss-password
              key: password
      - name: ss-local
        image: shadowsocks/shadowsocks-libev:latest
        command: ["ss-local"]
        args:
          - "-s"
          - "127.0.0.1"
          - "-p"
          - "8388"
          - "-l"
          - "1080"
          - "-b"
          - "0.0.0.0"
          - "-m"
          - "chacha20-ietf-poly1305"
          - "-k"
          - "$(SS_PASSWORD)"
          - "--fast-open"
          - "--no-delay"
          - "-u"
        ports:
          - name: socks5
            containerPort: 1080
            protocol: TCP
        env:
        - name: SS_PASSWORD
          valueFrom:
            secretKeyRef:
              name: ss-password
              key: password

---

apiVersion: v1
kind: Service
metadata:
  name: ss-socks5
  namespace: ingress-basic
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.30.196.60
spec:
  type: LoadBalancer
  selector:
    app: ss-proxy
  ports:
    - name: socks5
      protocol: TCP
      port: 1080
      targetPort: 1080

使用方式

bash
# 測試連線
curl --socks5 10.30.196.60:1080 https://ifconfig.me

# 設定環境變數供應用程式使用
export ALL_PROXY=socks5://10.30.196.60:1080

ss-server 參數速查

參數說明
-s127.0.0.1監聽位址(僅限 localhost)
-p8388監聽埠號
-mchacha20-ietf-poly1305加密方式
-k$(SS_PASSWORD)密碼(從 Secret 注入)
--fast-open啟用 TCP Fast Open
--no-delay啟用 TCP No Delay
-u啟用 UDP relay

ss-local 參數速查

參數說明
-s127.0.0.1上游 ss-server 位址
-p8388上游 ss-server 埠號
-l1080本地 SOCKS5 監聽埠
-b0.0.0.0本地監聽位址(對外開放)
-mchacha20-ietf-poly1305加密方式
-k$(SS_PASSWORD)密碼(從 Secret 注入)
--fast-open啟用 TCP Fast Open
--no-delay啟用 TCP No Delay
-u啟用 UDP relay

相關概念

來源