1. 为什么vLLM服务需要网络策略:vLLM架构特点、暴露端口分析、常见攻击面

说实话,我第一次在生产环境部署vLLM的时候,差点翻车。

那时候我习惯性地把服务往K8s里一丢,配个Service就完事了。结果第二天一查日志,发现有人在疯狂扫我的API端口。嗯,从那以后,我再也不敢轻视网络策略了。

今天我们就来聊聊,为什么vLLM服务特别需要网络策略的保护。

1.1 vLLM的架构特点

vLLM本质上是一个高性能推理引擎。它把大模型加载到GPU显存里,然后对外提供API接口。你想想看,一个能跑Llama 3 70B的服务,显存占用少说也得140GB起步。

它的架构大概长这样:

vLLM 服务架构简图 客户端 API 网关 /v1/chat/completions vLLM 推理引擎 PagedAttention GPU 显存 (模型权重) Prometheus 指标 /health /metrics 暴露端口:8000 (API) | 8001 (指标) | 8002 (内部通信)

从图上你能看到,vLLM对外暴露了好几个端口。每个端口都有不同的用途,也对应着不同的风险。

1.2 暴露端口分析

我整理了一份端口清单,你在部署的时候一定要对照着看:

端口 用途 风险等级 说明
8000 OpenAI 兼容 API 推理接口,可被直接调用
8001 Prometheus 指标 暴露模型性能数据
8002 内部通信 多GPU节点间通信
8080 健康检查 K8s探针使用

我个人习惯把8000端口视为最高风险点。为什么呢?因为它是直接面向用户的推理入口。一旦暴露在公网,任何人都可以调用你的模型,消耗你的GPU资源。

⚠️ 我曾经踩过的坑: 有一次我把vLLM的8000端口直接暴露在公网,结果被人用脚本疯狂调用,一晚上跑了300万次推理请求。第二天看到账单的时候,我整个人都不好了。GPU费用直接爆表。

1.3 常见攻击面分析

说白了,vLLM服务面临的攻击面主要有这么几类:

1.3.1 API滥用攻击

这是最常见的。攻击者通过你的API接口,无限制地发送推理请求。你想想看,一次推理可能消耗几十GB的显存,并发一上来,GPU直接OOM。

  • 无限制调用:没有认证,谁都能用
  • 大Token攻击:故意发送超长上下文,耗尽显存
  • 并发风暴:短时间内发起大量请求

1.3.2 指标泄露

8001端口暴露的Prometheus指标,看起来人畜无害。但你知道吗?里面包含了模型名称、请求延迟、GPU利用率等信息。这些数据对竞争对手来说,价值连城。

💡 一个小技巧: 我在生产环境里,会把8001端口绑定到127.0.0.1,只让Prometheus Server通过Sidecar抓取。这样外部完全无法访问。

1.3.3 内部通信劫持

如果你部署了多节点vLLM(比如张量并行),节点之间需要通过8002端口通信。这个端口如果暴露,攻击者可以注入伪造的推理结果,或者窃取中间数据。

1.3.4 健康检查接口滥用

虽然风险低,但也不是完全没风险。我记得有一次,有人通过反复调用/health接口,让K8s的探针误判,导致Pod被频繁重启。

1.4 为什么网络策略是必需品

你可能会问:我加个认证不就行了?

嗯,认证确实能挡住一部分攻击。但你想过没有:

  • 认证本身也有漏洞(比如JWT泄露)
  • 内部服务之间的通信,认证往往被忽略
  • 指标端口通常没有认证

网络策略的作用,就是在网络层面做一层隔离。说白了,就是告诉K8s:哪些Pod可以访问vLLM,哪些不行。

核心原则:
  1. API端口(8000):只允许Ingress Controller访问
  2. 指标端口(8001):只允许Prometheus访问
  3. 内部通信(8002):只允许同组vLLM Pod访问
  4. 健康检查(8080):只允许Kubelet访问

这样做的好处很明显:即使某个Pod被攻破了,攻击者也无法横向移动到你vLLM的内部端口。

好了,这一章我们分析了vLLM为什么需要网络策略。下一章我会手把手教你写NetworkPolicy的YAML,把刚才说的这些原则落地。

📌 课后思考: 如果你的vLLM部署在公有云上,云厂商的安全组和K8s NetworkPolicy,你觉得哪个优先级更高?我个人建议两者都配,形成纵深防御。

公众号:蓝海资料掘金营,微信deep3321