负载均衡集群中如何隐藏VIP ****************

来源:互联网 发布:迅雷赚钱宝秒杀软件 编辑:程序博客网 时间:2024/05/24 00:11

   lvs+keepalived上线跑了几个月,上百万IP的访问并发都没任何效率低,但今天还是倒下了,查了很久确定是机房中了ARP,LVS本身就靠的就是ARP,倒被ARP给欺骗了。机房检查了半天怎么都说局域网没ARP,估计他们只会看监控不懂原理,我就说下我个人理解ARP攻击原理。

arp欺骗我就打个比方来说,这样更容易理解,比如张三住学校宿舍A栋6楼,宿舍阿姨就住宿舍一楼,负责收邮件然后把邮件发给指定的人,一天来了一封邮件,是给张三的,阿姨就在楼下大叫了一声:张三快下来,来邮件了,张三就赶紧下去收自己的邮件,然而过了些时间又有封邮件是给张三的,阿姨又大叫了声:张三快下来,来邮件了,张三跑下去收的时候,发现邮件被收走了,他就会问阿姨邮件呢,阿姨肯定是说刚有个张三领走了,这时肯定有个假张三,在阿姨叫的时候,他先回答说:我就是张三,真张三就为了防止别人乱领他的信,他就告诉阿姨以后收到张三的邮件就送到A栋611房间(这也就是解决ARP欺骗的方法),阿姨也就相当个路由器,只要再路由器把IP地址和MAC地址绑定下就解决了ARP欺骗攻击。

说下后话,为什么机房那些鸟人老不承认机房中了ARP,因为他们只知道看监控。机房的监控估计是适应于监控广播式的ARP,就比如假张三大叫了声:我是张三,整栋楼都听见了,所以容易被发现,至于为什么监控不到,就是可能因为假张三就一直站阿姨门口看着,或者手机这样的通讯工具,回答的时候别人听不见,只阿姨能听到。哈哈,这也是我的幻想,别当真!

最后说下LVS负载均衡器遇上机房ARP的解决办法,也就是让机房把虚拟IP和LVS负载均衡器的MAC地址绑定下,这样立马见效,和平时的ARP处理方法一样,为什么我要写这篇日志,因为LVS本身就靠的就是ARP欺骗,然后虚拟IP绑定哪台服务器的MAC地址不能确定,最后还是决定虚拟IP绑定负载均衡器的MAC地址。回过头去看了下LVS工作原理,发现这是正确的!但还发现个问题,比如你的主LVS死机了,这时从就不能自动接替,因为你路由做了MAC地址绑定,这时要通知机房取消!或者改成从的MAC地址绑定。

LVS DR模式下的ARP原理

在LVS的DR模式下,有一个必须要处理的问题就是real server上的ARP响应问题。其实,这个问题不只是LVS,其他的L4 Switch方案比如Foundry的ServerIron,也需要设置real server上的ARP响应。因为这是这种方案的结构决定的。

根据LVS官方说明,在LVS 的DR模式下,前端的director接收到用户请求以后,director根据后端real server的负载情况,动态地选择一台real server,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出的real server的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的real server,所以被选出来的那台real server肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。

VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。

从上边的LVS DR工作原理可以看到一个客户端计算机发送一个ARP广播到LVS-DR集群,因为Director和集群节点(真实服务器1)都是连接到相同的网络上的,它们都会接收到ARP广播“是谁的VIP1?”,这个时候我们希望的是只有前端的director来对用户进行响应,其他real server不应该响应用户直接的ARP包。(参考下边两幅引用51cto网站的图)

点击查看原图

点击查看原图

因此必须对real server进行一定的处理,使其不响应VIP接口上的ARP请求。在2.6系列的内核中,采用的方式是设置arp_announce和arp_ignore这两个内核参数。

arp_ignore=1,系统只回答目的IP为是本地IP的包。也就是对广播包不做响应。 
arp_announce=2,系统忽略IP包的源地址(source address),而根据目标主机(target host),选择本地地址


#####################################################################################33333

lvs环境中,需要设定以下的参数

 

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

 

 

 

 

 

先来看看关于arp_ignore和arp_announce的有关介绍

有关arp_ignore的相关介绍:
arp_ignore - INTEGERDefine different modes for sending replies in response toreceived ARP requests that resolve local target IP addresses:0 - (default): reply for any local target IP address, configuredon any interface1 - reply only if the target IP address is local addressconfigured on the incoming interface2 - reply only if the target IP address is local addressconfigured on the incoming interface and both with thesender's IP address are part from same subnet on this interface3 - do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied4-7 - reserved8 - do not reply for all local addressesThe max value from conf/{all,interface}/arp_ignore is usedwhen ARP request is received on the {interface}
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

arp_ignore:定义对目标地址为本地IPARP询问不同的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 

2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 

3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 

4-7 - 保留未使用 

8 -不回应所有(本地地址)的arp查询



1. ARP广播会产生的问题(以上图为例)

当客户端发起访问VIP 对应的域名的请求时,根据网络通信原理会产生ARP 广播,因为负载均衡器和真实的服务器在同一网络并且VIP设置在集群中的每个节点上,此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIP的ARP广播,这就会产生问题,大家都说我是"VIP"。

2. 为了达到负载均衡的目的,必须想法办让真实服务器忽略来自客户端计算机的ARP广播请求
方法一:在真实服务器上设置lo 忽略ARP 广播
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2 

 如果VIP 是设置在真实服务器的非lo接口,那么做如下设置
net.ipv4.conf.ethN.arp_ignore = 1 
net.ipv4.conf.ethN.arp_announce = 2 (N 为网卡接口)
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.all.arp_announce = 2 

方法二: 隐藏真实服务器上VIP 的网络接口

#to activate the hidden feature 
 echo 1 > /proc/sys/net/ipv4/conf/all/hidden
#to make lo:0 not arp, put lo here 
 echo 1 > /proc/sys/net/ipv4/conf/<interface_name>/hidden

************************************************************************************************************


负载均衡集群的试验中,需要对RealServer的VIP地址进行隐藏。
VIP地址隐藏应用于LVS-DR和LVS-TUN转发类型。
     当CIP第一次向VIP发送数据请求时,由于此前CIP并不知道VIP是由哪一台主机提供。因此CIP就需要向网段内所有主机发送寻找VIP的ARP广播。但是在该网段内有三台主机都配有VIP地址,并且这三个VIP所配的地址必须为同一个IP地址。可以想象的到,如果这三台主机都来回应CIP的ARP广播,那么CIP就会很困惑?究竟谁是VIP呢?
     为了避免出现这种情况的出现,可以对后台的RealServer主机的VIP进行隐藏。只让Director的VIP来响应CIP的ARP请求。
clip_image002
     那么如何来隐藏RealServer上的VIP呢?首先要来了解两个参数:arp_announce arp_ignore
arp_announce : INTEGER
     对网络接口上本地IP地址发出的ARP回应作出相应级别的限制.默认为0
    确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0   (默认) 在任意网络接口上的任何本地地址
1   尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
 
2  对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送
all/ 和{interface}/ 下两者同时比较,取较大一个值生效.
提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息
 
arp_ignore : INTEGER
   定义对目标地址为本地IP的ARP询问不同的应答模式 .默认为0
0  (默认值):回应任何网络接口上对任何本地IP地址的arp查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对10.1.1.1 的arp查询也会回应--而原本这个请求该是出现在eth1上,也该有eth1回应的).
 
1 只回答目标IP地址是来访网络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应).
 
2  只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到来自10.1.1.2这样地址发起的对192.168.0.1的查询不会回答,而对192.168.0.2发起的对192.168.0.1的arp查询会回应).
 
3  不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied ).
4-7  保留未使用.
8  不回应所有(本地地址)的arp查询.
all/ 和{interface}/ 下两者同时比较,取较大一个值生效.
 
 
临时修改arp_announce和arp_ignore:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
 
永久修改:
vim /etc/sysctl.conf
找到下面两行,修改其值为1或者2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2

0 0
原创粉丝点击