IP 伪装代理用户指南
本页面介绍如何配置和启用 ip-masq-agent
。
准备工作
你需要一个 Kubernetes 集群,并且 kubectl 命令行工具被配置为与你的集群通信。建议在本教程中使用至少有两个不作为控制平面主机的节点组成的集群。如果你还没有集群,可以通过 minikube 创建一个,或者你可以使用这些 Kubernetes 游乐场之一
要检查版本,输入 kubectl version
。
IP 伪装代理用户指南
ip-masq-agent
配置 iptables 规则,将 Pod 的 IP 地址隐藏在集群节点的 IP 地址后面。这通常在向集群 Pod CIDR 范围之外的目标发送流量时进行。
关键术语
- NAT(网络地址转换):是一种通过修改 IP 头部中的源地址和/或目标地址信息来将一个 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 规则,以处理将流量发送到集群节点 IP 和集群 IP 范围之外的目标时,对节点/Pod IP 地址进行伪装。这实质上将 Pod IP 地址隐藏在集群节点的 IP 地址后面。在某些环境中,发往“外部”地址的流量必须来自已知的机器地址。例如,在 Google Cloud 中,任何发往互联网的流量必须来自 VM 的 IP。当使用容器时,如在 Google Kubernetes Engine 中,Pod IP 将因出口而被拒绝。为避免这种情况,我们必须将 Pod IP 隐藏在 VM 自己的 IP 地址后面——这通常称为“伪装(masquerade)”。默认情况下,该代理被配置为将 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 中,如果启用了网络策略或使用的集群 CIDR 不在 10.0.0.0/8 范围内,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 范围。例如,要让 ip-masq-agent 只考虑 10.0.0.0/8 范围,你可以创建一个名为 "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
默认情况下,本地链路范围 (169.254.0.0/16) 也由 ip-masq 代理处理,该代理会设置相应的 iptables 规则。要让 ip-masq-agent 忽略本地链路,可以在 ConfigMap 中将 masqLinkLocal
设置为 true。
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true