fullnat模式原理图:
FULLNAT模式原理:
1、client主机(cip)将请求发往前端的负载均衡器(vip),请求报文源地址是CIP,目标地址为VIP。负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
2、RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给client主机(cip)。
fullnat模式优缺点:
FULLNAT一个最大的问题是:RealServer无法获得用户IP;为了解决这个问题我们提出了TOA的概念,主要原理是:将clientaddress放到了TCP Option里面带给后端RealServer,RealServer上通过toa内核模块hack了getname函数,给用户态返回TCP Option中的client ip。
一、内核编译 (FULLNAT模式要重编LVS机器内核)
需要准备的安装包:
kernel-2.6.32-220.23.1.el6.src.rpm
asciidoc-8.4.5-4.1.el6.noarch.rpm
newt-devel-0.52.11-3.el6.x86_64.rpm
slang-devel-2.2.1-1.el6.x86_64.rpm Lvs-fullnat-synproxy.tar.gz
Lvs-fullnat-synproxy.tar.gz
1.给server2添加内存为2048,df 查看 编译内核是会读大量文件,同时往硬盘里写入信息,所以要有足够的空间,否则编译的速度会非常慢
2.下载两个安装包
kernel-2.6.32-220.23.1.e16.src.rpm Lvs-fullnat-synproxy.tar.gz
3.安装kernel*出现rembuild
rpm -ivh kernel-2.6.32-220.23.1.e16.src.rp
4.进入目录编译,出错存在软件依赖包
cd rpmbuild
ls
cd /SPECS
ls
安装rpm -build工具:yum install rpm-build -y
rpmbuild -bp kernel.spec
5.安装依赖包
6.安装下面包
yum install -y asciidoc-8.4.5-4.1.el6.noarch.rpm newt-devel-0.52.11-3.el6.x86_64.rpm slang-devel-2.2.1-1.el6.x86_64.rpm
注意:出现此错误是因为没有安装gcc编译器和redhat-rpm-config
解决办法: yum install -y gcc redhat-rpm-config
7.进入目录编译
8.在这里会停下,需要在开一个终端,产生随机数才会继续,复制server2上面的rngdr /dev/urandom,编译结束
yum provides */rngd ##yum provides用来查询这个命令有哪个包提供
yum install -y rng-tools
rngd -r /dev/urandom ##用这个命令产生随机数
此时回到编译的终端发现编译完成了
9.解压软件,复制文件到指定目录,打补丁
cd
tar zxf Lvs-fullnat-synproxy.tar.gz ls
cd lvs-fullnat-synproxy/ ls
cp lvs-2.6.32-220.23.1.el6.patch ../rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
cd ~/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
patch -p1 < lvs-2.6.32-220.23.1.el6.patch
10.扩展版本,写入你需要编译的版本
cd ~/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
vim Makefile
11.make ##编译
make modules_install ##导入安装模块
make install ##安装的是引导文件,在/boot目录下就有你所编译的内核文件vmlinuz-2.6.32-220.23.1.el6
12.查看/boot/有编译好的文件,改变grub中default=0,reboot,开机查看uname -r
vim /boot/grub/grub.conf
default=0 ##因为编译好的内核文件就加在原有版本的上面,因此default要改成0,开机时才会进入所编译的内核版本
title Red Hat Enterprise Linux Server (2.6.32-220.23.1.el6) ##所编译的版本
title Red Hat Enterprise Linux (2.6.32-431.el6.x86_64) ##原有的系统内核版本
uname -r ##查看当前系统启动内核版本
reboot
uname -r
二、编译keepalived
cd lvs-fullnat-synproxy/ ls
tar zxf lvs-tools.tar.gz
ls ##发现多出一个tools目录
cd tools/
cd keepalived/
ls
./configure --with-kernel-dir="/lib/modules/`uname -r`/build"(注意:uname -r 用反引号括起来)
出现以上错误时:yum -y install openssl-devel
安装依赖:
yum install popt-devel -y
安装完成所需组件和工具后
./configure --with-kernel-dir="/lib/modules/`uname -r`/build"
安装编译:
make
make install
三.编译ipvsadm
cd
cd lvs-fullnat-synproxy/tools/ipvsadm/
ls
make
make install
/etc/init.d/ipvsadm status
ipvsadm -l
size = 2 的 22 次方 = 4190304
ipvsadm --help fullnat参数出现时则说明fullnat环境搭建好了
################fullnat环境配置完成###################
1. 在server2端(ip为172.25.45.1)新增一个网卡eth1,给eth1添加一个和eth0不在同一网段的ip地址:ip addr add 172.25.254.100 dev eth1
2. 在server1(ip为172.25.45.1)和server3(ip为172.25.45.3)端,设定网关为server2的ip:route add default gw 172.25.45.2 。之后开启server1和server3的http服务,作为RS。
3.添加策略
server2(调度器VS)
ipvsadm -A -t 172.25.45.100:80 -s rr
ipvsadm -a -t 172.25.45.100:80 -r 172.25.45.1:80 -b
ipvsadm -a -t 172.25.45.100:80 -r 172.25.45.3:80 -b
测试(物理机):curl 172.25.254.100
由于使用的是社区版本的fullnat,所以测试不出来。