LVS负载均衡集群配置(小白的“升级打怪”成长之路)

目录

LVS负载均衡集群实验

一、基于NAT的LVS负载均衡

1.1、工作原理

1.2、LVS-NAT模型的特性

1.3、NAT的优点

1.4、NAT的缺点

实战案例

1、LVS调度器配置

2、真实服务器配置

3、LVS调度器配置负载分配策略

4、验证

二、基于DR的LVS负载均衡

2.1、DR 实现原理

2.2、DR 模式的优点

2.3、DR 模式的缺点

2.4、DR 模式的使用场景

实战案例

1、LVS调度器配置

2、真实服务器配置

3、验证

三、基于TUN的LVS负载均衡

3.1、实现原理

3.2、TUN 模式的优点

3.3、TUN 模式的缺点

实战案例

1、LVS调度器配置

2、真实服务器web2配置

3、真实服务器web2配置

4、验证

看到感觉有帮助的朋友,劳烦动动发财的小手给博主点个赞


LVS负载均衡集群实验

一、基于NAT的LVS负载均衡

NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外网,以及外部用户可以访问位于公司内部的私有的ip主机。

LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。

1.1、工作原理

  • 当用户的请求到达调度器时,请求报文会先到内核空间的PREROUTING链上。此时报文的源IP为CIP,目标IP为VIP

  • PREROUTING检查发现数据包的目标IP是本机,就将数据包送至INPUT链。

  • IPVS工作在INPUT链上,当数据包抵达INPUT链后,IPVS会检查数据包所请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器RIP,然后将数据包送往 POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP。

  • POSTROUTING链通过选路,将数据包转发给Real Server

  • Real Server对比发现目标IP是自己,就会接受这个请求报文,开始构建响应报文发回给调度器。源IP为RIP,目标IP为CIP

  • 调度器在响应客户端前,会将报文的源IP地址修改为自己的VIP,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP

1.2、LVS-NAT模型的特性

  • RS应该使用私有地址,RS的网关必须指向DIP

  • DIP和RIP必须要在同一网段中

  • 请求报文和响应报文都需要经过调度器,高负载场景中,调度器容易成为性能瓶颈。

  • 支持端口映射

  • RS可以使用任意操作系统

1.3、NAT的优点

集群中的物理服务器可以使用任何支持TCP/IP操作系统它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。

1.4、NAT的缺点

伸缩能力有限,当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。

实战案例

准备三台主机,其中两台主机作为真实服务器(ip分别为192.168.100.1和192.168.100.2),一台主机作为前端负载均衡器节点(内设两个ip,分别192.168.100.100和192.168.58.180)

1、LVS调度器配置

####192.168.58.180
##安装ipvsadm
[root@localhost ~]# yum insatll -y ipvsadm
##加载ip_vs模块
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# lsmod | grep ip_vs
ip_vs                 229376  0
nf_conntrack          212992  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              12288  2 nf_conntrack,ip_vs
​
##修改主机名
[root@localhost ~]# hostnamectl set-hostname lvs
[root@localhost ~]# bash
​
​
Welcome to 6.6.0-79.0.0.84.oe2403sp1.x86_64
​
System information as of time:  2025年 07月 12日 星期六 21:07:49 CST
​
System load:    0.00
Memory used:    8.1%
Swap used:      0%
Usage On:       5%
IP address:     192.168.100.100
IP address:     192.168.58.180
Users online:   2
​
##开启路由功能
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
​
[root@lvs ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
​
##启动ipvsadm服务
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl enable --now ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

2、真实服务器配置

####192.168.100.1
##修改主机名
[root@localhost ~]# hostnamectl set-hostname web1
[root@localhost ~]# bash
​
[root@web1 ~]# yum insatll -y nginx
​
[root@web1 ~]# systemctl start nginx
[root@web1 ~]# echo web1 > /usr/share/nginx/html/index.html 
####192.168.100.2
##修改主机名
[root@localhost ~]# hostnamectl set-hostname web2
[root@localhost ~]# bash
​
[root@web2 ~]# yum insatll -y nginx
​
[root@web2 ~]# systemctl start nginx
[root@web2 ~]# echo web2 > /usr/share/nginx/html/index.html 

3、LVS调度器配置负载分配策略

####192.168.58.180
[root@lvs ~]# curl 192.168.100.1
web1
[root@lvs ~]# curl 192.168.100.2
web2
​
##配置添加虚拟服务节点为192.168.58.180:80,算法为轮询
[root@lvs ~]# ipvsadm -A -t 192.168.58.180:80 -s rr
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.58.180:80 rr
##配置虚拟服务节点192.168.58.180:80指定真实服务器节点IP地址,NAT模式
[root@lvs ~]# ipvsadm -a -t 192.168.58.180:80 -r 192.168.100.1 -m
[root@lvs ~]# ipvsadm -a -t 192.168.58.180:80 -r 192.168.100.2 -m
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.58.180:80 rr
  -> 192.168.100.1:80             Masq    1      0          0         
  -> 192.168.100.2:80             Masq    1      0          0 

4、验证

网站访问192.168.58.180

二、基于DR的LVS负载均衡

直接路由:Direct Routing,简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各个地方,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。它是最常用的工作模式,因为它的功能性强大。

2.1、DR 实现原理

  • 当客户端用户发送请求给 www.baidu.com 网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过网络到百度 LVS 负载均衡服务器。

  • 这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。

  • 数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。

  • 数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务。

  • 如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。

  • 数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。

  • 数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。

  • 此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。

2.2、DR 模式的优点

  • 响应数据不经过 LVS,性能高。

  • 对数据包修改小,信息完整性好。

2.3、DR 模式的缺点

  • LVS 与 RS 必须在同一个物理网络。

  • RS 上必须配置 lo 和其他内核参数。

  • 不支持端口映射。

2.4、DR 模式的使用场景

对性能要求高的,可首选 DR 模式,还可透传客户端源 IP 地址。

实战案例

所有主机在同一网段下

准备三台主机,其中两台主机作为真实服务器(ip分别为192.168.100.1和192.168.100.2),一台主机作为LVS调度器(ip为192.168.100.100)

1、LVS调度器配置

####192.168.100.100
##安装ipvsadm
[root@localhost ~]# yum insatll -y ipvsadm
##加载ip_vs模块
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# lsmod | grep ip_vs
ip_vs                 229376  0
nf_conntrack          212992  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              12288  2 nf_conntrack,ip_vs
​
##修改主机名
[root@localhost ~]# hostnamectl set-hostname lvs
[root@localhost ~]# bash
​
​
Welcome to 6.6.0-79.0.0.84.oe2403sp1.x86_64
​
System information as of time:  2025年 07月 12日 星期六 21:07:49 CST
​
System load:    0.00
Memory used:    8.1%
Swap used:      0%
Usage On:       5%
IP address:     192.168.100.100
IP address:     192.168.58.180
Users online:   2
​
​
[root@lvs ~]# vim /etc/sysctl.conf
##加入这条内容
net.ipv4.conf.ens160.send_redirects = 0
​
[root@lvs ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.conf.ens160.send_redirects = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
​
[root@lvs ~]# 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
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:16:2b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe16:2b5c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
##配置虚拟IP地址
[root@lvs ~]# ifconfig ens160:0 192.168.100.101/24
[root@lvs ~]# 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
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:16:2b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.100.101/24 brd 192.168.100.255 scope global secondary ens160:0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe16:2b5c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
​
​
##启动ipvsadm服务
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl enable --now ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
​
##配置添加虚拟服务节点为192.168.100.101:80,算法为轮询
[root@lvs ~]# ipvsadm -A -t 192.168.100.101:80 -s rr
##配置虚拟服务节点192.168.100.101:80指定真实服务器节点IP地址,默认直接路由模式
[root@lvs ~]# ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.1:80
[root@lvs ~]# ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.2:80
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.101:80 rr
  -> 192.168.100.1:80             Route   1      0          0         
  -> 192.168.100.2:80             Route   1      0          0         
##保存策略
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.100.1:http -g -w 1
-a -t lvs:http -r 192.168.100.2:http -g -w 1

2、真实服务器配置

####192.168.100.1
##修改主机名
[root@localhost ~]# hostnamectl set-hostname web1
[root@localhost ~]# bash
​
[root@web1 ~]# yum insatll -y nginx
​
[root@web1 ~]# systemctl start nginx
[root@web1 ~]# echo web1 > /usr/share/nginx/html/index.html 
​
##防止VIP在同一网络产生IP地址冲突
[root@web1 ~]# vim /etc/sysctl.conf 
##在最后加入这段配置,防止ip冲突
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.default.arp_ignore=1 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce=2
​
[root@web1 ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
​
##配置虚拟IP地址
[root@web1 ~]# ifconfig lo:0 192.168.100.101/32
[root@web1 ~]# 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
    inet 192.168.100.101/0 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:66:09:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe66:9cd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
##添加回环路由
[root@web1 ~]# route add -host 192.168.100.101/32 dev lo:0
####192.168.100.2
##修改主机名
[root@localhost ~]# hostnamectl set-hostname web2
[root@localhost ~]# bash
​
[root@web2 ~]# yum insatll -y nginx
​
[root@web2 ~]# systemctl start nginx
[root@web2 ~]# echo web2 > /usr/share/nginx/html/index.html 
​
##防止VIP在同一网络产生IP地址冲突
[root@web2 ~]# vim /etc/sysctl.conf 
##在最后加入这段配置,防止ip冲突
net.ipv4.conf.all.arp_ignore=1 
net.ipv4.conf.all.arp_announce=2 
net.ipv4.conf.default.arp_ignore=1 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce=2
​
[root@web2 ~]# sysctl -p
kernel.sysrq = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
​
##配置虚拟IP地址
[root@web2 ~]# ifconfig lo:0 192.168.100.101/32
[root@web2 ~]# 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
    inet 192.168.100.101/0 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:66:09:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.2/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe66:9cd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
##添加回环路由
[root@web2 ~]# route add -host 192.168.100.101/32 dev lo:0

3、验证

网站访问192.168.100.101

三、基于TUN的LVS负载均衡

IP 隧道:IP Tunnel,简称:TUN 模式,采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。

3.1、实现原理

  • 在原有的ip报文外在封装多一层的ip首部,内部ip首部(原地址为cip,目标ip为vip),外层ip首部原地址为dip,.目标地址为rip

  • 客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。

  • 进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。

  • 到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。

  • 数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。

  • 后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。

3.2、TUN 模式的优点

  • 单臂模式,LVS 负载压力小。

  • 数据包修改小,信息完整性高。

  • 可跨机房。

3.3、TUN 模式的缺点

  • 不支持端口映射。

  • 需在 RS 后端服务器安装模块(ipip)及配置 VIP。

  • 隧道头部 IP 地址固定,RS 后端服务器网卡可能会不均匀。

  • 隧道头部的加入可能会导致分片,最终会影响服务器性能。

实战案例

1、LVS调度器配置

####192.168.100.100
#清空清除DR模式的策略
[root@lvs ~]# ipvsadm -C
#加载隧道模块
[root@lvs ~]# modprobe ipip
[root@lvs ~]#  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
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:16:2b:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe16:2b5c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:16:2b:66 brd ff:ff:ff:ff:ff:ff
8: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
[root@lvs ~]# ip route
192.168.100.0/24 dev ens160 proto kernel scope link src 192.168.100.100 metric 102 
#添加ip临时添加
[root@lvs ~]# ip addr add 192.168.100.101/24 dev tunl0
#使网卡生效
[root@lvs ~]# ip link set up tunl0
#删除tunl0路由,否则同网段两个相同路由,会导致冲突,无法向外访问
[root@lvs ~]# ip route del 192.168.100.0/24 dev tunl0
​
#设置轮询调度
[root@lvs ~]# ipvsadm -A -t 192.168.100.101:80 -s rr
#-i表示隧道模式,指向真实的web服务器
[root@lvs ~]# ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.1:80 -i
[root@lvs ~]# ipvsadm -a -t 192.168.100.101:80 -r 192.168.100.2:80 -i
#查看配置的策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.101:80 rr
  -> 192.168.100.1:80             Tunnel  1      0          0         
  -> 192.168.100.2:80             Tunnel  1      1          0    

2、真实服务器web2配置

####192.168.100.1
#加载隧道模块
[root@web1 ~]# modprobe ipip
[root@web1 ~]# 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
    inet6 ::1/128 scope host proto kernel_lo 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:66:09:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe66:9cd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
6: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
[root@web1 ~]# ip route
default via 192.168.100.100 dev ens160 proto static metric 100 
127.0.0.0/8 dev lo proto kernel scope link src 127.0.0.1 metric 30 
192.168.100.0/24 dev ens160 proto kernel scope link src 192.168.100.1 metric 100 
#添加ip临时添加
[root@web1 ~]# ip addr add 192.168.100.101/24 dev tunl0
#使网卡生效
[root@web1 ~]# ip link set up tunl0
#删除tunl0路由,否则同网段两个相同路由,会导致冲突,无法向外访问
[root@web1 ~]# ip route del 192.168.100.0/24 dev tunl0
​
#开启路由转发功能,过滤规则
[root@web1 ~]# vim /etc/sysctl.conf 
#在最后加上以下内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.ens160.arp_filter = 0
net.ipv4.conf.ens160.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.tunl0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 0
[root@web1 ~]# sysctl -p
​
#查看配置的网页内容
[root@web1 ~]# cat /usr/share/nginx/html/index.html 
web1

3、真实服务器web2配置

与真实服务器web1同理配置

[root@web2 ~]# ipvsadm -C
[root@web2 ~]# modprobe ipip
[root@web2 ~]# 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
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:80:88:5d brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.2/24 brd 192.168.100.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe80:885d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:80:88:67 brd ff:ff:ff:ff:ff:ff
4: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
    inet 192.168.100.101/24 scope global tunl0
       valid_lft forever preferred_lft forever
[root@web2 ~]# ip rotue
[root@web2 ~]# ip addr add 192.168.100.101/24 dev tunl0
[root@web2 ~]# ip link set up tunl0
[root@web2 ~]# ip route del 192.168.100.0/24 dev tunl0
[root@web2 ~]# sysctl -p
[root@web2 ~]# cat /usr/share/nginx/html/index.html 
web2

4、验证

网站访问192.168.100.101

看到感觉有帮助的朋友,劳烦动动发财的小手给博主点个赞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值