四层负载均衡LVS NAT

LVS NAT模式是作用于四层的负载均衡,客户端将请求发给VIP,由LVS将数据包目的IP修改为RSIP,将请求转发给RS,RS处理请求后将数据包返回给LVS,由LVS转发给客户端。与DR模式相比,数据包返回要经过LVS,所以会造成性能瓶颈。

0x00 原理

原理图:

  1. 客户端通过VIP访问到负载均衡器。
  2. 负载均衡将客户端请求的数据包报文的目的地址修改为后端服务器的RIP,数据被转发给RS。
  3. RS收到数据包后源地址为RIP,目的地址为CIP,由于LVS和RS必须在一个VLAN,且LVS作为RS的SNAT网关,所以RS返回的数据包都会经过LVS转发给客户端。

0x01 部署步骤

环境

  • 4台服务器(Ubuntu 22.04.3)
  • 1台作为LoadBlancer
  • 3台作为后端的业务服务器(Worker1-3)
    • LVS : 192.168.50.126(DIP),192.168.122.67(SNAT网关), 192.168.50.201(VIP)
    • Worker1: 192.168.122.119(SNAT)
    • Worker2: 192.168.122.47(SNAT)
    • Worker3: 192.168.122.48(NAT)
    • Client: 192.168.50.128

步骤

  1. 创建一个与现有(192.168.50.0)网段不同的网段的局域网,需要给LVS和RS添加新的网卡,并将这些网卡加入新建的局域网。
  2. 在RS执行以下操作:
1
2
3
4
5
# 删除RS原本的默认网关路由
sudo ip route del default
# 添加新的路由将LVS的同网段IP作为网关,以便流量经过LVS
sudo ip route add default via 192.168.122.67

3) 在LVS执行以下操作:

1
2
3
4
5
6
7
8
9
10
# 在LVS添加IPVS规则
sudo ipvsadm -A -t 192.168.50.201:80 -s rr
# 添加后端服务器
sudo ipvsadm -a -t 192.168.50.201:80 -r 192.168.122.119:80 -m
sudo ipvsadm -a -t 192.168.50.201:80 -r 192.168.122.47:80 -m
sudo ipvsadm -a -t 192.168.50.201:80 -r 192.168.122.48:80 -m
# 开启IP转发
sudo echo "1" > /proc/sys/net/ipv4/ip_forward
# 修改LVS iptables 对192.168.122.0/24的流量源地址改为出口网卡的IP,让返回的流量可以通过LVS返回给客户端。
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o enp1s0 -j MASQUERADE

0x02 测试

  1. 在客户端多次执行curl http://192.168.50.201 ,使用轮询算法依次访问后端服务器
1
2
3
4
5
6
root@k8s:~$ curl http://192.168.50.201/
Worker1
root@k8s:~$ curl http://192.168.50.201/
Worker2
root@k8s:~$ curl http://192.168.50.201/
Worker3
  1. 分别在LVS和后端服务器上抓包查看源目的地址变化。
    LVS抓包:

LVS抓包

可以看到在LVS接收到客户端请求后,源地址是CIP 目的地址是VIP,返回数据包时源地址是VIP,目的地址是CIP。
后端服务器抓包:

后端服务器抓包

可以看到在后端服务器接收到LVS转发的请求,源地址依然是CIP,目的地址是RIP,返回数据包时源地址是RIP,目的地址是CIP。但是此时数据包不是直接返回给客户端的,而是经过LVS转发。

0x03 思考

  • 为什么后端服务器返回数据包时目的地址为CIP,还需要LVS转发给客户端

    • 后端服务器如果不经过LVS返回给客户端会造成多路径路有冲突,最开始是按照练习LVS DR模式的网络拓步搭建(客户端LVS和RS在同一个网段),造成路径不对成,无法三次握手。

0x04 注意

  • 客户端如果是Windows系统 curl测试时,测试一次需要关闭PowerShell,再打开再测试,在同一个Terminal快速反复curl VIP,短时间第一次建立的连接不会关闭,会被复用,所以会一直请求一个RS。
  • 客户端不要和SNAT在同一网段会造成路由冲突。
作者

HXD

发布于

2024-01-20

更新于

2024-11-22

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.