LVS的DR模型
本次实例拓扑:
在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网卡配置
lo:0接口的配置,在此要注意它的掩码长度,必须为32长
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
[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
web1的网卡配置
web服务器的lo:0虚拟接口,用于接收direct传来的信息
direct上的网卡eth0网卡配置
同样的要配置lo:0接口
web2的网卡配置信息,也需要同样的lo:0配置
在虚拟机的实验环境下注意可以将他们都设为仅主机模式,但必须要保证他们之间的通信,如图
direct上的ipvsadm配置步骤
打开浏览器进行测试,注意关闭web及direct的selinux和防火墙设置
配置后参数
[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}/ 下两者同时比较,取较大一个值生效.