LVS NAT模型实践

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战


LVS NAT模型概念

通过修改请求报文的目标IP地址,而后根据调度算法挑选出一台RS节点进行转发。(请求进入负载均衡器LVS时做DNAT,后端返回数据出负载均衡时做SNAT

NAT 基础图解

img

NAT 底层实现(New IP)

  • 客户端:10.0.0.1(外网)
  • DS:172.16.1.100(VIP)172.16.1.3(DIP)
  • RS:172.16.1.7172.16.1.8Gateway:172.16.1.3

image-20211125095932088

NAT 访问原理

  1. 当用户请求到达DS,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP目标IP为VIP
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;
  3. IPVS比对数据包请求的服务是否为集群服务,若是,通过调度算法挑选一台后端RS服务器,并修改数据包的目标IPRS的IP,然后将数据包发至POSTROUTING链。此时报文的源IP为CIP目标IP为RIP
  4. POSTROUTING链通过选路,将数据包通过DSDIP发送给RS
  5. RS发现目标为自己的IP,则交给应用程序处理,然后构建响应报文发回给DS。此时报文的源IP为RIP目标IP为CIP
  6. DS在响应客户端前,会将源IP地址修改为VIP地址,然后响应给客户端。此时报文的源IP为VIP目标IP为CIP

NAT 特性

  • RS必须使用私有地址,并需要将网关指向DS
  • RIPDIP必须为同一网段内;
  • NAT模型支持端口映射;
  • RS可以使用任意操作系统。例如Linux、Windows等;
  • 请求和响应报文都要经过DS,高负载场景中,DS易称为瓶颈;

LVS NAT模型实战

NAT 架构规划

image-20211125100132239

NAT Route配置

  1. Linux服务器配置为路由器,先配置其IP地址;

    • eth0配置信息如下
    [root@route ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.200
    PREFIX=24
    GATEWAY=10.0.0.2		# 指向能出公网的IP
    DNS1=223.5.5.5
    复制代码
    • eth1配置信息如下
    [root@route ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth1
    DEVICE=eth1
    ONBOOT=yes
    IPADDR=172.16.1.200
    PREFIX=24
    复制代码
  2. Route节点启用FORWARD转发功能,实现路由功能;

    [root@route ~]# echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
    [root@route ~]# sysctl -p
    复制代码

NAT RS配置

  1. 配置RS节点eth1网卡为LAN模式,然后将网关统一指向DS服务器;(所有RS节点都需要操作)

    [root@rs01 ~]# ifdown eth0		# 关闭eth0网关,真实生产环境也仅有一块网卡
    [root@rs01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth1
    DEVICE=eth1
    ONBOOT=yes
    IPADDR=172.16.1.7			# 不同的 RS 节点地址不一样
    GATEWAY=172.16.1.3			# 所有的 RS 节点网关都指向 DS 节点的 DIP
    PREFIX=24
    DNS=223.5.5.5
    复制代码
  2. 重启eth1网卡,使其生效;

    [root@rs01 ~]# ifdown eth1 8& ifup eth1
    复制代码
  3. 检查RS节点路由信息;

    [root@rs01 ~]# route -n
    Destination		Gateway		Genmask			Flags	Metric	Ref	Use	Iface
    0.0.0.0			172.16.1.3	0.0.0.0			UG		100		0	0	eth1
    172.16.1.0		0.0.0.0		255.255.255.0	U		100		0	0	eth1
    复制代码
  4. 配置后端所有RSweb服务,注意RS1RS2页面不一样,方便验证效果;

    • rs1节点配置
    [root@rs01 ~]# yum install nginx -y
    [root@rs01 ~]# cat /etc/nginx/conf.d/lvs.birenchong.cn.conf
    server {
        listen 80;
        server_name lvs.birenchong.cn;
        root /opt;
        	
        location / {
        	index index.html;
        }
    }
    [root@rs01 ~]# echo "Web Page RS-Node1" > /opt/index.html
    [root@rs01 ~]# systemctl start nginx
    
    # 本机测试访问
    [root@rs01 ~]# curl -HHost:lvs.birenchong.cn http://172.16.1.7
    Web Page RS-Node1
    复制代码
    • rs2节点配置
    [root@rs02 ~]# yum install nginx -y
    [root@rs02 ~]# cat /etc/nginx/conf.d/lvs.birenchong.cn.conf
    server {
        listen 80;
        server_name lvs.birenchong.cn;
        root /opt;
        
        location / {
        	index index.html;
        }
    }
    [root@rs02 ~]# echo "Web Page RS-Node2" /opt/index.html
    [root@rs02 ~]# systemctl start nginx
    
    # 本机测试访问
    [root@rs02 ~]# curl -HHost:lvs.birenchong.cn http://172.16.1.8
    Web Page RS-Node2
    复制代码

NAT DS配置

  1. 编辑网卡配置,将DS节点的eth1网关指向路由节点;

    [root@lb01 ~]# ifdown eth0
    [root@lb01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth1
    DEVICE=eth1
    ONBOOT=yes
    IPADDR=172.16.1.3
    PREFIX=24
    GATEWAY=172.16.1.200
    DNS1=223.5.5.5
    复制代码
  2. 新增VIP地址的网卡配置,将VIP绑定到eth1:1网卡上;

    [root@lb01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1:1
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth1:1
    DEVICE=eth1:1
    ONBOOT=yes
    IPADDR=172.16.1.100
    PREFIX=24
    复制代码
  3. 重启DS节点eth1、eth1:1的网卡;

    [root@lb01 ~]# ifdown eth1 && ifup eth1
    [root@lb01 ~]# ifdown eth1:1 && ifup eth1:1
    复制代码
  4. 开启DS节点的内核转发功能,不然RS节点发送的数据包会被丢弃;

    [root@lb01 ~]# echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
    [root@lb01 ~]# sysctl -p
    复制代码
  5. DS节点负载均衡配置;

    # 定义LVS集群
    [root@lb01 ~]# ipvsadm -A -t 172.16.1.100:80 -s rr
    
    # 添加RS1、RS2集群节点
    [root@lb01 ~]# ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.7:80 -m
    [root@lb01 ~]# ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.8:80 -m
    
    # 查看集群状态信息
    [root@lb01 ~]# ipvsadm -L -n
    IP	virtual	server	version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    	-> RemoteAddress:Port	Forward weight ActiveConn	InActConn
    TCP	172.16.1.100:80 rr
    	-> 172.16.1.7:80			Masq	1		0			0
    	-> 172.16.1.8:80			Masq	1		0			0
    复制代码

NAT Client测试

  1. 配置Client节点eth0网络;

    [root@client ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.100
    PREFIX=24
    GATEWAY=10.0.0.200			# 真实场景不可能将客户端网关指向企业的路由器上
    复制代码
  2. 重启Client节点网络;

    [root@client ~]# systemctl restart network
    复制代码
  3. 使用Client测试访问效果;

    [root@client ~]# curl -HHost:lvs.birenchong.cn http://172.16.1.100
    Web Page RS-Node1
    [root@client ~]# curl -HHost:lvs.birenchong.cn http://172.16.1.100
    Web Page RS-Node2
    复制代码
  4. 模拟真实场景,首先删除Client节点指向Route网关信息,然后配置Route打开IP映射DNAT、以及SNAT(共享上网功能)

    • 删除Client节点的网关配置
    [root@client ~]# sed -i '/GATEWAY/d' /etc/sysconfig/network-scripts/ifcfg-eth0
    [root@client ~]# systemctl restart network
    复制代码
    • 配置Route路由节点的DNAT以及SNAT
    # DNAT(地址映射,企业环境使用)
    [root@route ~]# iptables -t nat -A PREROUTING -d 10.0.0.200 -j DNAT --to 172.16.1.100
    
    # SNAT(让内部主机通过路由可以上网)
    [root@route ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to 10.0.0.200
    复制代码
  5. 最后用Client再次测试;

    # 真实情况下,客户端节点也是无法连接企业内部网络
    [root@client ~]# curl -HHost:lvs.birenchong.cn http://172.16.1.100
    curl:(7) Failed to connect to 172.16.1.100:网络不可达
    
    # 需要通过访问路由的公网IP
    [root@client ~]# curl -HHost:lvs.birenchong.cn http://10.0.0.200
    Web Page RS-Node2
    [root@client ~]# curl -HHost:lvs.birenchong.cn http://10.0.0.200
    Web Page RS-Node1
    复制代码

Guess you like

Origin juejin.im/post/7034684533333196807
LVS
LVS
lvs
LVS
LVS