跳转至

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 --

微信群 Slack Twitter Support


最后更新: 2023年5月8日
创建日期: 2022年9月6日

评论

回到页面顶部