<返回更多

cilium IP地址伪装Masquerading

2022-09-15  今日头条  煮酒论架构
加入收藏

Masquerading

POD的IPv4地址是典型的RFC1918私有地址块,因此不可公开路由。cilium将自动将离开群集的所有流量的源IP地址伪装为节点的IPv4地址,因为节点的IP地址已经在网络上可路由。

 

对于IPv6地址,只有在使用iptables实现模式时才执行伪装。

通过配置enable-ipv4-masquerade: false可以禁用IPV4地址伪装功能。enable-ipv6-masquerade: false可以禁用IPV6地址伪装。

配置

设置路由 CIDR

默认行为是排除本地节点的IP分配CIDR内的任何目的地。如果pod IP可以在范围更大的网络上路由,则可以使用以下选项指定该网络:ipv4-native-routing-cidr: 10.0.0.0/8(或ipv6-native-routing-cidr: fd00::/100,用于ipv6地址),该选项的含义是,目标地址是指定cidr内的所有目的地都不会被伪装。

设置伪装接口

伪装接口的配置详见下面的实现模型章节部分。

实现模型

基于eBPF

linux kernel 版本4.19之上时,基于eBPF是效率最高的地址伪装实现。通过helm安装时可通过选项bpf.masquerade=true启动。

当前版本cilium的eBPF地址伪装是通过 BPF NodePort特性实现的,未来会将解耦对BPF NodePort的依赖(GitHub issue 13732)以提升合规性与性能。

伪装只能在运行eBPF伪装程序的设备上进行。这意味着,如果在发送数据包的设备上运行伪装程序,从pod发送到外部地址的数据包将被伪装(到主机发送设备IPv4地址)。如果未指定,程序将自动附加到BPF NodePort设备检测机制选择的设备。要手动更改此设置,请使用devices选项。cilium status命令可以查看伪装程序正在哪些设备上运行:

$ kubectl -n kube-system exec ds/cilium -- cilium status | grep Masquerading
Masquerading:   BPF (ip-masq-agent)   [eth0, eth1]  10.0.0.0/16

上面的输出显示,伪装程序正在eth0和eth1设备上运行。

基于eBPF的伪装程序可以处理以下IPV4 L4协议:

 

默认情况下,从pod发送到ipv4-native-routing-cidr范围之外的IP地址的所有数据包都被伪装,但发送到群集其它节点的数据包除外。排除CIDR显示在上述cilium status输出(10.0.0.1/16)中。

当启用eBPF伪装时,从POD到集群节点外部IP的流量也不会被伪装。eBPF实现在这方面不同于基于iptables的伪装。详细信息可查看GitHub issue 17177。

为了实现更细粒度的控制,Cilium在eBPF中实现了ip-masq-agent,该代理可以通过 helm选项ipMasqAgent.enabled=true配置开启。

基于eBPF的ip-masq-agent支持配置文件中设置的nonMasqueradeCIDRs和masqLinkLocal选项。从pod发送到属于非伪装CIDR的任何CIDR的目的地的数据包不会被伪装。如果配置文件为空,代理将提供以下非伪装CIDR:

 

此外,如果masqLinkLocal未设置或设置为false,则169.254.0.0/16将附加到非伪装CIDR列表。

agent使用Fsnotify跟踪配置文件的更新,因此不需要相对原始的resyncInterval选项。

下面的实例展示了如果通过ConfigMap配置agent并验证。

apiVersion: v1
  kind: ConfigMap
  metadata:
    name: ip-masq-agent
  data:
    config: |
      nonMasqueradeCIDRs:
      - 10.0.0.0/8
      - 172.16.0.0/12
      - 192.168.0.0/16
      masqLinkLocal: true
$ kubectl create -n kube-system -f https://raw.githubusercontent.com/cilium/cilium/1.12.1/examples/kube.NETes-ip-masq-agent/rfc1918.yaml

$ # Wait ~60s until the ConfigMap is propagated into the configuration file

$ kubectl -n kube-system exec ds/cilium -- cilium bpf ipmasq list
IP PREFIX/ADDRESS
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

基于eBPF的地址伪装暂不支持IPV6

 

基于iptables

基于iptables地址伪装是在所有版本的内核都可以工作的通用实现。

默认行为将伪装离开非Cilium网络设备的所有流量。这通常会导致出现错误的行为。使用选项
egress-masquerade-interfaces: eth0可以限制执行伪装的网络设备接口。

也可以接口前缀的方法来指定执行接口。如指定eth+,所有匹配前缀eth的接口都将执行伪装。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>