Stories

Detail Return Return

藍易雲:HTTPS代理搭建技巧分享 - Stories Detail

以下方案聚焦 企業級合規場景 的 HTTPS 代理(正向代理/出口網關與反向代理/TLS 終止)建設與優化,強調 可運營、可觀測、可擴展。為方便審閲,文中關鍵點以 <span style="color:red">紅色</span> 標註,並逐條解釋命令與配置。🚀


1)架構要點與選型結論

  • 出口統一:用 <span style="color:red">Squid</span> 做 HTTP CONNECT 正向代理(成熟穩定、ACL 精細);同時以 <span style="color:red">HAProxy</span> 作為 四層緩衝與健康檢查 層,承接高併發。
  • 對外服務:用 <span style="color:red">Nginx 1.25+</span> 負責 反向代理 + TLS1.3 終止 + HTTP/2/HTTP/3,並啓用 <span style="color:red">OCSP Stapling</span>。
  • 安全與審計:統一 <span style="color:red">IP 白名單 + 賬號認證 + 細粒度 ACL</span>,集中日誌到 ELK/ClickHouse,開啓 <span style="color:red">WAF/限速</span>。
  • 可用性:前置 <span style="color:red">LVS/Keepalived</span> 或雲負載,後端多活,<span style="color:red">灰度放量</span>。

2)正向代理:HAProxy(承壓)→ Squid(策略)

HAProxy 作為四層入口(:443 / :3128),承接 CONNECT 與 TLS 透傳:

# 安裝(Debian/Ubuntu)
apt update && apt install -y haproxy

解釋:更新索引並安裝 HAProxy,作為四層負載與緩衝前置。

# /etc/haproxy/haproxy.cfg (精簡示例)
global
  maxconn 100000
  log /dev/log local0
  tune.ssl.default-dh-param 2048

defaults
  mode tcp
  timeout connect 5s
  timeout client  60s
  timeout server  60s
  option dontlognull

frontend fe_proxy
  bind :3128
  tcp-request inspect-delay 5s
  tcp-request content accept if HTTP
  use_backend be_squid if { req.len 0:1024 -m reg -i ^CONNECT\ .+\ HTTP/1\.[01] }
  default_backend be_squid

backend be_squid
  balance roundrobin
  server s1 10.0.0.11:3128 check maxconn 20000
  server s2 10.0.0.12:3128 check maxconn 20000

解釋

  • mode tcp:四層代理,低開銷高併發。
  • inspect-delay/content accept if HTTP:識別 HTTP/CONNECT。
  • use_backend:將 CONNECT 請求分流至 Squid 集羣。
  • check maxconn:健康檢查與併發上限,<span style="color:red">防止後端被打滿</span>。

Squid 實現 CONNECT 與精細 ACL:

# 安裝(Debian/Ubuntu)
apt update && apt install -y squid apache2-utils

解釋:安裝 Squid 和 htpasswd 工具以啓用 <span style="color:red">Basic Auth</span>。

# 建立認證用户
htpasswd -bc /etc/squid/passwd ops_user StrongP@ss-2025!
chmod 640 /etc/squid/passwd && chown proxy:proxy /etc/squid/passwd

解釋:創建賬號並收緊權限,避免憑據泄露。

# /etc/squid/squid.conf(核心片段)
http_port 3128
acl allowed_src src 10.0.0.0/24 10.0.1.0/24
acl CONNECT method CONNECT

# 目標域名/端口白名單(示例)
acl allowed_ports port 443 8443
acl allowed_dstdomain dstdomain .example.com .example.org

# 認證
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
acl auth_users proxy_auth REQUIRED

# 訪問控制(先嚴後寬)
http_access deny !allowed_src
http_access deny !auth_users
http_access deny CONNECT !allowed_ports
http_access allow allowed_dstdomain
http_access deny all

# 併發與穩定性
max_filedescriptors 65535
request_timeout 60 seconds
shutdown_lifetime 3 seconds

# 日誌(建議落地到獨立盤)
access_log daemon:/var/log/squid/access.log
cache_log /var/log/squid/cache.log

解釋

  • allowed_src/allowed_dstdomain:<span style="color:red">零信任思路:默認拒絕,僅白名單放行</span>。
  • proxy_auth:賬號認證,實現責任到人。
  • deny/allow 順序決定策略效果,確保先鑑權、再放行。
  • max_filedescriptors:提升併發句柄,匹配高併發場景。
# 生效與開機自啓
systemctl enable --now squid
systemctl restart haproxy

解釋:啓動並納管服務,確保重啓後自動恢復。


3)反向代理:Nginx(TLS1.3 + H2/H3 + 限速/防濫用)

# 安裝 Nginx(主線版本建議 1.25+ 以支持 HTTP/3/QUIC)
apt install -y nginx

解釋:安裝反向代理網關,承擔 TLS 終止與協議升級。

# /etc/nginx/conf.d/app.conf(核心片段)
server {
    listen 443 ssl http2;
    # 如需 HTTP/3:listen 443 quic reuseport;  # 需內核/防火牆放行 UDP/443
    server_name app.example.com;

    ssl_certificate     /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_stapling on; ssl_stapling_verify on;

    # 基於來源限速,緩解突發
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=20r/s;

    location / {
        limit_req zone=req_zone burst=40 nodelay;
        proxy_pass http://app_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
    }
}

upstream app_backend {
    server 10.0.2.10:8080 max_fails=2 fail_timeout=5s;
    server 10.0.2.11:8080 max_fails=2 fail_timeout=5s;
    keepalive 256;
}

解釋

  • ssl_stapling:開啓 <span style="color:red">OCSP stapling</span>,減少握手延遲。
  • limit_req:限制每源速率並允許突發,<span style="color:red">防止濫用與雪崩</span>。
  • keepalive:提高複用率,降低後端連接抖動。
  • HTTP/3 需開放 UDP/443 且配合新內核與 OpenSSL/QUIC 構建。
nginx -t && systemctl reload nginx

解釋:校驗配置並無縫加載,避免中斷流量。


4)系統內核與 FD/連接跟蹤優化(高併發關鍵)

cat <<'EOF' >/etc/sysctl.d/99-proxy.conf
net.core.somaxconn=10240
net.ipv4.ip_local_port_range=10000 65000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_syn_backlog=40960
net.netfilter.nf_conntrack_max=1048576
EOF
sysctl --system

解釋

  • somaxconn/tcp_max_syn_backlog:擴大排隊與握手隊列,<span style="color:red">抗瞬時洪峯</span>。
  • nf_conntrack_max:擴大連接跟蹤容量,減少丟包與超時。
ulimit -n 1048576

解釋:提升進程可用文件句柄上限,匹配代理進程的長連接規模。


5)認證、審計與可觀測性

# 統一日誌切割(示例)
logrotate -f /etc/logrotate.conf

解釋:按日切割代理日誌,防止日誌盤打滿並保障留痕審計。

  • 推薦:將 HAProxy/Squid/Nginx 的訪問日誌統一通過 Filebeat/Vector 收集至集中存儲(如 ClickHouse)。
  • 指標:接入 <span style="color:red">Prometheus + Grafana</span>,監控 5xx 比例、後端 RTT、拒絕率、認證失敗、源 IP 攻擊特徵
  • 告警:基於 <span style="color:red">異常放大因子</span>(如 5 分鐘內連接數/失敗率環比 > 2)觸發。

6)常見風險與治理抓手

  • <span style="color:red">濫用與外借賬號</span>:強制 2FA/短期密鑰輪換,異常地理與時段風控。
  • <span style="color:red">域名/端口泛開</span>:堅持 <span style="color:red">目標白名單</span>;必要時基於 SNI/JA3 指紋二次校驗。
  • <span style="color:red">證書與協議</span>:優先 TLS1.3,關閉過時套件;定期輪換證書與私鑰權限審計。
  • <span style="color:red">合規</span>:對外代理須經審批與記賬,訪問日誌留存週期與脱敏遵循公司與監管要求。

7)對比速覽(選型參考)

場景 組件 優勢 侷限 結論
正向代理(辦公/研發出口) <span style="color:red">Squid</span> ACL 細、成熟、穩定 配置相對複雜 首選策略引擎
入口承壓/多活 <span style="color:red">HAProxy</span> 四層高併發、健康檢查 七層策略有限 承壓與分流
反向代理(公網入口) <span style="color:red">Nginx 1.25+</span> TLS1.3/H2/H3、生態成熟 四層承壓不如 HAProxy 網關與終止
一體化網關 Envoy 觀測強、L7 特性全 學習曲線 大規模可評估

8)最小可行驗證(本地到生產的“三級跳”)

  1. <span style="color:red">開發驗證</span>:Docker 起一套 haproxy+squid+nginx,壓測(wrk/hey)驗證 CONNECT、限速與後端 RTT。
  2. <span style="color:red">灰度放量</span>:生產並行鏈路 10% 流量,觀測 24–72 小時;對比錯誤率與 P95。
  3. <span style="color:red">全面切換</span>:窗口期遷移,保留回滾路徑與只讀審計面板。

9)流程圖(vditor/Markdown 支持)

flowchart LR
A[Client] -->|CONNECT :3128| B[HAProxy TCP]
B --> C[Squid ACL/Auth]
C -->|允許| D[Internet TLS Sites]
C -->|拒絕/限速| E[日誌與告警]
A -->|HTTPS :443| F[Nginx TLS1.3/H2/H3]
F --> G[App Backend Pool]
F --> E

10)故障快速排查清單(要點直擊)

  • 連接失敗:ss -s/ss -lntup 查看監聽;journalctl -u haproxy -u squid -u nginx 查錯誤。
  • 握手慢:檢查 <span style="color:red">OCSP/證書鏈</span>、DNS 解析延遲與 MTU;開啓 ssl_stapling
  • 後端抖動:觀測 TCP RetransTIME_WAIT;調大 somaxconnkeepalive,並壓測核驗。
  • 濫用暴漲:限制源 IP 速率,臨時拉黑並覆盤賬號行為。

一句話總結:以 <span style="color:red">HAProxy 承壓</span>、<span style="color:red">Squid 授權與策略</span>、<span style="color:red">Nginx 終止與協議升級</span> 的“三段式”結構,配合 <span style="color:red">TLS1.3/HTTP/3、零信任白名單、細粒度審計</span>,即可構建 高可用、可觀測、可治理 的企業級 HTTPS 代理體系。📈

user avatar chunzhendegaoshan Avatar bytebase Avatar jacklv Avatar sw7cc Avatar menglihuaxiangbian Avatar lijiahui_5f4488326fd1b Avatar apicloud Avatar
Favorites 7 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.