千家信息网

LVS负载均衡之NAT模式原理及配置详细流程

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,一、前言​ 上篇文章讲述了LVS负载均衡相关理论知识,今天主要来详细地来对LVS工作模式之一的NAT模式进行实验配置。二、NAT模式理论回顾与简述详细原理可以参考:https://blog.51cto
千家信息网最后更新 2025年02月01日LVS负载均衡之NAT模式原理及配置详细流程

一、前言

​ 上篇文章讲述了LVS负载均衡相关理论知识,今天主要来详细地来对LVS工作模式之一的NAT模式进行实验配置。

二、NAT模式理论回顾与简述

详细原理可以参考:https://blog.51cto.com/14557673/2467243
​ 首先我们要明确的是NAT模式的最大特点是什么?

​ 可以这样概述:LVS负载均衡之NAT模式(NAT充当网关)是一种基于网络地址转换技术,通过负载均衡器实现高并发的数据请求和使用调度算法实现优化服务响应的进出口相同的架构,具备高可用高安全性能。

​ 而其最大劣势在于数据的出入口都是在负载均衡器(NAT服务器上),这样所造成的的后果就是无法支持高并发的数据请求(巨量),并且数据的响应回传过程加剧了这一弊病。所以才有了后续的改进。

三、实例环境

​ 首先我们需要四台服务器:一台负载均衡调度器、两台web(这里使用两个Apache)服务器、一台存储服务器(NFS方式)。使用一台Windows作为外网客户主机进行模拟。

​ 架构如下:4台Centos7和一台win10构成

​ 网段ip地址分配如下表所示:

设备ip地址
win10客户机10.0.0.10/24
负载调度器外网卡:10.0.0.1/24 内网卡:192.168.10.1/24
HTTP服务器1192.168.10.10/24
HTTP服务器2192.168.10.20/24
NFS存储服务器192.168.10.100/24

​ 那么我们从外网的一台客户机进行网站访问,实际上访问的是负载均衡器的外网卡地址,而对于服务器端客户机是一无所知的。那么我们需要进行内网与外网的互通,那么就可以使用NAT方式实现互通。从而将服务请求发送给真实服务器,获取所需资源后再返回给负载均衡器进行NAT网络地址转换后将资源返回给客户机。在生产环境中一般后台的存储服务器都是有多个备份的,并且资源都是一致的,不过我们为了验证调度算法轮循访问的机制,我们就需要在两个网站写入不同的的内容加以区分验证该调度算法。

​ 下面请看具体的配置:

四、部署步骤和详解

​ 根据上面的架构图和地址分配我们完成这个实验需要进行如下的步骤配置。

4.1NFS存储服务器配置

​ 1.查看相关软件包nfs服务

[root@nfs ~]# rpm -q nfs-utils nfs-utils-1.3.0-0.48.el7.x86_64[root@nfs ~]# rpm -q rpcbind rpcbind-0.2.0-42.el7.x86_64[root@nfs ~]# mkdir /opt/ll /opt/cc #创建站点文件存储目录

​ 2.挂载两块新的磁盘并且进行设置

sdb磁盘配置:

[root@nfs ~]# fdisk /dev/sdb欢迎使用 fdisk (util-linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。Device does not contain a recognized partition table使用磁盘标识符 0x400f42da 创建新的 DOS 磁盘标签。命令(输入 m 获取帮助):nPartition type:   p   primary (0 primary, 0 extended, 4 free)   e   extendedSelect (default p): Using default response p分区号 (1-4,默认 1):起始 扇区 (2048-41943039,默认为 2048):将使用默认值 2048Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):将使用默认值 41943039分区 1 已设置为 Linux 类型,大小设为 20 GiB命令(输入 m 获取帮助):wThe partition table has been altered!Calling ioctl() to re-read partition table.正在同步磁盘。[root@nfs ~]# mkfs.xfs /dev/sdb1meta-data=/dev/sdb1              isize=512    agcount=4, agsize=1310656 blks         =                       sectsz=512   attr=2, projid32bit=1         =                       crc=1        finobt=0, sparse=0data     =                       bsize=4096   blocks=5242624, imaxpct=25         =                       sunit=0      swidth=0 blksnaming   =version 2              bsize=4096   ascii-ci=0 ftype=1log      =internal log           bsize=4096   blocks=2560, version=2         =                       sectsz=512   sunit=0 blks, lazy-count=1realtime =none                   extsz=4096   blocks=0, rtextents=0

sdc磁盘配置:

[root@nfs ~]# fdisk /dev/sdc欢迎使用 fdisk (util-linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。使用写入命令前请三思。Device does not contain a recognized partition table使用磁盘标识符 0x1ef07039 创建新的 DOS 磁盘标签。命令(输入 m 获取帮助):nPartition type:   p   primary (0 primary, 0 extended, 4 free)   e   extendedSelect (default p): Using default response p分区号 (1-4,默认 1):起始 扇区 (2048-41943039,默认为 2048):将使用默认值 2048Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):将使用默认值 41943039分区 1 已设置为 Linux 类型,大小设为 20 GiB命令(输入 m 获取帮助):wThe partition table has been altered!Calling ioctl() to re-read partition table.正在同步磁盘。[root@nfs ~]# mkfs.xfs /dev/sdc1meta-data=/dev/sdc1              isize=512    agcount=4, agsize=1310656 blks         =                       sectsz=512   attr=2, projid32bit=1         =                       crc=1        finobt=0, sparse=0data     =                       bsize=4096   blocks=5242624, imaxpct=25         =                       sunit=0      swidth=0 blksnaming   =version 2              bsize=4096   ascii-ci=0 ftype=1log      =internal log           bsize=4096   blocks=2560, version=2         =                       sectsz=512   sunit=0 blks, lazy-count=1realtime =none                   extsz=4096   blocks=0, rtextents=0

​ 3.对两块磁盘进行挂载设置--使用永久挂载

[root@nfs ~]# vim /etc/fstab  #在该文件最后添加挂载信息,如下所示[root@nfs ~]# tail /etc/fstab ## Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#UUID=3f9b526a-3a51-4f87-b68a-37292b4e2e59 /                       xfs     defaults        0 0UUID=33d508c7-a776-4d6a-9c9b-a51bf3855004 /boot                   xfs     defaults        0 0UUID=90be4302-e340-4fe3-9ed2-3c40e346979e /home                   xfs     defaults        0 0UUID=09112ee8-0d24-4c5e-83d2-08c1f16bc738 swap                    swap    defaults        0 0/dev/sdb1   /opt/ll     xfs defaults    0 0/dev/sdc1   /opt/cc     xfs defaults    0 0[root@nfs ~]# mount -a[root@nfs ~]# df -hT文件系统       类型      容量  已用  可用 已用% 挂载点/dev/sda2      xfs        15G  3.7G   12G   25% /devtmpfs       devtmpfs  898M     0  898M    0% /devtmpfs          tmpfs     912M     0  912M    0% /dev/shmtmpfs          tmpfs     912M  9.0M  903M    1% /runtmpfs          tmpfs     912M     0  912M    0% /sys/fs/cgroup/dev/sda5      xfs        11G   33M   11G    1% /home/dev/sda1      xfs        30G  174M   30G    1% /boottmpfs          tmpfs     183M  4.0K  183M    1% /run/user/42tmpfs          tmpfs     183M   16K  183M    1% /run/user/0/dev/sdb1      xfs        20G   33M   20G    1% /opt/ll/dev/sdc1      xfs        20G   33M   20G    1% /opt/cc#编辑/etc/exports文件[root@nfs network-scripts]# vim /etc/exports[root@nfs network-scripts]# cat /etc/exports/opt/ll     192.168.10.0/24(rw,sync,no_root_squash)/opt/cc     192.168.10.0/24(rw,sync,no_root_squash)

​ 4.关闭防火墙配置网卡为仅主机模式并且设置静态ip地址

[root@nfs ~]# systemctl stop firewalld.service [root@nfs ~]# setenforce 0[root@nfs ~]# cd /etc/sysconfig/network-scripts/[root@nfs network-scripts]# vim ifcfg-ens33[root@nfs network-scripts]# systemctl restart network[root@nfs network-scripts]# ifconfig ens33ens33: flags=4163  mtu 1500        inet 192.168.10.100  netmask 255.255.255.0  broadcast 192.168.10.255        inet6 fe80::9be8:a170:f918:1f5  prefixlen 64  scopeid 0x20        ether 00:0c:29:0b:d9:36  txqueuelen 1000  (Ethernet)        RX packets 1151  bytes 685357 (669.2 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 444  bytes 39849 (38.9 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

​ 5.启动服务

[root@nfs network-scripts]# systemctl start nfs[root@nfs network-scripts]# systemctl start rpcbind[root@nfs network-scripts]# showmount -e    #查看挂载情况信息Export list for nfs:/opt/cc 192.168.10.0/24/opt/ll 192.168.10.0/24

4.2两台web服务器配置

​ 1.在两台Centos7虚拟机上安装httpd网站服务

[root@localhost ~]# hostnamectl set-hostname web1[root@localhost ~]# su[root@web1 ~]# yum install -y httpd...//省略部分内容[root@localhost ~]# hostnamectl set-hostname web2[root@localhost ~]# su[root@web2 ~]# yum install -y httpd...//省略部分内容

​ 2.关闭两个web网站服务器防火墙

[root@web1 ~]# systemctl stop firewalld.service [root@web1 ~]# setenforce 0[root@web2 ~]# systemctl stop firewalld.service [root@web2 ~]# setenforce 0

​ 3.配置网卡

#web1配置[root@web1 ~]# cd /etc/sysconfig/network-scripts/[root@web1 network-scripts]# vim ifcfg-ens33[root@web1 network-scripts]# systemctl restart network[root@web1 network-scripts]# ifconfig ens33ens33: flags=4163  mtu 1500        inet 192.168.10.10  netmask 255.255.255.0  broadcast 192.168.10.255        inet6 fe80::bdab:b59b:d041:d8b0  prefixlen 64  scopeid 0x20        ether 00:0c:29:e6:6d:eb  txqueuelen 1000  (Ethernet)        RX packets 726004  bytes 1067841474 (1018.3 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 345476  bytes 21387015 (20.3 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0#web2配置[root@web2 ~]# cd /etc/sysconfig/network-scripts/[root@web2 network-scripts]# vim ifcfg-ens33[root@web2 network-scripts]# systemctl restart network[root@web2 network-scripts]# ifconfig ens33ens33: flags=4163  mtu 1500        inet 192.168.10.20  netmask 255.255.255.0  broadcast 192.168.10.255        inet6 fe80::bdab:b59b:d041:d8b0  prefixlen 64  scopeid 0x20        ether 00:0c:29:e6:6d:eb  txqueuelen 1000  (Ethernet)        RX packets 726004  bytes 1067841474 (1018.3 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 345476  bytes 21387015 (20.3 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

​ 4.启动两个web网站服务并且验证挂载情况

#web1[root@web1 network-scripts]# systemctl start httpd [root@web1 network-scripts]# netstat -natp | grep 80tcp6       0      0 :::80                   :::*                    LISTEN      59242/httpd         [root@web1 network-scripts]# showmount -e 192.168.10.100Export list for 192.168.10.100:/opt/cc 192.168.10.0/24/opt/ll 192.168.10.0/24#web2[root@web2 network-scripts]# netstat -natp | grep 80[root@web2 network-scripts]# systemctl start httpd.service [root@web2 network-scripts]# netstat -natp | grep 80tcp6       0      0 :::80                   :::*                    LISTEN      54271/httpd         [root@web2 network-scripts]# showmount -e 192.168.10.100Export list for 192.168.10.100:/opt/cc 192.168.10.0/24/opt/ll 192.168.10.0/24

5.两个服务器上分别提供站点,写入测试信息

#web1[root@web1 network-scripts]#vim /etc/fstab192.168.10.100:/opt/ll  /var/www/html   nfs     defaults._netdev    0   0[root@web1 network-scripts]# cd /var/www/html/[root@web1 html]# ls[root@web1 html]# vim index.html[root@web1 html]# cat index.html this is ll web#web2[root@web2 network-scripts]#vim /etc/fstab192.168.10.100:/opt/cc  /var/www/html   nfs     defaults._netdev    0   0[root@web2 network-scripts]# cd /var/www/html/[root@web2 html]# ls[root@web2 html]# vim index.html[root@web2 html]# cat index.html this is cc web

4.3LVS负载均衡调度服务器配置

1.安装环境包

[root@localhost ~]# hostnamectl set-hostname lvs[root@localhost ~]# su[root@lvs ~]# yum install -y ipvsadm已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.163.com * updates: mirrors.tuna.tsinghua.edu.cn正在解决依赖关系--> 正在检查事务---> 软件包 ipvsadm.x86_64.0.1.27-7.el7 将被 安装--> 解决依赖关系完成依赖关系解决======================================================================================= Package             架构               版本                    源                大小=======================================================================================正在安装: ipvsadm             x86_64             1.27-7.el7              base              45 k事务概要=======================================================================================安装  1 软件包总下载量:45 k安装大小:75 kDownloading packages:警告:/var/cache/yum/x86_64/7/base/packages/ipvsadm-1.27-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEYipvsadm-1.27-7.el7.x86_64.rpm 的公钥尚未安装ipvsadm-1.27-7.el7.x86_64.rpm                                   |  45 kB  00:00:00     从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 检索密钥导入 GPG key 0xF4A80EB5: 用户ID     : "CentOS-7 Key (CentOS 7 Official Signing Key) " 指纹       : 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 软件包     : centos-release-7-4.1708.el7.centos.x86_64 (@anaconda) 来自       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7Running transaction checkRunning transaction testTransaction test succeededRunning transaction  正在安装    : ipvsadm-1.27-7.el7.x86_64                                          1/1   验证中      : ipvsadm-1.27-7.el7.x86_64                                          1/1 已安装:  ipvsadm.x86_64 0:1.27-7.el7                                                          完毕!

2.配置双网卡

添加网卡,然后进行设置

[root@lvs ~]# cd /etc/sysconfig/network-scripts/[root@lvs network-scripts]# lsifcfg-ens33  ifdown-isdn      ifup          ifup-plip      ifup-tunnelifcfg-lo     ifdown-post      ifup-aliases  ifup-plusb     ifup-wirelessifdown       ifdown-ppp       ifup-bnep     ifup-post      init.ipv6-globalifdown-bnep  ifdown-routes    ifup-eth      ifup-ppp       network-functionsifdown-eth   ifdown-sit       ifup-ib       ifup-routes    network-functions-ipv6ifdown-ib    ifdown-Team      ifup-ippp     ifup-sitifdown-ippp  ifdown-TeamPort  ifup-ipv6     ifup-Teamifdown-ipv6  ifdown-tunnel    ifup-isdn     ifup-TeamPort[root@lvs network-scripts]# vim ifcfg-ens33 [root@lvs network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36#配置网卡后重启网络[root@lvs network-scripts]# systemctl restart network

两个网卡信息如下:

[root@lvs network-scripts]# ifconfig ens33: flags=4163  mtu 1500        inet 10.0.0.1  netmask 255.255.255.0  broadcast 10.0.0.255        inet6 fe80::7eb1:2dde:8a54:6927  prefixlen 64  scopeid 0x20        ether 00:0c:29:56:d3:4a  txqueuelen 1000  (Ethernet)        RX packets 397693  bytes 574961333 (548.3 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 92656  bytes 5683776 (5.4 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens36: flags=4163  mtu 1500        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255        inet6 fe80::e638:fc7c:8a5b:dc5d  prefixlen 64  scopeid 0x20        ether 00:0c:29:56:d3:54  txqueuelen 1000  (Ethernet)        RX packets 51  bytes 6809 (6.6 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 83  bytes 13712 (13.3 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

3.测试是否互通

root@lvs network-scripts]# ping 192.168.10.10PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.552 ms64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.299 ms64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.255 ms^C--- 192.168.10.10 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2001msrtt min/avg/max/mdev = 0.255/0.368/0.552/0.132 ms[root@lvs network-scripts]# ping 192.168.10.20PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=0.536 ms64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.340 ms^C--- 192.168.10.20 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000msrtt min/avg/max/mdev = 0.340/0.438/0.536/0.098 ms

4.开启路由转发功能

[root@lvs network-scripts]# vim /etc/sysctl.conf #末尾加上root@lvs network-scripts]# cat /etc/sysctl.conf # sysctl settings are defined through files in# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.## Vendors settings live in /usr/lib/sysctl.d/.# To override a whole file, create a new file with the same in# /etc/sysctl.d/ and put new settings there. To override# only specific settings, add a file with a lexically later# name in /etc/sysctl.d/ and put new settings there.## For more information, see sysctl.conf(5) and sysctl.d(5).net.ipv4.ip_forward=1

5.设置防火墙及其规则

[root@lvs network-scripts]# systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)   Active: active (running) since 四 2020-02-20 09:34:20 CST; 8min ago     Docs: man:firewalld(1)

此时防火墙是开启状态,不需要将其关闭,我们可以使用iptables进行设置

#清空转发表[root@lvs network-scripts]# iptables -F#清空nat地址转发表[root@lvs network-scripts]# iptables -t nat -F#配置转发规则(四表五链)[root@lvs network-scripts]# iptables -t nat -A POSTROUTING -o ens33 -s 192.168.10.0/24 -j SNAT --to-source 10.0.0.1#加载路由转发功能[root@lvs network-scripts]# sysctl -pnet.ipv4.ip_forward = 1

6.加载LVS内核模块

[root@lvs network-scripts]# modprobe ip_vs #加载命令[root@lvs network-scripts]# cat /proc/net/ip_vs #查看IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port Forward Weight ActiveConn InActConn[root@lvs network-scripts]# systemctl start ipvsadmJob for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xe" for details.#Centos7系统需要使用--save保存[root@lvs network-scripts]# ipvsadm --save > /etc/sysconfig/ipvsadm[root@lvs network-scripts]# systemctl start ipvsadm

7.定义脚本

[root@lvs network-scripts]# cd /opt/[root@lvs opt]# vim nat.sh[root@lvs opt]# chmod 777 nat.sh[root@lvs opt]# ./nat.sh IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  lvs:http rr  -> 192.168.10.10:http           Masq    1      0          0           -> 192.168.10.20:http           Masq    1      0          0      

nat.sh的脚本如下:

#!/bin/bash#echo "1" > /proc/sys/net/ipv4/ip_forward   这里之前设置过,所以注释了ipvsadm -C  #初始化ipvsadm -A      -t 10.0.0.1:80 -s rr   #指定访问入口,rr指定的是轮循算法ipvsadm -a      -t 10.0.0.1:80 -r 192.168.10.10:80 -m #建立ip地址映射关系ipvsadm -a      -t 10.0.0.1:80 -r 192.168.10.20:80 -mipvsadm #开启

4.4使用外网客户端进行测试验证

我们可以用win10虚拟机或者一台Centos7客户机测试

但是都需要进行网卡设置,设置为仅主机模式且ip地址为10.0.0.10(10.0.0.0网段就行),网关为lvs负载均衡器外网口ip地址,在客户端的浏览器中访问的也是这个地址;测试结果的图如下所示:

1.网卡和网络测试

2.测试网站服务及轮循机制

访问lvs外网网关,lvs作为中间件或者说桥梁的角色,其实本质上是访问网站和存储服务器

刷新访问切换服务器

这边在线网上实际上两个存储的页面内容是保持一致的,这里主要是为了测试轮循机制的效果,大家需要注意一下。

至此就是lvs负载均衡NAT模式的配置流程和测试方法,谢谢阅读!

服务 服务器 配置 地址 磁盘 网卡 均衡 测试 模式 客户 两个 命令 网站 存储 正在 调度 客户机 均衡器 验证 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全生产漏洞 三门峡华太通讯网络技术 金领冠珍护扫码显示服务器错误 哪些场所会用到数据库 linux服务器端口数据库 如何制作fm数据库 医疗器械网络安全指标检验 如何删除两列重复的数据库 武汉服务器电脑主板维修 比肩微软英特尔的网络安全股 怎么把ftp服务器 陕西广电网络技术岗待遇 客户端版本和服务器端不一致 专业技术人员网络安全知识答案 古墓丽影显示服务器无法访问 兆芯中国移动服务器 智能汽车应标配网络安全 软件开发企业会计实务 怎样信任软件开发者 网络安全知识线上问答 郑州工控软件开发费用 国家如何保障网络安全 顺茂网络安全建议 网络安全最佳案例评选策划书 数据库中的er模型图 软件开发服务外包开票是什么类目 学习软件开发的培训学校 挑战一天炸完mc一百个服务器 草裙舞视频软件开发 华为h22h05服务器导轨
0