ip-masq-agent


weight: 87 title: IP伪装代理 date: “2022-05-21T00:00:00+08:00” type: book

本文将讲述如何配置和启用ip-masq-agent

创建ip-masq-agent

要创建ip-masq-agent,运行下面的kubectl命令:

kubectl create -f https://raw.githubusercontent.com/kubernetes-incubator/ip-masq-agent/master/ip-masq-agent.yaml

关于ip-masq-agent的更多信息请参考 该文档

在大多数情况下,默认的一套规则应该是足够的;但是,如果内置的规则不适用于您的集群,您可以创建并应用ConfigMap来自定义受影响的IP范围。例如,为了仅允许ip-masq-agent考虑10.0.0.0/8,您可以在名为 “config” 的文件中创建以下ConfigMap

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

注意:重要的是,该文件被命名为config,因为默认情况下,该文件将被用作ip-masq-agent查找的关键字。

运行下列命令将ConfigMap添加到您的集群中:

kubectl create configmap ip-masq-agent --from-file=config --namespace=kube-system

这将会更新/etc/config/ip-masq-agent文件,并每隔resyscInterval时间段检查一遍该文件,将配置应用到集群的节点中。

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

IP伪装代理用户指南

ip-masq-agent用户配置iptables规则将PodIP地址隐藏在集群node节点的IP地址后面。这通常在将流量发送到集群的pod CIDR 范围之外的目的地时执行。

关键术语

  • NAT(网络地址转换)

    是一种通过修改IP头中的源和/或目标地址信息来将一个IP地址重映射到另一个IP地址的方法。通常由执行IP路由的设备完成。

  • Masquerading(伪装)

    NAT的一种形式,通常用于执行多个地址转换,其中多个源IP地址被掩盖在单个地址之后,通常是由某设备进行IP路由。在kubernetes中,这是NodeIP地址。

  • CIDR(无类域内路由选择)

    基于可变长度子网掩码,允许指定任意长度的前缀。CIDR引入了一种新的IP地址表示方法,现在通常被称为CIDR表示法,将地址或路由前缀的比特位数作为后缀,例如192.168.2.0/24

  • 本地链路

    本地链路地址是仅能在主机连接的网段或广播域内进行有效通信的网络地址。IPv4的链路本地地址在CIDR表示法定义的地址块是169.254.0.0/16

Ip-masq-agent在将流量发送到集群node节点的IPCluster IP范围之外的目的地时,会配置iptables规则来处理伪装的node/pod IP地址。这基本上将podIP地址隐藏在了集群node节点的IP地址后面。在某些环境中,到 “外部” 地址的流量必须来自已知的机器地址。例如,在Google Cloud中,到互联网的任何流量必须来自虚拟机的IP。当使用容器时,如在GKE中,Pod IP将被拒绝作为出口。为了避免这种情况,我们必须将Pod IP隐藏在VM自己的IP地址之后——通常被称为 “伪装”。默认情况下,配置代理将指定的三个专用IP范围视为非伪装 CIDR。范围包括10.0.0.0/8172.16.0.0/12192.168.0.0/16。默认情况下,代理还将本地链路(169.254.0.0/16)视为非伪装CIDR。代理配置为每隔60秒从/etc/config/ip-masq-agent位置重新加载其配置,这也是可配置的。

IP伪装代理示意图
IP伪装代理示意图

代理的配置文件必须使用yamljson语法,并且包含以下三个可选的key

  • nonMasqueradeCIDRs:使用 CIDR 表示法指定的非伪装范围的字符串列表。
  • masqLinkLocal:一个布尔值(true/false,表示是否将流量伪装成本地链路前缀169.254.0.0/16。默认为false
  • resyncInterval:代理尝试从磁盘重新加载配置的时间间隔。例如 ’30s’ 其中 ‘s’ 是秒’ms’ 是毫秒等…

10.0.0.0/8172.16.0.0/12192.168.0.0/16范围的流量将不会被伪装。任何其他流量(假定是互联网)将被伪装。这里有个例子,来自pod的本地目的地址可以是其节点的IP地址、其他节点的地址或Cluster IP范围中的一个IP地址。其他任何流量都将默认伪装。以下条目显示ip-masq-agent应用的默认规则集:

iptables -t nat -L IP-MASQ-AGENT
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/GKE中将启动kubernetes 1.7.0版本,ip-masq-agent已经在集群中运行。如果您在其他环境中运行kubernetes,那么您可以将ip-masq-agentDaemonSet 的方式在集群中运行。

参考

上一页
下一页