隧道模式
client ->vs->Rs->cllient
原理和特点:
原理说明:
1、 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP 。
2、 PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
3、IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。此时源IP为DIP,目标IP为RIP
4、 POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP为DIP,目标IP为RIP
5、RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。此时的源IP地址为VIP,目标IP为CIP
6、 响应报文最终送达至客户端
LVS-Tun模型特性
- RIP、VIP、DIP全是公网地址
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
不支持端口映射 - RS的系统必须支持隧道
LVS(隧道模式tun) 模式搭建
注意:在实际生产中 RIP、VIP、DIP全是公网地址,目前由于条件限制,为了实现实验效果。实验中RIP、VIP、DIP 、CIP全部为同一个网段的ip。
以下实验时在7.3主机上进行
主机内核必须支持隧道模式才可以使用该方式。
TUNM模式 LVS的配置:
server1 server2、server3:添加隧道、隧道添加对外暴露的VIP 、隧道激活
[root@server1 ~]# modprobe ipip #加载模块
[root@server1 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:d9:67:4d brd ff:ff:ff:ff:ff:ff
inet 172.25.46.1/24 brd 172.25.46.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fed9:674d/64 scope link
valid_lft forever preferred_lft forever
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1 # 加载成功出现tunl0接口
link/ipip 0.0.0.0 brd 0.0.0.0
[root@server1 ~]# ip addr add 172.25.46.150/24 dev tunl0 #添加vip
[root@server1 ~]# ip link set up tunl0 # 激活网络接口
[root@server1 ~]# ip addr show
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0 #此处不是down表示已经激活
inet 172.25.46.150/24 scope global tunl0
valid_lft forever preferred_lft forever
server2:
[root@server2 ~]# modprobe ipip
[root@server2 ~]# ip addr show
[root@server2 ~]# ip addr add 172.25.46.150/24 dev tunl0
[root@server2 ~]# ip link set up tunl0
[root@server2 ~]# ip addr show
server3:
[root@server3 ~]#modprobe ipip
[root@server3 ~]# ip addr show
[root@server3 ~]# ip addr add 172.25.46.150/24 dev tunl0
[root@server3 ~]# ip link set up tunl0
[root@server3 ~]# ip addr show
添加策略:
[root@server1 ~]# yum install -y ipvsadm ##安装ipvsamd 如果之前已经安过可以用ipvsadm -C 清除之前做的策略
[root@server1 ~]# ipvsadm -A -t 172.25.46.150:80 -s rr #添加vip ,对后端服务器采用rr算法
[root@server1 ~]# ipvsadm -a -t 172.25.46.150:80 -r 172.25.46.2:80 -i ##添加后端真实的服务器
[root@server1 ~]# ipvsadm -a -t 172.25.46.150:80 -r 172.25.46.3:80 -i
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1:http rr
-> 172.25.46.2:http Tunnel 1 0 0
-> 172.25.46.3:http Tunnel 1 0 0
server2 、server3 安装httpd服务,并且设置共享页面
为了实验效果明显,不同的真实服务器可以设置不同的共享页面内容。
server2:
[root@server2 ~]#yum install -y httpd
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
index.html
[root@server2 html]# cat index.html
server2
[root@server2 html]# systemctl start httpd
server3:
[root@server3~]#yum install -y httpd
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# ls
index.html
[root@server3 html]# cat index.html
server3
[root@server3 html]# systemctl start httpd
关闭内核的反向过滤功能(所有的真实服务器)
sysctl -a |grep rp_filter # 筛选内核有关过滤功能的参数
server2:
[root@server2 html]# sysctl -a | grep rp_filter ##筛选内核有关过滤功能
[root@server2 html]# sysctl -w net.ipv4.conf.all.rp_filter=0 [root@server2 html]# sysctl -w net.ipv4.conf.default.rp_filter=0 ##将参数1 的都改为0
[root@server2 html]# sysctl -w net.ipv4.conf.eth0.rp_filter=0 [root@server2 html]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
[root@server2 html]# sysctl -a | grep rp_filter
server3:
[root@server3 html]# sysctl -a | grep rp_filter
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.tunl0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 1
[root@server3 html]# sysctl -w net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
[root@server3 html]# sysctl -w net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.rp_filter = 0
[root@server3 html]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.eth0.rp_filter = 0
[root@server3 html]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter = 0
[root@server3 html]# sysctl -a | grep rp_filter
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.tunl0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 0
修改rp_filter参数的目的
有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
测试:
[root@foundation46 ~]# curl 172.25.46.150
server2
[root@foundation46 ~]# curl 172.25.46.150
server3
[root@foundation46 ~]# curl 172.25.46.150
server2
[root@foundation46 ~]# curl 172.25.46.150
server3
[root@foundation46 ~]# curl 172.25.46.150
server2
[root@foundation46 ~]# curl 172.25.46.150
server3
[root@server1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP server1:http rr
-> 172.25.46.2:http Tunnel 1 0 3
-> 172.25.46.3:http Tunnel 1 0 3