LVS 负载均衡器理论基础及抓包分析 (2)

数据包到达INPUT链后,IPVS 会比对数据包请求的服务是否为集群服务,若是,修改数据包的目标 IP 地址为后端服务器 IP(这里需要根据各种算法计算,哪台 RS 更合适),再将数据包发至 POSTROUTING 链,此时报文的源 IP 为 CIP,目标 IP 为 RIP;

POSTROUTING 链的作用就是选路,根据 INPUT 链中目标 IP,将数据包发送给 RS;

RS 发现数据包中的目标 IP 是自己的 IP,此时它会开始构建响应报文发并回给 DS, 此时报文的源IP为RIP,目标IP为 CIP;

DS 收到 RS 响应后,但在响应客户端,会将源 IP 地址修改为自己的 VIP 地址,然后发送给客户端,此时报文的源 IP 为 VIP,目标 IP 为 CIP;

NAT 实验

在这里插入图片描述


NAT 模式时,LB 节点IP与RS节点IP可以不在同一个网络内,现为了模拟我们在 LB 节点添加一虚拟IP 如下,并测试连通性。

[root@master02 ~]# ip addr add 100.222.111.1/24 dev ens32 [root@master02 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:50:56:8e:53:c1 brd ff:ff:ff:ff:ff:ff inet 1.65.15.141/24 brd 1.65.15.255 scope global ens32 valid_lft forever preferred_lft forever inet 100.222.111.1/24 scope global ens32 valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:46:24:ae:8c brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever [root@master02 ~]# ping -c 1 100.222.111.1 PING 100.222.111.1 (100.222.111.1) 56(84) bytes of data. 64 bytes from 100.222.111.1: icmp_seq=1 ttl=64 time=0.033 ms --- 100.222.111.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.033/0.033/0.033/0.000 ms [root@master02 ~]#

创建负载均衡service

[root@master02 ~]# ipvsadm -A -t 100.222.111.1:8000 -s rr [root@master02 ~]#

添加 RS 到指定的负载均衡器下

[root@master02 ~]# ipvsadm -a -t 100.222.111.1:8000 -r 1.65.15.143:80 -m [root@master02 ~]# ipvsadm -a -t 100.222.111.1:8000 -r 1.65.15.144:80 -m [root@master02 ~]#

在client上面访问VIP

[root@master01 ~]# ping -c 1 100.222.111.1 PING 100.222.111.1 (100.222.111.1) 56(84) bytes of data. --- 100.222.111.1 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms [root@master01 ~]#

我们发现并不通,由于这个VIP是虚拟的,需要添加路由,添加静态路由如下。

[root@master01 ~]# ip route add 100.222.111.1 via 1.65.15.141 dev ens32 [root@master01 ~]#

继续测试连通性

[root@master01 ~]# ping -c 1 100.222.111.1 PING 100.222.111.1 (100.222.111.1) 56(84) bytes of data. 64 bytes from 100.222.111.1: icmp_seq=1 ttl=64 time=0.088 ms --- 100.222.111.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.088/0.088/0.088/0.000 ms [root@master01 ~]#

发现可以ping通了,我们接下来验证service

[root@master01 ~]# curl -m 15 --retry 1 -sSL 100.222.111.1:8000 curl: (28) Connection timed out after 15001 milliseconds [root@master01 ~]#

LB抓包

在这里插入图片描述


RS 抓包如下

在这里插入图片描述


数据包的源IP为CIP,目标IP为RIP,LB节点 IPVS 只做了 DNAT,只是把目标IP改成RS IP了,而没有修改源IP。此时虽然RS和CIP(client)在同一个子网,链路连通性没有问题,但是由于 CIP 节点发出去的包的目标IP和收到的包源IP不一致,因此会被直接丢弃,所以需要在iptables 上做地址伪装。

[root@master02 ~]# iptables -t nat -A POSTROUTING -m ipvs --vaddr 100.222.111.1 --vport 8000 -j MASQUERADE [root@master02 ~]# iptables -t mangle -A POSTROUTING -m ipvs --vaddr 100.222.111.1 --vport 8000 -j LOG --log-prefix '[k8svip ipvs]' [root@master02 ~]#

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyysxd.html