POD的IPv4地址是典型的RFC1918私有地址块,因此不可公开路由。cilium将自动将离开群集的所有流量的源IP地址伪装为节点的IPv4地址,因为节点的IP地址已经在网络上可路由。
对于IPv6地址,只有在使用iptables实现模式时才执行伪装。
通过配置enable-ipv4-masquerade: false可以禁用IPV4地址伪装功能。enable-ipv6-masquerade: false可以禁用IPV6地址伪装。
默认行为是排除本地节点的IP分配CIDR内的任何目的地。如果pod IP可以在范围更大的网络上路由,则可以使用以下选项指定该网络:ipv4-native-routing-cidr: 10.0.0.0/8(或ipv6-native-routing-cidr: fd00::/100,用于ipv6地址),该选项的含义是,目标地址是指定cidr内的所有目的地都不会被伪装。
伪装接口的配置详见下面的实现模型章节部分。
在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地址伪装是在所有版本的内核都可以工作的通用实现。
默认行为将伪装离开非Cilium网络设备的所有流量。这通常会导致出现错误的行为。使用选项
egress-masquerade-interfaces: eth0可以限制执行伪装的网络设备接口。
也可以接口前缀的方法来指定执行接口。如指定eth+,所有匹配前缀eth的接口都将执行伪装。