Appearance
Shadowsocks Sidecar 代理
在 Kubernetes 中以 Sidecar 模式部署 Shadowsocks,透過 Azure Internal LoadBalancer 對內網提供 SOCKS5 代理服務。
概述
Shadowsocks 是一款輕量級的加密代理協定,常用於建立安全的網路通道。在 Kubernetes 環境中,可以將 Shadowsocks 部署為內網的 SOCKS5 代理服務,讓叢集外的內網機器能透過它存取特定的網路資源。
本方案的特色在於採用 Sidecar 模式:在同一個 Pod 中同時運行 ss-server 與 ss-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 代理支援更廣泛的協定,且傳輸內容經過加密。
部署設定參考
以下為實際部署時使用的完整設定,供日後查詢與複製使用。
環境參數
| 項目 | 值 |
|---|---|
| Namespace | ingress-basic |
| 加密方式 | chacha20-ietf-poly1305 |
| SOCKS5 監聽埠 | 1080 |
| ss-server 監聽埠 | 8388(僅 localhost) |
| LoadBalancer IP | 10.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:1080ss-server 參數速查
| 參數 | 值 | 說明 |
|---|---|---|
-s | 127.0.0.1 | 監聽位址(僅限 localhost) |
-p | 8388 | 監聽埠號 |
-m | chacha20-ietf-poly1305 | 加密方式 |
-k | $(SS_PASSWORD) | 密碼(從 Secret 注入) |
--fast-open | — | 啟用 TCP Fast Open |
--no-delay | — | 啟用 TCP No Delay |
-u | — | 啟用 UDP relay |
ss-local 參數速查
| 參數 | 值 | 說明 |
|---|---|---|
-s | 127.0.0.1 | 上游 ss-server 位址 |
-p | 8388 | 上游 ss-server 埠號 |
-l | 1080 | 本地 SOCKS5 監聽埠 |
-b | 0.0.0.0 | 本地監聽位址(對外開放) |
-m | chacha20-ietf-poly1305 | 加密方式 |
-k | $(SS_PASSWORD) | 密碼(從 Secret 注入) |
--fast-open | — | 啟用 TCP Fast Open |
--no-delay | — | 啟用 TCP No Delay |
-u | — | 啟用 UDP relay |
相關概念
- Squid Proxy(Kubernetes 部署) — 另一種代理方案,側重 HTTP/HTTPS 正向代理與快取
- Prometheus Exporter 部署模式 — 可考慮為 Shadowsocks 部署自訂 metrics 端點以進行監控
- Samba + Nginx 檔案分享服務(Kubernetes 部署) — 同樣採用 Sidecar 容器架構的部署模式