linux运维——tun(ip隧道)

原理

在DR模式中是所有服务机共享一个VIP,但是在IP隧道模式中,就相当于主代理机将包经过自己打包之后,将IP转化成公网可传递的IP,并将消息经过自己又一次的打包,发送给真实服务器,真实服务器对这个请求作出响应,这样就达到一个可以跨地区的传输。并且也避免了DR模式中代理机与真实服务机必须在同一局域网的不便。
linux运维——tun(ip隧道)_第1张图片

原理说明:

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

LVS-Tun模型特性

RIP、VIP、DIP全是公网地址
RS的网关不会也不可能指向DIP
所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
不支持端口映射
RS的系统必须支持隧道

LVS(隧道模式tun) 模式搭建

注意:在实际生产中 RIP、VIP、DIP全是公网地址,目前由于条件限制,为了实现实验效果。实验中RIP、VIP、DIP 、CIP全部为同一个网段的ip。

以下实验时在7.3主机上进行

[root@lucky2 ~]# ipvsadm -C 为了保证实验的纯净性,可以先清除一下策略

优点: 可跨局域

代理端:

[root@lucky2 ~]# modprobe ipip      加入ip隧道的命令
[root@lucky2 ~]# ip addr show                 在加入ip隧道之后,出现了一个tunl0的IP设备
1: lo:  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:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:50:95:19 brd ff:ff:ff:ff:ff:ff
    inet 172.25.35.2/24 brd 172.25.35.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 172.25.35.100/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe50:9519/64 scope link 
       valid_lft forever preferred_lft forever
3: tunl0@NONE:  mtu 1480 qdisc noop state DOWN qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0

给这个tunl0加上隧道ip

[root@lucky2 ~]# ip addr add  172.25.35.100/24 dev tunl0
[root@lucky2 ~]# ip link set up tunl0     使这个隧道IP生效
编写策略:
[root@lucky2 ~]# ipvsadm -A -t 172.25.35.100:80 -s rr     输出的数据轮询达到负载均衡的目的
[root@lucky2 ~]# ipvsadm -a -t 172.25.35.100:80 -r 172.25.35.4:80 -i
[root@lucky2 ~]# ipvsadm -a -t 172.25.35.100:80 -r 172.25.35.3:80 -i  当用户访问代理的时候,代理是不知道的,就会访问后端的服务器,在此访问两台达到负载均衡的效果就可以了
[root@lucky2 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  lucky2:http rr
  -> lucky3:http                  Tunnel  1      0          0         
  -> lucky4:http                  Tunnel  1      0          0 
后端服务器集群:

后端服务器集群进行的操作都是一样的:

[root@lucky3 html]# modprobe ipip
[root@lucky3 html]# ip addr add  172.25.35.100/24 dev tunl0				需要确认的是服务器的隧道ip要和代理的隧道ip是相同的,这样能保证跨区域的实现。
[root@lucky3 html]# ip link set up tunl0 			 生效ip ,后端服务器,也确保httpd服务是打开的,用户端检测的时候才能链接上
代理端:

sysctl -a | grep rp_filter 将里面的全换乘等于0,不检验数据包地址,也就是在包裹的一层ip地址。

  • rp_filter参数有三个值,0、1、2,具体含义
    rp_filter参数用于控制系统是否开启对数据包源地址的校验。
  • 0:不开启源地址校验。
  • 1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。
  • 2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

需要注意的一点就是

sysctl -w net.ipv4.conf.all.rp_filter=0     将所有的1 都替换成1的过程中,= 号两侧必须是无间隔的,这样是才会生效的

检测:

[root@foundation35 images]# curl 172.25.35.100
lucky4
[root@foundation35 images]# curl 172.25.35.100
lucky3
[root@foundation35 images]# curl 172.25.35.100
lucky4
[root@foundation35 images]# curl 172.25.35.100
lucky3
[root@foundation35 images]# curl 172.25.35.100

你可能感兴趣的:(linux运维——tun(ip隧道))