通过 Network Policy 控制虚拟机网络请求

平台的虚拟机方案基于开源组件 KubeVirt 实现,实际上运行在 Pod 中。通过使用 Network Policy 的功能,可以控制虚拟机的入站和出站请求。

操作步骤

  1. 进入 Container Platform。

  2. 在左侧导航栏中,点击 Network > Network Policies。

  3. 点击 Create Network Policy。

  4. 按需配置以下参数。

    参数描述
    关联方式
    • 计算组件:按需选择目标计算组件;建议选择 All 作为目标计算组件。
    • 标签选择器:根据 Pod 的标签进行匹配。
    方向
    • Ingress:从外部发送到 Pod 的请求。
    • Egress:从 Pod 发送到外部的请求;如果要禁止虚拟机请求某个外部地址,请选择此项。
    协议在 TCP 或 UDP 之间进行选择。

    注意:
    • 当在虚拟机中使用域名请求外部服务时,需要添加 UDP 协议白名单,因为 DNS 协议使用 UDP。
    • 表单不支持配置 ICMP 协议;启用白名单规则后,ICMP 协议将被禁用,这将导致无法执行 Ping 操作。
    访问端口指定哪些端口的流量可以入站或出站。如果将此字段留空,则默认允许通过所有端口的流量。

    注意:这里需要同时为 UDP 和 TCP 协议放行 1053 和 53 端口,以允许 DNS 流量出站;否则,域名解析将失败。
    远端类型指定允许访问的远端类型。可选项包括:计算组件、namespace 和 IP 段。
    排除远端当远端类型为 IP 段 时,从白名单中移除指定的 IP(即禁止访问)。单个 IP 可按 IP/32 形式移除。

    注意:此字段仅支持输入 IP;如果域名对应的 IP 不明确,可以使用命令 curl -vvv <domain> 请求该域名,并从返回信息中获取对应的 IP 地址。
  5. 点击 Create。

使用 API

控制台表单映射到标准 Kubernetes NetworkPolicy (networking.k8s.io/v1)。下面的示例允许 DNS 出站流量以及所有出站 IP 流量,但排除一个地址——这与下方 结果验证 场景的效果相同:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: vm-egress-allow
  namespace: demo
spec:
  # Association Method = Label Selector: select the virtual machine's pods.
  podSelector:
    matchLabels:
      vm.kubevirt.io/name: web-01
  policyTypes:
    - Egress
  egress:
    # Allow DNS (both UDP and TCP, ports 53 and 1053) or name resolution fails.
    - to:
        - namespaceSelector: {}
      ports:
        - { protocol: UDP, port: 53 }
        - { protocol: TCP, port: 53 }
        - { protocol: UDP, port: 1053 }
        - { protocol: TCP, port: 1053 }
    # Remote Type = IP Segment (cidr) with an excluded address (Exclude Remote).
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
              - 93.184.215.14/32

字段映射:关联方式(标签选择器) → spec.podSelector(通过 vm.kubevirt.io/name 选择虚拟机的 Pod);方向 → policyTypes 以及 ingress / egress;协议 / 访问端口 → ports;远端类型 = IP 段 → ipBlock.cidr;排除远端 → ipBlock.except。

结果验证

本文通过虚拟机访问 www.example.com 来验证该配置。

第一步:创建允许所有流量通过的虚拟机和网络策略

  1. 创建虚拟机,详细步骤请参考 创建虚拟机。

  2. 在虚拟机的命名空间中配置网络策略,为 TCP 和 UDP 协议添加白名单规则,参数如下:

    • TCP 协议白名单:

      参数描述
      关联方式选择 计算组件。
      目标计算组件选择 All。
      方向选择 Egress。
      协议选择 TCP。
      远端类型选择 IP 段
      远端输入 0.0.0.0/0,表示允许所有流量出站。
    • UDP 协议白名单规则:

      参数描述
      方向选择 Egress。
      协议选择 UDP。
      远端类型选择 IP 段
      远端输入 0.0.0.0/0,表示允许所有流量出站。
  3. 网络策略创建后,登录虚拟机并执行以下命令请求 www.example.com。

    curl www.example.com
  4. 请求成功。

第二步:更新网络策略,将 www.example.com 从白名单中移除

  1. 执行以下命令以获取 www.example.com 的 IP 地址,结果为 93.184.215.14。

    curl -vvv www.example.com
  2. 更新 第一步 中创建的网络策略,修改后的参数如下:

    参数描述
    排除远端在 TCP 协议白名单规则中,将排除远端参数填入 93.184.215.14/32,表示将 IP 地址 93.184.215.14 从白名单中移除。
  3. 更新网络策略后,登录虚拟机并执行以下命令请求 www.example.com。

    curl www.example.com
  4. 请求超时,说明排除远端功能已生效。