LVS的DR模型


本次实例拓扑:

wKiom1Mhij3itNLKAACNvCHdMhY831.jpg



在DR模型的实现中,director和服务器必须在同一个物理网段或子网中,且不能在中间有其他的转发设备,并且因为要实现直接回应请求,所以通常real server的ip也是合法的ip,director将转发所有的请求到群集的节点去,有两个需要解决的关键问题,第一,处于平行地位的客户端和服务器vip都是相同的(客户端请求后回应的数据包必须源ip是一致的),那么在客户端请求到来时,该最终把数据包发给谁 第二,就算数据到达directe,而directe又是如何分配给后台的real server的


对于问题一的解决我们可以在后方的real server上设置ARP屏蔽(ARPiptables),当然还有另外两种的解决方案,启用内核模块中处理tcp/ip数据包中的ARP-ignore ARP-announce 其中ARP-announce状态1是默认的,表示使用任意的本地地址,配置在任意接口上的 状态2表示试图避免本地地址


arp_announce相当于定义对于本地网络接口(指多个地址的情况下)ARP请求的回应优先级,0表示只要有就回应(不管是不是针对该接口地址),1表示尽量避免回应非本网段的,2表示最合适的本地地址用于回应




在direct设备上,我们将eth2的192.168.2.1作为物理地址,eth2:0逻辑接口的192.168.2.2作为VIP地址


direct设备上的eth0网卡配置

wKioL1MhikKAQLyMAABgiTGLeKk697.jpg

lo:0接口的配置,在此要注意它的掩码长度,必须为32长

wKiom1MhgdvSJKZRAABm82VmAIE257.jpg


direct设备上的具体配置:

[root@localhost ~]# mount /dev/cdrom /media/cdrom

mount: block device /dev/sr0 is write-protected, mounting read-only

[root@localhost ~]# yum --disablerepo=\* --enablerepo=c6-media install ipvsadm

[root@localhost ~]# ipvsadm -l

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@localhost ~]# ipvsadm -A -t 192.168.2.1:80 -s rr

[root@localhost ~]# ipvsadm -a -t 192.168.2.1:80 -r 192.168.2.7:80 -g

[root@localhost ~]# ipvsadm -a -t 192.168.2.1:80 -r 192.168.2.8:80 -g

[root@localhost ~]# ipvsadm -l

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.2.1:http rr

 -> 192.168.2.7:http             Route   1      0          0        

 -> 192.168.2.8:http             Route   1      0          0

[root@localhost ~]# service ipvsadm save

ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]



使用DR时后方的real server是不能做端口重定向的

[root@localhost ~]# vim /etc/sysctl.conf

wKiom1MhgdWRtjFTAAAlHaoDX1o507.jpg


[root@localhost ~]# sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_synCOOKIEs = 1

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

error: "net.bridge.bridge-nf-call-iptables" is an unknown key

error: "net.bridge.bridge-nf-call-arptables" is an unknown key

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 4294967295

kernel.shmall = 268435456

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1


wKiom1MhgdjBbjM4AABvkxvM4RQ726.jpg

wKiom1MhgdqjuQAMAAAOx7vMVkc350.jpg

web1的网卡配置


wKioL1MhgbSiKjfrAABYupQMJgM858.jpg

web服务器的lo:0虚拟接口,用于接收direct传来的信息

wKiom1MhgdvSJKZRAABm82VmAIE257.jpg

direct上的网卡eth0网卡配置


wKioL1MiiaeRhB6mAABgiTGLeKk745.jpg

同样的要配置lo:0接口

wKiom1MhgdvSJKZRAABm82VmAIE257.jpg

web2的网卡配置信息,也需要同样的lo:0配置


wKioL1MiiaeyGXr8AABhmvmEsOA019.jpg

在虚拟机的实验环境下注意可以将他们都设为仅主机模式,但必须要保证他们之间的通信,如图

wKioL1MhgbbQo8xjAAEXvgDfeME634.jpg

direct上的ipvsadm配置步骤


wKiom1Mhgd3TtIW7AACCWP9O3eQ147.jpg


wKioL1MhgbfgIAjYAAArgF86F_0027.jpg

wKiom1Mhgd6AvhIjAABXMpdv4_g014.jpg


打开浏览器进行测试,注意关闭web及direct的selinux和防火墙设置

wKioL1MhgbfQwithAAAsA73VdzE408.jpg


wKiom1Mhgd7zpWIyAAAnHUcwItg423.jpg

配置后参数

[root@localhost ~]# sysctl -p

net.ipv4.ip_forward = 1

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_synCOOKIEs = 1

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

error: "net.bridge.bridge-nf-call-iptables" is an unknown key

error: "net.bridge.bridge-nf-call-arptables" is an unknown key

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 4294967295

kernel.shmall = 268435456

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1



在使用DR时后方的real server的VIP配置,不能在eth0网卡上,因为一旦屏蔽,不仅VIP被屏蔽,rip也会被屏蔽掉,所以我们可以把VIP的地址配置在lo接口的别名接口(lo:0)上


arp_announce : INTEGER

默认为0

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

确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

0 - (默认) 在任意网络接口上的任何本地地址

1 -尽量避免不在该网络接口子网段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.

如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送

all/ 和{interface}/ 下两者同时比较,取较大一个值生效.

提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息(关于arp代理这一段我普遍翻译地不好,去啃一下tcp/ip bible的卷一,然后再翻译吧)

arp_ignore : INTEGER

默认为0

定义对目标地址为本地IP的ARP询问不同的应答模式

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}/ 下两者同时比较,取较大一个值生效.