如何通过Azure CNI网络策略限制Kubernetes Pod仅访问指定FQDN/DNS?
如何限制Kubernetes Pod出站仅访问指定FQDN
通用实现方案
- Istio
使用Istio的EgressRule资源可以直接配置FQDN级别的出站规则,示例:
apiVersion: config.istio.io/v1alpha2 kind: EgressRule metadata: name: googleapis namespace: default spec: destination: service: "*.googleapis.com" ports: - port: 443 protocol: https
- Cilium
Cilium网络策略原生支持toFQDNs字段,可直接匹配域名规则,示例:
apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: "fqdn" spec: endpointSelector: matchLabels: app: some-pod egress: - toFQDNs: - matchName: "api.twitter.com" - toEndpoints: - matchLabels: "k8s:io.kubernetes.pod.namespace": kube-system "k8s:k8s-app": kube-dns toPorts: - ports: - port: "53" protocol: ANY rules: dns: - matchPattern: "*"
- OpenShift
OpenShift自带的EgressNetworkPolicy支持dnsName字段配置允许的域名,示例:
apiVersion: network.openshift.io/v1 kind: EgressNetworkPolicy metadata: name: default-rules spec: egress: - type: Allow to: dnsName: www.example.com - type: Deny to: cidrSelector: 0.0.0.0/0
Azure CNI 场景下的实现方案
原生基础版Azure CNI搭配默认iptables网络策略不直接支持FQDN规则,可通过以下两种方案实现管控:
方案1:Azure CNI + Cilium 数据面
AKS支持直接启用Azure CNI powered by Cilium,启用后可直接复用Cilium原生的FQDN网络策略能力,和上述通用Cilium方案的配置完全兼容,无需额外调整。
方案2:传统Azure CNI + Azure Firewall 联动
如果使用传统Azure CNI不想更换数据面,可通过网络策略和Azure防火墙配合实现:
- 配置Kubernetes网络策略,允许目标Pod仅可访问kube-dns服务的53端口,以及出站到Azure Firewall的私有IP,默认拒绝其余所有出站流量
- 在Azure Firewall中配置应用层规则,仅允许指定FQDN的出站请求,默认拒绝其余公网流量
- 配置集群路由表,将Pod的所有公网出站流量路由到Azure Firewall,由防火墙完成FQDN层面的过滤
- 注意:该方案无需手动维护FQDN对应的IP地址,Azure Firewall会自动同步域名解析结果更新规则。
内容的提问来源于stack exchange,提问作者ALeX
相关产品推荐
相关产品推荐

