1.DNAT是destination network address translation的缩写,即目标网络地址转换.
典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站, 当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip, 然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换。
2.SNAT是source network address translation的缩写,即源地址目标转换。 比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候, 路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候, 他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了,所以叫做SNAT,基于源地址的地址转换。
3.MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。 MASQUERADE 的作用和 SNAT 一样,区别是它不需要指定 –to-source。MASQUERADE 专门用于动态获取IP地址的连接,比如,拨号上网、DHCP连接等。 MASQUERADE(伪装)会自动获取网卡上的 IP 地址,而不用像 SNAT 那样需要使用 –to-source 指定,当 IP 发生变化时不需要手动改动。当网卡 down 掉时,MASQUERADE 不会保留任何相关的 conntrack 记录,如果我们使用 SNAT target,conntrack 记录是被保留下来的,直到被超时 GC,这会占用很多连接跟踪的内存。 注意,MASQUERADE 和 SNAT一样,只能用于 nat 表的 POSTROUTING链。
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
IPVS 模式详解
ipvs 模式中参与数据转发的内核工具包括: ipvs:将数据包 DNAT iptables:将数据包 DROP、masquared(ipvs 模式中,iptables 规则数量是恒定的) ipset:iptables 的辅助工具
k8s ipvs
iptables 做SNAT masquared IPVS 做DNAT
MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat。
iptables的四表五链: 四表:Filter表、Nat表、Managle表、row表
五链:
INPUT链 :处理输入数据包 OUTPUT链 :处理输出数据包 FORWARD链 :处理转发数据包 PREROUTING链 :用于目标地址转换(DNAT) POSTOUTING链 :用于源地址转换(SNAT)
kube-proxy 目前仅支持 TCP 和 UDP,不支持 HTTP 路由,并且也没有健康检查机制。这些可以通过自定义 Ingress Controller 的方法来解决。
iptables 模式
kube-proxy 不足
IPVS 模式也会使用 iptables 来执行 SNAT 和 IP 伪装(MASQUERADE),并使用 ipset 来简化 iptables 规则的管理:
ipset 名 | 成员 | 用途 |
---|---|---|
KUBE-CLUSTER-IP | All service IP + port | Mark-Masq for cases that masquerade-all=true or clusterCIDR specified |
KUBE-LOOP-BACK | All service IP + port + IP | masquerade for solving hairpin purpose |
KUBE-EXTERNAL-IP | service external IP + port | masquerade for packages to external IPs |
KUBE-LOAD-BALANCER | load balancer ingress IP + port | masquerade for packages to load balancer type service |
KUBE-LOAD-BALANCER-LOCAL | LB ingress IP + port with externalTrafficPolicy=local |
accept packages to load balancer with externalTrafficPolicy=local |
KUBE-LOAD-BALANCER-FW | load balancer ingress IP + port with loadBalancerSourceRanges |
package filter for load balancer with loadBalancerSourceRanges specified |
KUBE-LOAD-BALANCER-SOURCE-CIDR | load balancer ingress IP + port + source CIDR | package filter for load balancer with loadBalancerSourceRanges specified |
KUBE-NODE-PORT-TCP | nodeport type service TCP port | masquerade for packets to nodePort(TCP) |
KUBE-NODE-PORT-LOCAL-TCP | nodeport type service TCP port with externalTrafficPolicy=local |
accept packages to nodeport service with externalTrafficPolicy=local |
KUBE-NODE-PORT-UDP | nodeport type service UDP port | masquerade for packets to nodePort(UDP) |
KUBE-NODE-PORT-LOCAL-UDP | nodeport type service UDP port withexternalTrafficPolicy=local |
accept packages to nodeport service withexternalTrafficPolicy=local |
二、IPVS介绍
在简单了解了IPVS是什么,从哪里来之后,就可以开始对IPVS进入更深入的学习了。首先,我们从IPVS工作原理开始讲起。
2.1 IPVS与Netfilter
IPVS现在已经成为内核的一部分,内置在了Netfilter框架中。等等!Netfilter不是在之前介绍iptables的时候就介绍过吗?没错,这里的Netfilter框架和iptables使用的Netfilter框架就是一样的。
之前的文章里面我们介绍过,Netfilter为包过滤提供了5个Hook点。而IPVS起作用的方式,也就是将其相关处理函数挂载到Netfilter框架提供的LOCAL_IN、FORWARD和LOCAL_OUT这三个Hook上。可以用下面的图表示引入ipvs后的包过滤流程: