1、模塊定位與價值
- 多云接入:在同一 Nginx 實例前端接入來自多云平臺的私有鏈路時,能區分 AWS、GCP、Azure 特有的連接 ID。
- 安全審計:自動記錄云平臺側的 Endpoint/VPC ID,有助于聯調和安全事件追蹤。
- 路由分流:基于不同云平臺的私有鏈路 ID,定制化分發到各自后端或日志系統。
模塊在 Stream 層 讀取 PROXY Protocol v2 的 TLV(Type-Length-Value)字段,將其映射為 $proxy_protocol_tlv_*
變量供業務使用。
2、支持的云平臺與變量
云平臺 | TLV 字段 | 對應變量 | 含義 |
---|---|---|---|
AWS | AWS VPC Endpoint ID | $proxy_protocol_tlv_aws_vpce_id | 私有鏈路端點 ID(如 vpce-0123456789abcdef0 ) |
GCP | PSC Connection ID | $proxy_protocol_tlv_gcp_conn_id | Private Service Connect 會話標識 |
Azure | Private Endpoint Link ID | $proxy_protocol_tlv_azure_pel_id | 私有終結點鏈接 ID |
前置要求:
- 上游 LB/網關需支持 PROXY Protocol v2,并將對應云平臺 TLV 字段填寫完整。
- 在 Nginx
listen … proxy_protocol;
開啟后接收協議頭。
3、最簡配置示例
stream {server {listen 9000 proxy_protocol;# 立即返回 GCP PSC 連接 IDreturn 200 '$proxy_protocol_tlv_gcp_conn_id\n';}
}
- 客戶端(或上游負載均衡器)連入時攜帶 PROXY v2 TLV 中的
gcp_conn_id
。 - Nginx 解析后將該 ID 寫入
$proxy_protocol_tlv_gcp_conn_id
并直接響應。
4、高級應用
-
審計日志
stream {log_format audit '$remote_addr -> $proxy_protocol_addr | ''aws_vpce=$proxy_protocol_tlv_aws_vpce_id ''gcp_conn=$proxy_protocol_tlv_gcp_conn_id ''az_pel=$proxy_protocol_tlv_azure_pel_id';access_log /var/log/nginx/stream_audit.log audit;... }
集中記錄多云接入鏈路,方便安全團隊關聯云端事件。
-
云平臺分流
stream {map $proxy_protocol_tlv_aws_vpce_id $upstream {default backend-default:9000;~^vpce-aws-prod- aws-prod-backend:9000;}server {listen 9000 proxy_protocol;proxy_pass $upstream;} }
通過
map
將 AWS PrivateLink 不同 Endpoint 轉發至對應集群。 -
動態下游切換
結合 keyval,將$proxy_protocol_tlv_azure_pel_id
與后端列表在線關聯,無需 reload 即可拓撲變更。
5、注意事項
- PROXY Protocol 版本:僅支持 v2(TLV 擴展);v1(純文本)不包含 TLV。
- TLV 長度限制:云平臺 TLV 值長度各異,Nginx 會原樣返回,不進行截斷。
- 安全隔離:務必搭配
proxy_protocol
校驗和其他 ACL,避免惡意偽造 TLV。 - 性能影響:解析僅在握手階段完成,典型開銷 < 200 μs,不影響高并發吞吐。
6、總結
ngx_stream_proxy_protocol_vendor_module
讓 Nginx Stream 層具備「看懂云廠商私有鏈路標識」的能力,為多云場景下的 安全審計、鏈路分流、故障診斷 提供了輕量級、零侵入的解決方案。無需外部腳本或下層網絡設備配合,只要上游輸出標準 PROXY v2 TLV,即可在 Nginx 中輕松引用、記錄或基于其做自定義轉發。