首页 > 代码库 > lvs的nat模式和dr模式

lvs的nat模式和dr模式

一.lvs的nat模式:

web端:192.168.3.124      通过访问nginx的反向代理192.168.8.123:80,传送到后端realserver上。

lvs端eth0: dip 192.168.3.123      eth0:0  vip 192.168.8.123    

realserver1端eth0:192.168.3.128  echo "hello,192.168.3.128" > 1.html

realserver2端eth0:192.168.3.129  echo "hello,192.168.3.129" > 1.html



在lvs端操作:

ipvsadm -A -t 192.168.8.123:80 -s wrr

ipvsadm -a -t 192.168.8.123:80 -r 192.168.3.128:80 -m -w 2

ipvsadm -a -t 192.168.8.123:80 -r 192.168.3.129:80 -m -w 2

采用加权轮询的算法,但权重默认都为2。

问题来了:

在lvs服务上curl 192.168.8.123/1.html可以正常轮询访问,但是在192.168.3.124的就不可以,提示“curl: (7) couldn‘t connect to host”,而且telnet 192.168.8.123也不通

解决方法:

将realserver的网关指向vip 192.168.8.123,vip和realserver的ip是不是同一网段都可以的,只需要改realserver的网关即可。

注:若realserver网关指向vip后导致无法上网,我们需要在网卡上新建子ip,并将这些子ip加到lvs中,且需要配置单独的路由策略,用于lvs包转发。


二.lvs的dr模式:

web端:192.168.3.124      通过访问nginx的反向代理192.168.8.123:80,传送到后端realserver上。

lvs端eth0: dip 192.168.3.123      eth0:0  vip 192.168.8.123  

realserver1端eth0:192.168.3.128  eth0:0  vip 192.168.8.128echo "hello,192.168.3.128" > 1.html

realserver2端eth0:192.168.3.129  eth0:0  vip 192.168.8.129echo "hello,192.168.3.129" > 1.html


在lvs端操作:

ipvsadm -A -t 192.168.8.123:80 -s wrr

ipvsadm -a -t 192.168.8.123:80 -r 192.168.8.128:80 -g -w 2

ipvsadm -a -t 192.168.8.123:80 -r 192.168.8.129:80 -g -w 2


在两台realserver上操作:

ifconfig lo:0 192.168.8.123 netmask 255.255.255.255

echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p


问题:

lvs的vip 80端口无法访问,ipvsadm -L -n -c 都处于SYN_RECV 状态,但是vip rip 都能访问

解决方案:

检查realserver端的路由

[root@usvr-128 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.8.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.3.1     0.0.0.0         UG    0      0        0 eth0

从上面可以看到,目的网段192.168.8.0 走的接口是eth0(这是系统根据设置的ip自动添加的路由) ,而我们将vip绑定在lo:0上,因此不会发送给vip,我们需要更改路由:

ip route add 192.168.8.123/32 dev lo:0

[root@usvr-128 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.8.123   0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.8.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.3.1     0.0.0.0         UG    0      0        0 eth0

好了,更改完路由后就通了


注:1.因为dr模式的原理是lvs调度器修改mac地址为真是服务器地址,报文的目的ip还是vip,网卡只会把目的mac和目的ip都是自己的报文上送到cpu;要让realserver处理目的ip和目的mac都为自己的报文,因此需要将realserver的lo上绑定vip。

2.网卡重启和服务器重启后,lo上绑定的vip会失效。



lvs的nat模式和dr模式