IP 伪装代理用户指南
此页面介绍如何配置和启用 ip-masq-agent。
开始之前
您需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场
要检查版本,请输入 kubectl version。
IP 伪装代理用户指南
ip-masq-agent 配置 iptables 规则,以隐藏 Pod 的 IP 地址在集群节点的 IP 地址后面。当向集群 Pod CIDR 范围之外的目标发送流量时,通常会这样做。
关键术语
- NAT(网络地址转换):是一种通过修改 IP 报头中的源和/或目标地址信息来重新映射一个 IP 地址到另一个地址的方法。通常由执行 IP 路由的设备执行。
- 伪装 (Masquerading):一种 NAT 的形式,通常用于执行多对一地址转换,其中多个源 IP 地址被隐藏在一个地址后面,通常是执行 IP 路由的设备。在 Kubernetes 中,这是节点的 IP 地址。
- CIDR(无类别域间路由):基于变长子网掩码,允许指定任意长度的前缀。CIDR 引入了一种新的 IP 地址表示方法,现在通常称为 CIDR 表示法,其中地址或路由前缀用后缀编写,指示前缀的位数,例如 192.168.2.0/24。
- 链路本地 (Link Local):链路本地地址是一种仅对网络段或主机连接的广播域内的通信有效的网络地址。IPv4 的链路本地地址在 CIDR 表示法中定义在地址块 169.254.0.0/16 中。
ip-masq-agent 配置 iptables 规则,以处理将节点/Pod IP 地址伪装成发送到集群节点 IP 和集群 IP 范围之外的目标时的流量。这本质上隐藏了 Pod IP 地址在集群节点的 IP 地址后面。在某些环境中,对“外部”地址的流量必须来自已知的机器地址。例如,在 Google Cloud 中,任何发送到互联网的流量都必须来自 VM 的 IP。当使用容器时,如在 Google Kubernetes Engine 中,Pod IP 将被拒绝用于出口。为了避免这种情况,我们必须将 Pod IP 隐藏在 VM 自己的 IP 地址后面 - 通常称为“伪装”。默认情况下,代理程序配置为将 RFC 1918 指定的三个私有 IP 范围视为非伪装 CIDR。这些范围是 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。默认情况下,代理程序还将链路本地 (169.254.0.0/16) 视为非伪装 CIDR。代理程序配置为每 60 秒从位置 /etc/config/ip-masq-agent 重新加载其配置,这也可以配置。

代理程序配置文件必须以 YAML 或 JSON 语法编写,并且可以包含三个可选键
nonMasqueradeCIDRs:一个字符串列表,采用 CIDR 表示法,指定非伪装范围。masqLinkLocal:一个布尔值 (true/false),指示是否伪装到链路本地前缀169.254.0.0/16的流量。默认值为 False。resyncInterval:代理程序尝试从磁盘重新加载配置的时间间隔。例如:'30s',其中 's' 表示秒,'ms' 表示毫秒。
对 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 范围的流量将不会被伪装。任何其他流量(假定为互联网)将被伪装。来自 Pod 的本地目标示例可以是其节点的 IP 地址,以及另一个节点的地址或集群 IP 范围中的一个 IP 地址。任何其他流量默认情况下都将被伪装。以下条目显示了 ip-masq-agent 应用的默认规则集
iptables -t nat -L IP-MASQ-AGENT
target prot opt source destination
RETURN all -- anywhere 169.254.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 10.0.0.0/8 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 172.16.0.0/12 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 192.168.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL
默认情况下,在 GCE/Google Kubernetes Engine 中,如果启用了网络策略或您正在使用不在 10.0.0.0/8 范围内的集群 CIDR,则 ip-masq-agent 将在您的集群中运行。如果您在另一个环境中运行,可以将 ip-masq-agent DaemonSet 添加到您的集群。
创建 ip-masq-agent
要创建 ip-masq-agent,请运行以下 kubectl 命令
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/ip-masq-agent/master/ip-masq-agent.yaml
您还必须将适当的节点标签应用于集群中您希望代理程序运行的任何节点。
kubectl label nodes my-node node.kubernetes.io/masq-agent-ds-ready=true
有关更多信息,请参阅 ip-masq-agent 文档 此处。
在大多数情况下,默认规则集应该足够;但是,如果这不适用于您的集群,您可以创建并应用 ConfigMap 来自定义受 ip-masq-agent 影响的 IP 范围。例如,要仅允许 10.0.0.0/8 被 ip-masq-agent 视为有效范围,您可以创建一个名为“config”的以下 ConfigMap。
说明
重要的是,该文件名为 config,因为默认情况下,这将用作 ip-masq-agent 查找的键
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
运行以下命令将 configmap 添加到您的集群
kubectl create configmap ip-masq-agent --from-file=config --namespace=kube-system
这将更新位于 /etc/config/ip-masq-agent 的文件,该文件会定期检查,每 resyncInterval 秒应用一次到集群节点。在重新同步间隔到期后,您应该看到 iptables 规则反映您的更改
iptables -t nat -L IP-MASQ-AGENT
Chain IP-MASQ-AGENT (1 references)
target prot opt source destination
RETURN all -- anywhere 169.254.0.0/16 /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN all -- anywhere 10.0.0.0/8 /* ip-masq-agent: cluster-local
MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL
默认情况下,ip-masq agent 也处理链路本地范围 (169.254.0.0/16),它会设置适当的 iptables 规则。要让 ip-masq-agent 忽略链路本地,您可以将 masqLinkLocal 设置为 true 在 ConfigMap 中。
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true