TUN 是IP Tunneling ,IP隧道的简称,它将调度器收到的IP数据包封装在一个新的IP数据包中,转交给应用服务器,然后实际服务器的返回数据会直接返回给用户。
[root@server1 ~]# modprobe ipip #添加tunl0隧道模式
[root@server1 ~]# ip addr add 172.25.68.100/24 dev tunl0 #添加VIP
[root@server1 ~]# ip link set up tunl0 #激活tunl0隧道
[root@server1 ~]# ipvsadm -C
[root@server1 ~]# ipvsadm -A -t 172.25.68.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.68.100:80 -r 172.25.68.2:80 -i
[root@server1 ~]# ipvsadm -a -t 172.25.68.100:80 -r 172.25.68.3:80 -i
[root@server1 ~]# ipvsadm -l
[root@server1 ~]# route add -host 172.25.68.100 dev tunl0
#数据包原路返回
server2主机(RS1)
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 ~]# modprobe ipip
[root@server2 ~]# ip link set up tunl0
[root@server2 ~]# /etc/init.d/arptables_jf start
[root@server2 ~]# arptables -A IN -d 172.25.68.100 -j DROP
[root@server2 ~]# arptables -nL
Server3主机(RS2)
配置同server2主机一致
物理主机:
[root@foundation68 ~]# arp -an |grep 100 #查看mac地址是否与server1相同
[root@foundation68 ~]# arp -d 172.25.68.100 #删除mac地址
[root@foundation68 ~]# ping 172.25.68.100
[root@foundation68 ~]# curl 172.25.68.100
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
给server1加一个网卡:
[root@foundation68 ~]# virt-manager
[root@server1 ~]# ip addr add 172.25.0.112/24 dev eth2
[root@server1 ~]# ip link set up eth2
[root@server1 ~]# ip addr
[root@server1 ~]# ipvsadm -C
[root@server1 ~]# ipvsadm -A -t 172.25.0.112:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.0.112:80 -r 172.25.68.3:80 -m
[root@server1 ~]# ipvsadm -a -t 172.25.0.112:80 -r 172.25.68.2:80 -m
[root@server1 ~]# ipvsadm -ln
[root@server1 ~]# modprobe iptable_nat #加载 nat 模块
[root@server1 ~]# vim /etc/sysctl.conf #开启路由机制
[root@server1 ~]# sysctl -a | grep ip_forward
[root@server2 ~]# /etc/init.d/httpd start #要打开httpd服务
[root@server2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@server2 ~]# /etc/init.d/network restart
[root@server2 ~]# route -v
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
1、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。
2、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。
Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。
Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下:
在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。
内网 IP 之间可以通过多个交换机跨 VLAN 通信。
当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。
LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。
Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。
物理主机:
[root@foundation68 ~]# systemctl start httpd
[root@foundation68 ~]# scp /home/kiosk/Desktop/kernel-2.6.32-220.23.1.el6.src.rpm [email protected]:/root
[root@foundation68 ~]# scp /home/kiosk/Desktop/Lvs-fullnat-synproxy.tar.gz [email protected]:/root
[root@foundation68 ~]# scp /home/kiosk/Desktop/newt-devel-0.52.11-3.el6.x86_64.rpm [email protected]:/root
[root@foundation68 ~]# scp /home/kiosk/Desktop/asciidoc-8.4.5-4.1.el6.noarch.rpm [email protected]:/root
[root@foundation68 ~]# scp /home/kiosk/Desktop/slang-devel-2.2.1-1.el6.x86_64.rpm [email protected]:/root
更改server1主机内存:
将server1 Force off
更改内存为2048
[root@server1 ~]# yum install -y rpm-build
[root@server1 ~]# rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm
[root@server1 ~]# cd rpmbuild/
[root@server1 rpmbuild]# ls
SOURCES SPECS
[root@server1 rpmbuild]# cd SPECS/
[root@server1 SPECS]# ls
kernel.spec
[root@server1 SPECS]# rpmbuild -bp kernel.spec 欲编译环境
[root@server1 SPECS]# yum install -y redhat-rpm-config xmlto asciidoc elfutils-libelf-devel binutils-devel newt-devel python-devel hmaccalc perl-ExtUtils-Embed
[root@server1 SPECS]# cd
[root@server1 ~]# 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
[root@server1 ~]# cd rpmbuild/
[root@server1 rpmbuild]# ls
[root@server1 rpmbuild]# cd SPECS/
[root@server1 SPECS]# ls
[root@server1 SPECS]# rpmbuild -bp kernel.spec
[root@server1 SPECS]# yum install -y patchutils
[root@server1 SPECS]# rpmbuild -bp kernel.spec 编译后会卡住
[root@server1 ~]# yum provides */rngd
[root@server1 ~]# yum install -y rng-tools-2-13.el6_2.x86_64
[root@server1 ~]# rngd -r /dev/urandom #可以让欲编译环境快速安装
[root@server1 ~]# tar zxf Lvs-fullnat-synproxy.tar.gz
[root@server1 ~]# cd rpmbuild/
[root@server1 rpmbuild]# ls
[root@server1 rpmbuild]# cd BUILD
[root@server1 BUILD]# ls
[root@server1 BUILD]# cd kernel-2.6.32-220.23.1.el6/
[root@server1 kernel-2.6.32-220.23.1.el6]# ls
[root@server1 kernel-2.6.32-220.23.1.el6]# cd linux-2.6.32-220.23.1.el6.x86_64/
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# vim Makefile #给内核版本命名
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# uname -r
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# cp /root/lvs-fullnat-synproxy/lvs-2.6.32-220.23.1.el6.patch .
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# patch -p1 < lvs-2.6.32-220.23.1.el6.patch
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# make #开始编译
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# make modules_install
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# make install
[root@server1 linux-2.6.32-220.23.1.el6.x86_64]# cd /boot/
[root@server1 boot]# ls
[root@server1 boot]# cd grub/
[root@server1 grub]# ls
[root@server1 grub]# vim grub.conf
#修改default的值为0 表示先启动
[root@server1 grub]# reboot #重启(查看是否编译成功)
[kiosk@foundation40 ~]$ ssh root@172.25.40.1
[root@server1 ~]# uname -r
[root@server1 ~]# cd lvs-fullnat-synproxy/
[root@server1 lvs-fullnat-synproxy]# tar zxf lvs-tools.tar.gz
[root@server1 lvs-fullnat-synproxy]# ls
[root@server1 lvs-fullnat-synproxy]# cd tools/
[root@server1 tools]# cd keepalived/
[root@server1 keepalived]# yum install -y popt-devel #解决依赖性
[root@server1 keepalived]# ./configure --with-kernel-dir="/lib/modules/`uname -r`/build" #编译第一步
[root@server1 keepalived]# make
[root@server1 keepalived]# make install
[root@server1 keepalived]# cd /usr/local/
[root@server1 local]# cd sbin/
[root@server1 sbin]# ls
[root@server1 sbin]# cd
[root@server1 ~]# cd lvs-fullnat-synproxy/
[root@server1 lvs-fullnat-synproxy]# ls
[root@server1 lvs-fullnat-synproxy]# cd tools/
[root@server1 tools]# cd ipvsadm/
[root@server1 ipvsadm]# ls
[root@server1 ipvsadm]# make
[root@server1 ipvsadm]# make install
[root@server1 ipvsadm]# cd
[root@server1 ~]# ipvsadm -l
添加策略:
和NAT模式一样需要添加一个网卡,设定虚拟IP要和真机在同一个网段上
[root@server1 ipvsadm]# ipvsadm -C
[root@server1 ipvsadm]# ipvsadm -A -t 172.25.0.112:80 -s rr
[root@server1 ipvsadm]# ipvsadm -a -t 172.25.0.112:80 -r 172.25.68.2:80 -b
[root@server1 ipvsadm]# ipvsadm -a -t 172.25.0.112:80 -r 172.25.68.3:80 -b
[root@server1 ipvsadm]# ipvsadm -P -t 172.25.0.112:80 -z 127.0.0.1:80
[root@server1 ipvsadm]# ipvsadm -G -t 172.25.0.112:80
[root@server1 ipvsadm]# ipvsadm -ln