前端路由器将目标 IP 为 VIP 时的请求报文,发往DS,需要在前端网关做静态绑定,RS上使用 arptables,并且在RS上修改内核参数以限制 arp 通告及应答级别;
修改 RS 上内核参数(arp_ignore和arp_announce)将 RS 上的 VIP 配置在 lo 接口的别名上,并限制其不能响应对 VIP 地址解析请求;
RS 的 RIP 可以使用私网地址,也可以是公网地址,但 RIP 与 DIP 必须在同网络内,RIP 的网关不需要也不能指向 DIP,以确保响应报文不会经由 DS;
请求报文要经由 DS,但响应时不经过 DS,而是由 RS 直接发往 客户端;
DR 模式不支持端口映射;
IPIP 模式 报文请求过程图 报文请求过程分析当用户请求到达 DS 时,请求报文会先经过内核空间中的 PREROUTING 链,此时源IP为CIP,目的 IP 为 VIP;
在 PREROUTING 规则链上进行检查目的IP是否为本机,如果是的话将数据包送至 INPUT 链;
数据包到达INPUT链后,IPVS 会比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层 IP 报文,封装源 IP 为 DIP,目标 IP 为 RIP,然后发至POSTROUTING链,此时源 IP 为 DIP,目标 IP 为 RIP;
POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输);此时源 IP 为 DIP,目标 IP 为 RIP;
RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来,拆除掉最外层的 IP 后,会发现里面还有一层 IP 首部,而且目标是自己的 lo 接口 VIP,那么此时 RS 开始处理此请求,处理完成之后,通过 lo 接口送给 eth0 网卡,然后向外传递,此时的源 IP 地址为 VIP,目标 IP 为 CIP;
响应报文最终送达至客户端;
IPIP 实验DR 模式是通过MAC地址进行交换,只能限制在一个局域网内,而TUN隧道方式 ,是通过给数据包加上新的IP头部来实现,这个可以跨机房(可以实现异地容灾)、跨公网、主要是解决不能跨网的问题;
添加 VIP 网卡信息 # 配置 VIP [root@master02 ~]# ifconfig ens32:1 1.65.15.145 netmask 255.255.255.0 up # 测试连通性 [root@master02 ~]# ping -c 1 1.65.15.145 PING 1.65.15.145 (1.65.15.145) 56(84) bytes of data. 64 bytes from 1.65.15.145: icmp_seq=1 ttl=64 time=0.026 ms --- 1.65.15.145 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.026/0.026/0.026/0.000 ms [root@master02 ~]#
创建负载均衡
[root@master02 ~]# ipvsadm -A -t 1.65.15.145:80 -s rr [root@master02 ~]#添加RS到LB
# 添加 RealServer 作为 VIP 的后端 [root@master02 ~]# ipvsadm -a -t 1.65.15.145:80 -r 1.65.15.143:80 -i [root@master02 ~]# ipvsadm -a -t 1.65.15.145:80 -r 1.65.15.144:80 -i [root@master02 ~]#负载均衡器(LB)要开启转发功能
[root@master02 ~]# echo 1 >/proc/sys/net/ipv4/ip_forward [root@master02 ~]#查看负载情况
[root@master02 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 1.65.15.145:80 rr -> 1.65.15.143:80 Tunnel 1 0 0 -> 1.65.15.144:80 Tunnel 1 0 0 [root@master02 ~]#RealServer 配置tunl0 (所有RS服务器)
# 加载下 tunl 模式 [root@node01 ~]# modprobe ipip # 为 tunl0 网口配置 IP(即VIP) [root@node01 ~]# ifconfig tunl0 1.65.15.145 netmask 255.255.255.255 up [root@node01 ~]#修改内核参数(所有RS服务器)
[root@node01 ~]# echo 0 > /proc/sys/net/ipv4/ip_forward [root@node01 ~]# echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore [root@node01 ~]# echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce [root@node01 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@node01 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@node01 ~]# echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter [root@node01 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filterarp_ignore 与 arp_announce上面已经有详细说明,这里说下rp_filter,官方说明 https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
rp_filter 参数主要是用于控制系统是否开启对数据包源地址的校验,它有3个值,0、1、2。
0:不开启源地址检验;
1:开启严格的反向路径校验,对每个入访的数据包,通过指定网卡,校验其出访路径是否为最佳路径,如果不是最佳路径,则直接丢弃;(Linux 服务器默认是1)
2:开启松散的反向路径校验,对每个进来的数据包,通过任意网口,校验其源地址是否可达,即反向路径是否能通,如果不通,则丢弃;
其实这个参数和安全也息息相关: