Iptables 规则¶
Kube-OVN 使用 ipset 及 iptables 辅助实现默认 VPC 下容器网络(Overlay)网关 NAT 的功能。
使用的 ipset 如下表所示:
名称(IPv4/IPv6) | 类型 | 存储对象 |
---|---|---|
ovn40services/ovn60services | hash:net | Service 网段 |
ovn40subnets/ovn60subnets | hash:net | Overlay 子网网段以及 NodeLocal DNS IP 地址 |
ovn40subnets-nat/ovn60subnets-nat | hash:net | 开启 NatOutgoing 的 Overlay 子网网段 |
ovn40subnets-distributed-gw/ovn60subnets-distributed-gw | hash:net | 开启分布式网关的 Overlay 子网网段 |
ovn40other-node/ovn60other-node | hash:net | 其它节点的内部 IP 地址 |
ovn40local-pod-ip-nat/ovn60local-pod-ip-nat | hash:ip | 已弃用 |
使用的 iptables 规则(IPv4)如下表所示:
表 | 链 | 规则 | 用途 | 备注 |
---|---|---|---|---|
filter | INPUT | -m set --match-set ovn40services src -j ACCEPT | 允许 k8s Service 和 Pod 相关流量通过 | -- |
filter | INPUT | -m set --match-set ovn40services dst -j ACCEPT | 同上 | -- |
filter | INPUT | -m set --match-set ovn40subnets src -j ACCEPT | 同上 | -- |
filter | INPUT | -m set --match-set ovn40subnets dst -j ACCEPT | 同上 | -- |
filter | FORWARD | -m set --match-set ovn40services src -j ACCEPT | 同上 | -- |
filter | FORWARD | -m set --match-set ovn40services dst -j ACCEPT | 同上 | -- |
filter | FORWARD | -m set --match-set ovn40subnets src -j ACCEPT | 同上 | -- |
filter | FORWARD | -m set --match-set ovn40subnets dst -j ACCEPT | 同上 | -- |
filter | OUTPUT | -p udp -m udp --dport 6081 -j MARK --set-xmark 0x0 | 清除流量标记,避免执行 SNAT | UDP: bad checksum on VXLAN interface |
nat | PREROUTING | -m comment --comment "kube-ovn prerouting rules" -j OVN-PREROUTING | 进入 OVN-PREROUTING 链处理 | -- |
nat | POSTROUTING | -m comment --comment "kube-ovn postrouting rules" -j OVN-POSTROUTING | 进入 OVN-POSTROUTING 链处理 | -- |
nat | OVN-PREROUTING | -i ovn0 -m set --match-set ovn40subnets src -m set --match-set ovn40services dst -j MARK --set-xmark 0x4000/0x4000 | 为 Pod 访问 Service 流量添加 masquerade 标记 | 作用于关闭内置 LB 的场景 |
nat | OVN-PREROUTING | -p tcp -m addrtype --dst-type LOCAL -m set --match-set KUBE-NODE-PORT-LOCAL-TCP dst -j MARK --set-xmark 0x80000/0x80000 | 为 ExternalTrafficPolicy 为 Local 的 Service 流量(TCP)添加特定标记 | 仅 kube-proxy 使用 ipvs 模式时存在 |
nat | OVN-PREROUTING | -p udp -m addrtype --dst-type LOCAL -m set --match-set KUBE-NODE-PORT-LOCAL-UDP dst -j MARK --set-xmark 0x80000/0x80000 | 为 ExternalTrafficPolicy 为 Local 的 Service 流量(UDP)添加特定标记 | 同上 |
nat | OVN-POSTROUTING | -m mark --mark 0x4000/0x4000 -j MASQUERADE | 为特定标记的流量执行 SNAT | -- |
nat | OVN-POSTROUTING | -m set --match-set ovn40subnets src -m set --match-set ovn40subnets dst -j MASQUERADE | 为通过节点的 Pod 之间的 Service 流量执行 SNAT | -- |
nat | OVN-POSTROUTING | -m mark --mark 0x80000/0x80000 -m set --match-set ovn40subnets-distributed-gw dst -j RETURN | 对于 ExternalTrafficPolicy 为 Local 的 Service 流量,若 Endpoint 使用分布式网关,无需执行 SNAT | -- |
nat | OVN-POSTROUTING | -m mark --mark 0x80000/0x80000 -j MASQUERADE | 对于 ExternalTrafficPolicy 为 Local 的 Service 流量,若 Endpoint 使用集中式网关,执行 SNAT | -- |
nat | OVN-POSTROUTING | -p tcp -m tcp --tcp-flags SYN NONE -m conntrack --ctstate NEW -j RETURN | Pod IP 对外暴露时,不执行 SNAT | -- |
nat | OVN-POSTROUTING | -s 10.16.0.0/16 -m set ! --match-set ovn40subnets dst -j SNAT --to-source 192.168.0.101 | Pod 访问集群外网络时,若子网开启 NatOutgoing 且使用指定 IP 的集中式网关,执行 SNAT | 10.16.0.0/16 为子网网段,192.168.0.101 为指定的网关节点 IP |
nat | OVN-POSTROUTING | -m set --match-set ovn40subnets-nat src -m set ! --match-set ovn40subnets dst -j MASQUERADE | Pod 访问集群外网络时,若子网开启 NatOutgoing,执行 SNAT | -- |
最后更新: 2023年5月8日
创建日期: 2022年9月6日
创建日期: 2022年9月6日