凌晨两点,我正在处理一个紧急告警:生产环境的 AI 网关突然返回 403 Forbidden 错误,所有调用链全部熔断。业务团队的电话一个接一个打进来,而我花了一个小时才定位到问题根源——某位同事误删了测试服务器的 IP 白名单规则。

这个惨痛的经历让我深刻认识到:AI Gateway 的 IP 访问控制不是可选项,而是生产环境的安全基座。本文将手把手带你从零掌握 IP 白名单/黑名单的配置方法,覆盖 HolySheep API Gateway、主流开源方案以及企业级最佳实践。

为什么需要配置 IP 白名单与黑名单

在 AI API 调用场景中,IP 访问控制主要解决以下问题:

HolySheep API Gateway 的 IP 控制配置

HolySheep API 提供了开箱即用的 IP 访问控制能力,无需额外部署网关即可实现白名单管理。

基础配置:通过 Dashboard 管理 IP 规则

  1. 登录 HolySheep 控制台
  2. 进入「API Keys」→ 选择对应的 Key → 「IP Whitelist」
  3. 添加允许访问的 IP 地址或 CIDR 网段

通过 API 动态管理 IP 规则

# Python SDK 示例:管理 IP 白名单
import requests

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"

headers = {
    "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
    "Content-Type": "application/json"
}

添加 IP 白名单规则

response = requests.post( f"{BASE_URL}/api-keys/ak-xxxx/whitelist", headers=headers, json={ "ip_rules": [ {"ip": "10.0.0.1", "description": "生产服务器-华东"}, {"ip": "10.0.0.2", "description": "生产服务器-华南"}, {"ip": "192.168.1.0/24", "description": "办公网络"}, {"ip": "203.0.113.50", "description": "CI/CD 服务器"} ], "mode": "whitelist" # whitelist 或 blacklist } ) print(response.json())
# 查询当前 IP 规则
response = requests.get(
    f"{BASE_URL}/api-keys/ak-xxxx/whitelist",
    headers=headers
)
print(response.json())

输出示例:

{

"mode": "whitelist",

"ip_rules": [

{"ip": "10.0.0.1", "description": "生产服务器-华东"},

...

],

"matched_ip": "10.0.0.1",

"is_allowed": true

}

SDK 集成:自动注入 IP 头

# HolySheep Python SDK 自动处理 IP 来源检测
from holysheep import HolySheep

client = HolySheep(
    api_key="YOUR_HOLYSHEEP_API_KEY",
    # SDK 会自动携带 X-Forwarded-For 或 X-Real-IP 头
    # 如果需要手动指定来源 IP(代理场景):
    source_ip="203.0.113.50"
)

正常调用即可,SDK 会自动处理 IP 头

response = client.chat.completions.create( model="gpt-4.1", messages=[{"role": "user", "content": "测试消息"}] ) print(response.choices[0].message.content)

开源 AI Gateway 方案:使用 Nginx/Envoy 配置 IP 控制

对于自建 AI 网关的场景,Nginx 和 Envoy 是两个主流选择。

Nginx + Lua 实现动态 IP 校验

# nginx.conf - IP 白名单配置
http {
    # 定义白名单 IP 列表
    geo $whitelist {
        default 0;
        10.0.0.0/8 1;      # 内部网络
        172.16.0.0/12 1;   # 私有网络
        192.168.0.0/16 1;  # 办公网络
        127.0.0.1 1;       # 本地
    }

    server {
        listen 8080;
        location /v1/chat/completions {
            # 检查 IP 白名单
            if ($whitelist = 0) {
                return 403 '{"error": {"message": "IP not in whitelist", "type": "access_denied"}}';
            }

            # 限流配置
            limit_req zone=ai_api burst=20 nodelay;

            # 代理到后端 AI 服务
            proxy_pass http://ai-backend/v1/chat/completions;
            proxy_set_header Host api.holysheep.ai;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

Envoy Proxy 高级 IP 控制

# envoy.yaml - Envoy 配置示例
static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ai_gateway
          route_config:
            name: local_route
            virtual_hosts:
            - name: ai_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/v1/chat/completions"
                route:
                  cluster: ai_backend
          http_filters:
          - name: envoy.filters.http.lua
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
              inline_code: |
                function envoy_on_request(request_handle)
                  local source_ip = request_handle:headers():get("X-Real-IP")
                  if not source_ip then
                    source_ip = "unknown"
                  end
                  
                  -- IP 白名单校验
                  local whitelist = {
                    ["10.0.0.1"] = true,
                    ["10.0.0.2"] = true,
                    ["192.168.1.0/24"] = true
                  }
                  
                  if not whitelist[source_ip] then
                    request_handle:respond(
                      {[":status"] = "403"},
                      '{"error": {"message": "Access denied: IP not in whitelist"}}'
                    )
                  end
                end
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: ai_backend
    connect_timeout: 5s
    type: strict_dns
    lb_policy: round_robin
    hosts:
    - socket_address:
        address: api.holysheep.ai
        port_value: 443
    transport_socket:
      name: envoy.transport_sockets.tls

企业级方案:基于 JWT + IP 双重认证

对于高安全要求的场景,推荐结合 JWT Token 和 IP 白名单实现双重认证。

# Python 实现 JWT + IP 双重验证中间件
from functools import wraps
import jwt
import requests

class AIGatewayAuth:
    def __init__(self, jwt_secret: str, whitelist: list):
        self.jwt_secret = jwt_secret
        self.whitelist = set(whitelist)
    
    def verify_request(self, token: str, client_ip: str) -> dict:
        try:
            # 1. 验证 JWT Token
            payload = jwt.decode(token, self.jwt_secret, algorithms=["HS256"])
            
            # 2. 验证 IP 白名单
            if not self._is_ip_allowed(client_ip):
                raise PermissionError(f"IP {client_ip} not in whitelist")
            
            # 3. 验证 Token 有效期
            from datetime import datetime
            exp = datetime.fromtimestamp(payload['exp'])
            if exp < datetime.now():
                raise jwt.ExpiredSignatureError("Token expired")
            
            return payload
            
        except jwt.InvalidTokenError as e:
            raise ValueError(f"Invalid token: {e}")
    
    def _is_ip_allowed(self, ip: str) -> bool:
        # 支持 CIDR 格式
        for allowed in self.whitelist:
            if '/' in allowed:
                import ipaddress
                if ipaddress.ip_address(ip) in ipaddress.ip_network(allowed):
                    return True
            elif ip == allowed:
                return True
        return False

使用示例

auth = AIGatewayAuth( jwt_secret="your-256-bit-secret", whitelist=[ "10.0.0.1", "10.0.0.2", "192.168.1.0/24", "203.0.113.0/24" # CI/CD 网络 ] ) def call_ai_api(token: str, client_ip: str, prompt: str): try: payload = auth.verify_request(token, client_ip) response = requests.post( "https://api.holysheep.ai/v1/chat/completions", headers={ "Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY", "X-Client-IP": client_ip, "X-User-ID": payload['user_id'], "X-Tenant-ID": payload.get('tenant_id', 'default') }, json={ "model": "claude-sonnet-4.5", "messages": [{"role": "user", "content": prompt}], "max_tokens": 1000 }, timeout=30 ) return response.json() except PermissionError as e: return {"error": str(e), "status": 403} except Exception as e: return {"error": str(e), "status": 500}

常见错误与解决方案

错误一:403 Forbidden - IP not in whitelist

# 错误响应示例

HTTP/1.1 403 Forbidden

{

"error": {

"message": "IP 203.0.113.50 is not in the whitelist",

"type": "access_denied",

"code": "IP_BLACKLISTED"

}

}

解决方案:检查 X-Forwarded-For 是否被正确传递

Nginx 配置中添加:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr;

或在代码中指定 source_ip

client = HolySheep( api_key="YOUR_HOLYSHEEP_API_KEY", source_ip="203.0.113.50" # 必须是白名单中的 IP )

错误二:401 Unauthorized - Invalid API Key

# 排查步骤:

1. 确认 API Key 格式正确(应为 ak- 开头)

HOLYSHEEP_API_KEY = "ak-xxxxxxxxxxxxxxxxxxxx"

2. 检查 Key 是否已添加到白名单

登录 HolySheep 控制台 → API Keys → 查看对应的 IP 规则

3. 如果使用代理,确保 Authorization 头不被修改

proxies = { "http": "http://proxy:8080", "https": "http://proxy:8080" } response = requests.post( f"{BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {HOLYSHEEP_API_KEY}", "Content-Type": "application/json" }, json=payload, proxies=proxies, verify=False # 如果是自签名证书 )

错误三:Connection Timeout - Proxy/Gateway Issues

# 超时配置最佳实践
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def create_session() -> requests.Session:
    session = requests.Session()
    
    # 配置重试策略
    retry = Retry(
        total=3,
        backoff_factor=0.5,
        status_forcelist=[500, 502, 503, 504]
    )
    
    adapter = HTTPAdapter(
        max_retries=retry,
        pool_connections=10,
        pool_maxsize=20
    )
    session.mount('https://', adapter)
    
    return session

使用配置好的 Session

session = create_session() try: response = session.post( "https://api.holysheep.ai/v1/chat/completions", headers={"Authorization": f"Bearer {HOLYSHEEP_API_KEY}"}, json={"model": "gpt-4.1", "messages": [{"role": "user", "content": "hi"}]}, timeout=(5, 30) # (connect_timeout, read_timeout) ) except requests.exceptions.Timeout: print("请求超时,请检查网络或调整 timeout 参数")

错误四:CDN/WAF 导致的 IP 误判

# 问题:使用 Cloudflare/阿里云 CDN 后,源站获取的是 CDN 节点 IP

解决方案:信任代理层 IP,在 HolySheep 配置中指定信任的代理 IP 段

方案1:使用 CF-Connecting-IP 头(Cloudflare)

if request.headers.get('CF-Connecting-IP'): real_ip = request.headers['CF-Connecting-IP'] else: real_ip = request.remote_addr

方案2:在 HolySheep 白名单中添加 CDN IP 段

cdn_whitelist = [ "103.21.244.0/22", # Cloudflare "103.22.200.0/22", "104.16.0.0/13", "172.64.0.0/13", "198.41.128.0/17", # 阿里云 CDN "39.96.0.0/13", "42.120.0.0/15", ]

方案3:使用 HolySheep 的企业版功能,让其信任特定代理

联系 HolySheep 支持配置 X-Forwarded-For 信任链

实战经验:我的 IP 白名单配置流程

我在部署生产环境 AI 网关时,总结出一套高效的 IP 管理流程:

  1. 分离环境:生产、预发、测试环境使用不同的 API Key,每个 Key 绑定独立的白名单
  2. 最小权限:白名单只添加必要 IP,避免使用 0.0.0.0/0 允许所有
  3. CIDR 优先:使用网段而非单 IP,便于扩展
  4. 监控告警:配置 IP 变更通知,任何白名单修改都发送告警
  5. 灰度发布:新 IP 先加入测试环境,验证后再同步到生产
# 我的自动化部署脚本片段
#!/bin/bash

deploy_with_ip_whitelist.sh

PROD_IPS=( "10.0.1.10" # 生产-K8S-Master-1 "10.0.1.11" # 生产-K8S-Master-2 "10.0.1.20/28" # 生产-K8S-Node节点池 "10.0.2.0/24" # 生产-VPC-Peering )

动态更新白名单

curl -X PUT "https://api.holysheep.ai/v1/api-keys/ak-$API_KEY/whitelist" \ -H "Authorization: Bearer $HOLYSHEEP_API_KEY" \ -H "Content-Type: application/json" \ -d "$(jq -n \ --arg mode "whitelist" \ --argjson ips "$(printf '%s\n' "${PROD_IPS[@]}" | jq -R . | jq -s .)" \ '{ip_rules: $ips | to_entries | map({ip: ., description: ("Server-" + (.key+1|tostring))}), mode: $mode}')" echo "白名单已更新,共 ${#PROD_IPS[@]} 条规则"

性能对比:不同方案的延迟开销

在我实际测试中,IP 白名单检查的延迟开销可以忽略不计:

对于大多数场景,IP 校验不会成为性能瓶颈。

总结与建议

IP 白名单是保护 AI API 调用的第一道防线,建议所有生产环境都启用。配置时注意:

HolySheep 提供的原生 IP 白名单功能无需额外部署,支持 API 动态管理,非常适合快速迭代的团队。如果你正在寻找稳定、低延迟、性价比高的 AI API 服务,立即注册 HolySheep AI,获取首月赠额度体验完整功能。

有任何配置问题,欢迎在评论区留言,我会第一时间解答。