Istio虚拟服务如何配置仅允许本地网络通过FQDN访问
实现方案
最适配你现有架构的实现方式是通过Istio原生的AuthorizationPolicy(授权策略)配置源IP白名单,无需改动现有Gateway、VirtualService的基础配置,步骤如下:
步骤1:确保Ingress Gateway能获取真实客户端源IP
这是IP限制规则生效的前提,需要调整两处配置:
- 修改Istio Ingress Gateway的Service配置,新增
externalTrafficPolicy: Local,避免SNAT导致源IP丢失:
# 你原有的istio-ingressgateway Service配置新增如下字段 spec: type: LoadBalancer externalTrafficPolicy: Local # 新增该行 selector: istio: ingressgateway # 其余原有配置保持不变
- 调整Istio Gateway配置,启用转发头识别,适配公网负载均衡的X-Forwarded-For透传:
# 你原有的default-gateway配置新增如下字段 spec: selector: istio: ingressgateway servers: # 原有80、443端口配置保持不变 # 新增网关拓扑配置 config: gatewayTopology: numTrustedProxies: 1 # 按你实际的前置负载均衡层数调整,1层公网LB就填1
步骤2:创建IP白名单授权策略
针对需要限制仅内网访问的服务,创建如下AuthorizationPolicy,将允许的内网网段和对应服务的FQDN填入即可:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: internal-service-access-control namespace: test spec: selector: matchLabels: istio: ingressgateway # 允许内网网段访问指定内部服务 rules: - from: - source: # 填入你本地内网的网段,按需调整 ipBlocks: ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"] to: - operation: # 填入所有需要仅内网访问的服务FQDN hosts: ["portainer.test.test", "other-internal-svc.test.test"] # 兜底规则:所有不符合上述条件的访问该类域名的请求直接拒绝 action: DENY rules: - to: - operation: hosts: ["portainer.test.test", "other-internal-svc.test.test"]
配置后即时生效,外部公网IP访问这些内部服务域名时会直接返回403拒绝,内网访问不受影响。
可选扩展方案(适合内部服务数量较多的场景)
你也可以拆分两套独立的Istio Ingress Gateway:
- 一套公网Gateway,绑定公网LB,用于对外开放的服务
- 一套内网Gateway,仅绑定内网IP,不对外暴露,所有内部服务的VirtualService绑定到该内网Gateway
同时DNS层面配置:内部服务的FQDN仅在内网DNS做解析,公网DNS不配置该类记录,从网络层面彻底隔离公网访问路径。
内容的提问来源于stack exchange,提问作者luizete
相关产品推荐
相关产品推荐

