VS/NAT的原理为:通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程.报文头(目标地址、源地址和端口等)被正确改写后, 客户相信它们连接一个IP地址,而不同IP地址的服务器组也认为它们是与客户直接相连的。由此,可以用 NAT方法将不同IP地址的并行网络服务变成在一个IP 地址上的一个虚拟服务.
下面就来实际配置一遍:

LVS之VS/NAT实验_nat



如上图所示:
Node1为负载均衡器,有两个网卡,eth0:192.168.2.6和eth1:192.168.56.7;
Node2为其中一个Realserver,有一块网卡,eth0:192.168.2.3;
Node3为其中另一个Realserver,有一块网卡,eth0:192.168.2.4.

并且互相都能ping通.

首先由于Centos5.4使用的是linux2.6以上的内核,已经支持了lvs,可以通过以下的命令来查看是否支持:

[root@node1 ~]# modprobe -l | grep ipvs
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
#可以看到该内核已经支持ipvs模块了

1,按照lvs所需要的管理软件ipvsadm

此管理软件只需要在负载均衡器这台机器上安装,在本例中即:node1

[root@node1 ~]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
[root@node1 ~]# tar zxvf ipvsadm-1.24.tar.gz
[root@node1 ~]# cd ipvsadm-1.24
[root@node1 ipvsadm-1.24]# make all

结果出现了下面一堆错误:

make -C libipvs
make[1]: Entering directory `/root/ipvsadm-1.24/libipvs'
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -I/usr/src/linux/include  -DHAVE_NET_IP_VS_H -c -o libipvs.o libipvs.c
In file included from libipvs.c:23:
libipvs.h:14:23: error: net/ip_vs.h: No such file or directory
In file included from libipvs.c:23:
libipvs.h:119: error: expected ‘)’ before ‘fwmark’
libipvs.c:27: error: field ‘svc’ has incomplete type
libipvs.c:28: error: field ‘dest’ has incomplete type
libipvs.c: In function ‘ipvs_init’:
libipvs.c:40: error: invalid application of ‘sizeof’ to incomplete type ‘struct ip_vs_getinfo’
.....
.....
.....
libipvs.c: In function ‘ipvs_get_daemon’:
libipvs.c:309: error: dereferencing pointer to incomplete type
libipvs.c:315: error: ‘IP_VS_SO_GET_DAEMON’ undeclared (first use in this function)
libipvs.c: In function ‘ipvs_strerror’:
libipvs.c:357: error: ‘ipvs_get_service’ undeclared (first use in this function)
make[1]: *** [libipvs.o] Error 1
make[1]: Leaving directory `/root/ipvsadm-1.24/libipvs'
make: *** [libs] Error 2

google得知是因为找不到内核的ipvs库文件,因为我还没有将内核库文件做连结:

[root@node1 ipvsadm-1.24]# uname -r
2.6.18-164.el5 #内核版本号
[root@node1 ipvsadm-1.24]# ln -s /usr/src/kernels/2.6.18-164.el5-i686 /usr/src/linux #做个默认的连接

然后执行:

[root@node1 ipvsadm-1.24]# make all
[root@node1 ipvsadm-1.24]# make install
[root@node1 ipvsadm-1.24]# ipvsadm --version
ipvsadm v1.24 2005/12/10 (compiled with popt and IPVS v1.2.1)
#查看ipvsadm版本号即可知道安装成功了

2, 配置 LVS

在node1上,启用路由转发功能:

#vim /etc/rc.local
[root@node1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
#source /etc/rc.local

清除 ipvsadm 表:

[root@node1 ~]# ipvsadm -C

使用 ipvsadm 安装 LVS 服务:

[root@node1 ~]# /sbin/ipvsadm -A -t 192.168.56.7:80 -s rr
#这样就添加了负载均衡器,可以通过下面的命令来查看ipvsadm的状态:
[root@node1 ~]# /sbin/ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.56.7:80 rr

增加第一台 realserver(node2):

[root@node1 ~]# /sbin/ipvsadm -a -t 192.168.56.7:80 -r 192.168.2.3:80 -m -w 1

增加第二台 realserver(node3):

[root@node1 ~]# /sbin/ipvsadm -a -t 192.168.56.7:80 -r 192.168.2.4:80 -m -w 1

上面的-A代表添加一个负载均衡器,-a表示往该负载均衡器上添加Realserver, -t代表tcp协议, -r代表Realserver,-m代表使用MASQUERADE(地址伪装即NAT),-w权重
这样lvs的负载均衡器的配置就结束了.

3,配置Realserver

在Realserver上面不需要做什么配置,只需要配置路由,保证能和外网联通,还有就是要把realserver的网关设置为负载均衡器的ip就可以了.

在浏览器里访问http://192.168.56.7,请求会平均的被分发到两台Realserver上面了.

测试的时候注意 “可恶” 的iptables:

[root@node1 ~]# iptables -F
[root@node1 ~]# iptables -X
[root@node1 ~]# iptables -Z