VS/TUN模式配置详解
VS/TUN隧道模式(原理就是将传输报头加一个IP进行封装),DR和NAT模式都不能跨网络,IP隧道可以,但是弊端是:IP报文进行传递时不能跨过MTU传输单元
原理部分请看作者博文
https://blog.youkuaiyun.com/zhaoliang_Guo/article/details/96862679
准备工作*
准备三个rhel7.3虚拟机,设置ip和hostname如下,并搭建好yum源
IP|hostname
—|---
172.25.13.1 |server1
172.25.13.2| server2
172.25.13.3| server3
server1作为调度器,server2和server3作为RS
1> modprobe ipip(三台虚拟机都需要)
在DS server1
[root@server1 ~]# ipvsadm -C ##清除ipvsadm的策略
1.安装后会有tunl网卡,删掉eth0的vip(如果跟着作者作了DR模式)
[root@server1 ~]# ip addr del 172.25.13.100/24 dev eth0
[root@server1 ~]# ip addr add 172.25.13.100/24 dev tunl0 ##添加给tunl0网卡
然后激活tunl0网卡
[root@server1 ~]# ip link set up tunl0
编写ipvsadm策略
如果作了DR模式的话需要
ipvsadm -C ###刷掉已经存在的策略
有就删掉,没有就不需要
[root@server1 ~]# ipvsadm -A -t 172.25.13.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.13.100:80 -r 172.25.13.2:80 -i
[root@server1 ~]# ipvsadm -a -t 172.25.13.100:80 -r 172.25.13.3:80 -i
[root@server1 ~]# systemctl restart ipvsadm.service
[root@server1 ~]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.13.100:80 -s rr
-a -t 172.25.13.100:80 -r 172.25.13.2:80 -i -w 1
-a -t 172.25.13.100:80 -r 172.25.13.3:80 -i -w 1
在server2和server3删除之前有的vip,添加tunl网卡ip(两个是一样的操作)
激活tunl网卡
[root@server2 ~]# ip addr del 172.25.13.100/24 dev eth0
[root@server2 ~]# ip addr add 172.25.13.100/24 dev tunl0
[root@server2 ~]# ip link set up tunl0
关掉反向过滤规则
(反向过滤规则:系统在接收到一个IP包后,检查该IP是否符合要求,不符合要求的包会被丢弃,简单来说这个要求就是源地址的出接口并不是收到报文的入接口,就丢弃)
关掉反向过滤规则操作
[root@server2 ~]# 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@server2 ~]# sysctl -w net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
[root@server2 ~]# sysctl -w net.ipv4.conf.default.rp_filter=0net.ipv4.conf.default.rp_filter = 0
[root@server2 ~]# sysctl -w net.ipv4.conf.eth0.rp_filter=0
net.ipv4.conf.eth0.rp_filter = 0
[root@server2 ~]# sysctl -w net.ipv4.conf.tunl0.rp_filter=0
net.ipv4.conf.tunl0.rp_filter = 0
[root@server3 conf.d]# sysctl -p ##使修改生效
上面的策略有三个值,0、1、2,具体含义:
0:不开启源地址校验。
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
这样做好后仍然存在问题
因为DS和RS都有一个一样的ip,有可能client,直接访问到了rs,这是我们不想看到的
因为这样的话可能会受到DDOS攻击,也没有起到负载均衡的作用
所以我们的RS需要arptables来防止,如果RS上接受到访问vip的请求就拒绝掉
这样访问vip时只能有DS接受,可以通过vip来调度RS
RS数据返回时,不会回包,直接返回给client,但返回时它的ip需要是vip所以需要转换一下
操作:
在server2和server3上安装arptables
yum install -y arptables.x86_64
安装好后,编写策略
[root@server2 ~]# arptables -A INPUT -d 172.25.254.100 -j DROP
[root@server2 ~]# arptables -A OUTPUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2
编写好后还需要将策略导入文件
[root@server2 ~]# arptables-save > /etc/sysconfig/arptables
[root@server2 ~]# cat /etc/sysconfig/arptables
*filter
:INPUT ACCEPT
:OUTPUT ACCEPT
:FORWARD ACCEPT
-A INPUT -j DROP -d 172.25.13.100
-A OUTPUT -j mangle -s 172.25.0.100 --mangle-ip-s 172.25.13.2
在客户端测试:
[root@foundation13 ~]# curl 172.25.13.100
www.gzl.com
[root@foundation13 ~]# curl 172.25.13.100
bbs.gzl.com
[root@foundation13 ~]# curl 172.25.13.100
www.gzl.com
[root@foundation13 ~]# curl 172.25.13.100
bbs.gzl.com