1、Tunnel 模式基础知识
IP隧道(IP tunneling)IP隧道技术亦称为IP封装技术(IP encapsulation),是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP 隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址
数据流向客户端请求 VIP 时,通过因特网到达调度器,调度器收到数据包后进行封
装,即在原有的包头加上 IP Tunnel 的包头,然后通过调度算法发送给真实服务器,真实服务器再进行拆包,并且与调度器达成协议,从而对请求做出响应,直接由公网达到客户端,此时的源 IP 是 VIP,原理同 DR 模式。
优点:相对 NET 模式来说,可以支持更大的访问量
缺点:需要隧道协议
2、实验环境
主机名 | IP |
---|---|
server1 | 172.25.60.1 |
server2 | 172.25.60.2 |
server3 | 172.25.60.3 |
3、tun模式lvs配置
- server1
- 添加隧道,并添加对外暴露的VIP,激活隧道
[root@server1 yum.repos.d]# modprobe ipip ##加载模块
[root@server1 yum.repos.d]# ip addr del 172.25.60.100/24 dev eth0 ##删除上一个实验绑定的VIP
[root@server1 yum.repos.d]# ip addr add 172.25.60.100/24 dev tunl0 ##添加VIP
[root@server1 yum.repos.d]# ip link set up tunl0 ##激活隧道
- 清除之前的策略后,重新配置
[root@server1 yum.repos.d]# ipvsadm -C ##清除ipvsadm策略
[root@server1 yum.repos.d]# ipvsadm -A -t 172.25.60.100:80 -s rr
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.60.100:80 -r 172.25.60.2:80 -i ##-i代表的是tun模式
[root@server1 yum.repos.d]# ipvsadm -a -t 172.25.60.100:80 -r 172.25.60.3:80 -i
[root@server1 yum.repos.d]# /etc/init.d/ipvsadm save ##保存策略
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@server1 yum.repos.d]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.60.100:80 -s rr
-a -t 172.25.60.100:80 -r 172.25.60.2:80 -i -w 1
-a -t 172.25.60.100:80 -r 172.25.60.3:80 -i -w 1
- server2和server3
- 导入模式,并添加对外暴露的VIP,并激活
[root@server2 ~]# ip addr del 172.25.60.100/32 dev eth0
[root@server2 ~]# ip addr add 172.25.60.100/32 dev tunl0
[root@server2 ~]# ip link set up tunl0
-
修改rp_filter参数
反向过滤规则:反向过滤规则:要一致,才可以 sysctl -a | grep rp_filter都改成=0
因为:rp_filter参数用于控制系统是否开启对数据包源地址的校验。有三个值,0、1、2,具体含义: -
0:不开启源地址校验。
-
1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
-
2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
查看
[root@server2 ~]# sysctl -a | grep rp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 1
net.ipv4.conf.tunl0.arp_filter = 0
修改
[root@server2 ~]# sysctl -w net.ipv4.conf.lo.rp_filter=0
net.ipv4.conf.lo.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@server2 ~]# vim /etc/sysctl.conf
重新加载
[root@server2 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
再次查看,修改完成
[root@server2 ~]# sysctl -a | grep rp_filter
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth0.arp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.tunl0.arp_filter = 0
- 测试