当前位置: 首页 > news >正文

centos7之LVS-TUNNEL模式

介绍
在这里插入图片描述

优缺点以及适用场景

优点:能负载更多的Realserver减轻LB的压力。LVS和Realserver可以不再同一网段。
缺点:tun模式的开销比较大(出口流量大),性能不如DR模式。不支持端口转发。后端Realserver系统必须支持tunnel协议。
适用:有局域网+广域网负载需求的公司(用的少)

tun模式:隧道模式,以封装数据包为主,原理

1.客户端发送请求给LB
2.LB收到数据包拆包(源ip:CIP 目标ip:VIP),发现是给自己的就收下数据包。
3.LB根据算法(rr wrr)选择合适的RealServer,并建一层隧道把源报文封装进去[外层源ip:DIP(内层源ip:CIP 内层目标ip:VIP)外层目标ip:RIP]发给RS
4.RS收到数据包拆包并还原之前的数据包(源ip:CIP 目标ip:VIP),并把回复的数据加进去直接发给客户端。

1、准备环境

在这里插入图片描述
所有主机关闭selinux iptables firwalld
lvs基于四层ip+端口转发,不支持基于url和目录的转发

2、部署lvs

(1) 查看当前隧道模块
# lsmod |grep ipip    # 目前是没有的(2) 添加虚拟网卡tunl0并配置vip
# ip addr add 192.168.1.100/32 dev tunl0(3) 再次查看隧道模块已经有了
# lsmod |grep ipip
ipip                   13465  0 
tunnel4                13252  1 ipip
ip_tunnel              25163  1 ipip(4) 查看新增加的虚拟网卡tunl0,状态为DOWN
# ip addr
5: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0inet 192.168.1.100/32 scope global tunl0valid_lft forever preferred_lft forever(5) 激活虚拟网卡并再次查看虚拟网卡状态为UNKNOWN,通过ifconfig也能看到tunl0网卡了
# ip link set up tunl0
# ip addr 
5: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0inet 192.168.1.100/32 scope global tunl0valid_lft forever preferred_lft forever
(6) 安装ipvsadm并配置负载均衡
# yum -y install ipvsadm
# ipvsadm -A -t 192.168.1.100:80 -s rr                       # 创建虚拟服务器并添加vip
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.23:80 -i -w 1  # 为虚拟服务器添加后端realserver
# ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.24:80 -i -w 1  
----------------------------------------------------
-A:添加虚拟服务器
-t: 指定vip和tcp端口
-a: 添加realserver
-r: realserver地址
-i: tunnel模式 -m:nat模式 -g dr模式
-w: 权重(7) 也可以设置基于udp的
# ipvsadm -A -u 192.168.1.100:30005 -s rr
# ipvsadm -a -u 192.168.1.100:30005 -r 192.168.1.11:30005 -i -w 1
# ipvsadm -a -u 192.168.1.100:30005 -r 192.168.1.12:30005 -i -w 1(8) 保存ipvsadm规则并重启
# ipvsadm -Sn > /etc/sysconfig/ipvsadm      # 保存规则
# ipvsadm-restore < /etc/sysconfig/ipvsadm  # 导入规则
# systemctl restart ipvsadm  # 导入规则后才会有ipvsadm.service文件
# systemctl enable ipvsadm(9) 查看lvs状态
# ipvsadm -ln
# ipvsadm -ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:80 rr-> 192.168.1.23:80              Tunnel  1      0          0         -> 192.168.1.24:80              Tunnel  1      0          0 UDP  192.168.1.100:30005 rr-> 192.168.1.11:30005           Tunnel  1      0          6         -> 192.168.1.12:30005           Tunnel  1      0          6(10)脚本配置
# cat /usr/local/sbin/lvs_tun.sh 
#!/bin/bash                                                                             
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.3.229
rs1=192.168.3.225
rs2=192.168.3.226
#注意这里的网卡名字
ifconfig tunl0 $vip broadcast $vip netmask 255.255.255.255 up
# 让vip走虚拟网卡
route add -host $vip dev tunl0
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -i -w 1
$ipv -a -t $vip:80 -r $rs2:80 -i -w 1

3、部署realserver

(1) 配置nginx略(2) 在两台realserver添加tunl0网卡并配置vip
# ip addr add 192.168.1.100/32 dev tunl0
# ip link set up tunl0     # 激活网卡(3) 配置内核关闭arp转发(否则客户端没有经过lvs负载就直接访问到后端realserver的vip上去了)
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore 
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 
# 关闭地址校验
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter 
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter 
--------------------------------------------------
rp_filter:默认为1,linux会反向校验来源ip是否从同一张网卡进出,如果不是就会丢弃数据包,而TUNNEL模式是从tunl0网卡进物理网卡出,如果不关闭这个功能会导致数据包被丢弃。(4) 脚本
# cat /usr/local/sbin/lvs_tun_rs.sh 
#/bin/bash                                                                               
vip=192.168.3.229
#把vip绑定在tunl0上,是为了实现rs直接把结果返回给客户端
ifconfig tunl0 $vip broadcast $vip netmask 255.255.255.255 up
# 让vip走虚拟网卡
route add -host $vip tunl0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore 
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore 
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter 
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter

4、验证不要在lvs上curl,这样不通,需要通过windows的浏览器访问才行(用linux做客户端测试最好)

http://www.lryc.cn/news/473816.html

相关文章:

  • Linux驱动开发(3):字符设备驱动
  • 刘艳兵-DBA023-控制文件是Oracle 数据库用来查找数据库文件,控制文件包含以下哪些信息:
  • Vue Scoped CSS深度解析:原理、误区与最佳实践
  • 744. 寻找比目标字母大的最小字母
  • 浅谈QT中Tab键的切换逻辑
  • 基于MoviNet检测视频中危险暴力行为
  • 《等保测评:抵御网络威胁的盾牌》
  • 前端必知必会-JavaScript 对象属性
  • 双11都有什么值得入手的好物?双十一最建议买的5样东西
  • Xcode 15.4 运行flutter项目,看不到报错信息详情?
  • AMD开始为基于RDNA的GPU开发自己的神经超采样和去噪技术
  • Python中的文件I/O操作
  • .net framework 3.5sp1开启错误进度条不动如何解决
  • 什么影响网站的SEO排名
  • css绘制s型(grid)
  • 【华为HCIP实战课程二十八】中间到中间系统协议IS-IS邻居关系排错,网络工程师
  • Word首行空格不显示空格符号问题
  • vue+element上传图片
  • 用ChatGPT提升工作效率:从理论到实际应用
  • 8、Node.js Express框架
  • STM32F103C8T6学习笔记3--按键控制LED灯
  • Unity3D Shader实现法线贴图功能详解
  • 【含开题报告+文档+源码】基于SpringBoot+Vue的校园设备报修系统
  • 电赛入门之软件stm32keil+cubemx
  • STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
  • Docker命令备忘录----Linux运维
  • Golang new() make var []int 使用的具体区别
  • 【Linux驱动开发】多线程调用驱动时的并发与竞争(原子操作、自旋锁、信号量、互斥锁)
  • qt QComboBox详解
  • redis做缓存,mysql的数据怎么与redis进行同步(双写一致性)