从LVS DR部署中理解网络特性

从LVS DR部署中理解网络特性

环境准备

​ client 192.168.2.11

​ server01 192.168.2.80

​ server02 192.168.2.88

​ server03 192.168.2.89

实施目标

​ client指我本机,将使用本机浏览器访问server01,server01作为LVS负载均衡器,server02、server03作为目标服务器,将各自部署httpd测试程序。通过访问server01可以代理到后端server02或server03。为了高效的完成转发,将使用LVS的DR模式,不然没有理由不使用nginx,因为它还可以完成更复杂的应用场景。

需要厘清的东西

MAC地址概念

​ 众所周知,一个tcp连接的四要素是源IP、源端口、目标IP、目标端口。除此之外,还有源MAC、目标MAC。MAC地址是物理或逻辑连接的网络设备的标志。网络包的收发必须使用MAC地址。不管是物理网线还是无线网,都使用MAC地址规范。源主机通过自身的MAC地址发包,而目标地址通过自身的MAC地址接收包。从源地址到目标地址可能经过多个节点,那么一个包的MAC地址不断的变更。每对MAC地址只管“一跳”,“一跳”指的是利用数据链路以下分层的功能传输数据帧的一个区间。也就是说他是主机或路由器网卡不经过其他路由器而能直接到达的相邻主机或路由器。有人会问,那经过交换机不用修改MAC吗?不会。交换机由它自己的逻辑,是通过它的硬件”端口“记忆的。在我们进行网络编程时,除了指定目标IP和端口,其他的都自动“填充”了,源端口一般是随机生成的,有选项可以复用,在高并发场景下,这个复用机制有助于提高性能。剩下源IP、源MAC、目标MAC如何确定?

源IP和MAC

​ 在多网卡的情况下,根据目标IP在本机路由表中找到对应的网络接口,如eth0、enp0s3等,除了lo本机巡回接口,物理接口都有一个MAC和IP。如下的路由条目,根据目标地址和Destination选取一个路由条目,若目标地址是192.168.2.76,则通过enp0s3接口发出去报文。

在这里插入图片描述

​ 再通过ifconfig 或 ip addr命令查找IP,那么源IP是192.168.2.80,源MAC是08:00:27:3e:df:49

在这里插入图片描述

目标MAC

​ 根据目标IP先取arp本地缓存,如果找不到MAC,则发送ARP请求。arp缓存如下:

在这里插入图片描述

​ ARP缓存着交换机相邻的主机或路由器,如192.168.2.1是网关路由器、其他是主机。ARP请求跟MAC请求一样,不能跨路由。只能先到路由器之后,再由路由器arp 外网地址183.2.172.42。如从192.168.2.80访问百度等外网场景。则通过缓存找到 192.168.2.1 MAC,再由路由发送ARP请求外网IP,再转发IP包。

IP包转发流程

​ ARP 缓存查找192.168.2.1 MAC (缓存命中)

ARP广播192.168.2.1 (FFFFFFFF),路由器网卡收到后返回10:5d:dc:0b:34:c2,192.168.2.80接收到请求后并缓存。(不命中情况)

​ 192.168.2.80转发包给路由器

​ 路由器ARP缓存查找183.2.172.42 MAC(未命中),路由器通过183.2.172.42外网网卡发送ARP广播,下一个网关路由器返回MAC。

​ 路由器收到MAC后,缓存外网网关MAC。

​ 192.168.2.1转发包给外网路由器。。。。。。。。。。。如此反复,直到某个路由器找到当前相邻的主机IP是目的地址183.2.172.42。

​ 综上,IP和路由表定位是结合在一起的,包的转发、传输必须经过MAC。除此之外,路由器一般还进行NAT转换,如图,内网访问外网,一般做内网IP转换叫SNAT,家庭、公司上网都是这种场景。还有一种DNAT,做服务器负载均衡的时候使用,比如nginx做反向代理、upstream时。
在这里插入图片描述

​ 正确理解“加粗字体部分”

​ “ **ARP广播192.168.2.1 (FFFFFFFFFFFF),路由器网卡收到后返回10:5d:dc:0b:34:c2,192.168.2.80接收到请求后并缓存。”,这句话正确但不全对。主要有如下两个点:

ARP广播

​ ARP请求是一种特殊的IP请求,主要元素包括源IP、目标IP、源MAC、目标MAC(FFFFFFFFFFFF)。目标MAC设置为全F,表示广播到跟交换机相邻的所有主机及路由器,目标IP是明确的,源MAC是根据目标IP和路由表算出来的接口MAC,那ARP请求报文还剩源IP该怎么设置?是源发送报文的IP?还是跟目标IP最匹配的路由网卡接口IP?linux中由arp_announce 参数控制如下:

对网络接口上本地IP地址发出的ARP报文作出相应级别的限制。

0:本机所有IP地址都向任何一个接口通告ARP报文。(默认值。源报文的源IP是什么,ARP请求的源IP设置成什么)

1:尽量仅向该网卡回应与该网段匹配的ARP报文。(如果目标IP和源IP网段属于子网关系,则使用源IP,否则使用2)

2:只向该网卡回应与该网段匹配的ARP报文。(忽略原报文的源IP,选择最合适的发送网卡IP,这也是原报文选择IP时的方式。)
路由器收到返回

​ 路由器接收到的ARP请求的网卡IP地址是一定返回的。而其他网卡IP地址是否返回?linux中由arp_ignore 参数控制如下

0 - (默认值): 回应任何网络接口(网卡)上对任何本机IP地址的arp查询请求。比如eth0=192.168.1.15/24,eth1=10.1.7.15/24,那么即使eth0收到来自10.1.7.16这样地址发起的对10.1.7.15 的arp查询也会给出正确的回应;而原本这个请求该是出现在eth1上,也该有eth1回应的。
1 - 只回应目标IP地址是本机上来访网络接口(网卡)IP地址的ARP查询请求 ,比如eth0=192.168.1.15/24,eth1=10.1.7.15/24,那么即使eth0收到来自10.1.7.16这样地址发起的对192.168.1.15的查询会回应,而对10.1.7.15 的arp查询不会回应。
2 -只回应目标IP地址是本机上来访网络接口(网卡)IP地址的ARP查询请求,且来访IP(源IP)必须与该网络接口(网卡)上的IP(目标IP)在同一子网段内 。比如eth0=192.168.1.15/24,eth1=10.1.7.15/24,eth1收到来自10.1.7.16这样地址发起的对192.168.1.15的查询不会回应,而对192.168.1.16发起的对192.168.1.15的arp查询会回应
3 -如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包
4-7 - 保留未使用
8 -不回应所有(本机地址)的arp查询

部署策略

​ 图中箭头为数据包流向,可以看到红色部分为响应包,server02、server03不经过server01,直接返回给浏览器,这就是DR模式。诸如nginx NAT模式下,在WEB应用中,响应包大,因为查询结果多为一个数据集列表、一个页面。曾经在一次压测中,响应时间加不加nginx,多了1/3的时间,还不算压缩编码解码的CPU消耗。

在这里插入图片描述

​ 实现1、2、3闭环,也就实现了DR模式:需要保证如下几点:

​ 1、80、88、89需要有同一个IP,192.168.2.17,不然闭环不了。

​ 2、80上的17能够被11访问到,而88、89上的17不能被11直接访问,否则80起不到负载均衡分发的作用。 需要做两个层次的控制:

​ IP层:80的17挂在enp0s3上、而88/89的17挂在lo上;

​ 链路层:88、89的arp_ignore应设置成1,不暴露17的MAC 88@mac 89@mac

​ 3、11的arp缓存中一定不能包含17 88@mac、17 89@mac,如何实现:

​ 88返回时IP报文是 17 —> 11,MAC是88@mac, 89返回时IP报文是 17 —> 11,MAC是89@mac.。因为默认情况下arp_announce=0表示取原报文17的IP作为ARP请求的源IP,11接收到请求后,也将缓存17 88@mac,88、89的arp_announce应设置成2,也就是发送ARP的IP从17改成88、89。

在这里插入图片描述

部署步骤

设置ARP参数:在88、89上执行如下,若永久生效则修改/etc/sysctl.conf文件,然后sysctl -p刷新到内存:

echo 1  >  /proc/sys/net/ipv4/conf/enp0s3/arp_ignore
echo 1  >  /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2  >  /proc/sys/net/ipv4/conf/all/arp_announce 
echo 2  >  /proc/sys/net/ipv4/conf/enp0s3/arp_announce

添加IP:

80上执行


ifconfig  enp0s3:1 192.168.2.77/24

88、89上执行(巡回接口不能设置成这样的网段如255.255.255.0,否则发不出去)


ifconfig lo:3 192.168.2.77 netmask 255.255.255.255

若永久生效比如在88上执行如下:

在/etc/sysconfig/network-scripts目录下,找到ifcfg-lo

cp ifcfg-lo ifcfg-lo:3

vi ifcfg-lo:3,修改如下几项,80、89如法炮制即可:

DEVICE=lo:3
IPADDR=192.168.2.77
NETMASK=255.255.255.255

service network restart后,ifconfig查看,接口lo:3依旧存在。

切换阿里云镜像

cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

cat /etc/yum.repos.d/CentOS-Base.repo

sudo yum clean all

sudo yum makecache

88、89安装http测试服务

yum install httpd -y
service httpd start
vi   /var/www/html/index.html
192.168.2.88/89

80上添加ipvsadm

yum install ipvsadm 
ipvsadm -A  -t  192.168.2.77:80  -s rr
ipvsadm -a  -t 192.168.2.77:80  -r  192.168.2.88 -g -w 1
ipvsadm -a  -t 192.168.2.77:80  -r  192.168.2.89 -g -w 1

从11访问80,验证了RR调度模式

在这里插入图片描述在这里插入图片描述

ipvs是如何实现的

​ ipvsadm是给用户使用的用户层框架,ipvs是内核层模块, 基于 linux netfilter框架开发,netfilter专门对网络包进行处理。这个框架根据包的出入方向、本机或转发性质等特性定义了5个点:pre_routing、local_in、forward、local_out、post_routing,如下图:

在这里插入图片描述

​ 如同spring 一个bean的初始化生命周期中,有很多钩子,可以理解这5个点就是netfilter框架的钩子。iptables对比来看。iptables和ipvs也是基于netfilter实现的,ipvs内核模块勾在2点 local_in或input,iptables覆盖全部,更为完整。在iptables的实现中,由分为“表”、“链”。每个点实现的方法集合叫“链”、不同的链的统一操作称为“表”操作,iptables的表包括raw、manage、nat、filter。有人会问,为什么不直接对钩子进行操作,多了一层“表”?因为表的一次操作可以同时处理多个钩子。最常用的表是nat、filter。nat实现SNAT、DNAT。而filter可实现防火墙功能。“表”和“链”对应关系如下:

在这里插入图片描述

​ 在iptables命令中 ,可不指定 -t,默认 filter,所以对应chain只能是input、forward、output。

iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION

​ 表和链在内核中的处理时机、分布如下:

在这里插入图片描述
​ 1、2为流入本机流量序列

​ 1、3为流入待转出流量序列

​ 3、5为流出转发流量序列

​ 4、5为流出本机流量序列

​ ipvs序列为 1、2、5:表示本机的流量在2处,执行ipvsadm的规则,改写mac后由post_routing发出。

​ iptable实用命令

​ 1、将本机80端口的请求转发到8080端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

​ 2、SNAT:如果源报文是从172.16.1.0/24网关发过来的,由本网卡eth0发出去到的,则重写源地址为192.168.14.1


iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 192.168.14.1


​ 3、DNAT:如果目标是发往192.168.14.1:30000的,由eth0接收到的,则目标地址被改写成172.16.1.5:22

 iptables -t nat -A PREROUTING -d 192.168.14.1 -p tcp --destination-port 30000 -i eth0 -j DNAT --to-destination 172.16.1.5:22

​ 4、开通本机某端口:允许流量访问本机80应用

 iptables -I INPUT -p tcp --dport 80 -j ACCEPT

lvs运维

#统计连接情况
ipvsadm -ln

#查看当前连接详情,出现SYN_RECV说明有问题
ipvsadm -lnc

#使用netstat -natp查看连接情况
server01:看不到socket连接,因为它属于IP网络层转发
server02、03:看到很多的socket连接,TCP连接

  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值