负载均衡集群的试验中,需要对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请求。
那么如何来隐藏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