一、测试环境

 
类型 IP
负载均衡器 eth0:10.20.73.20
VIP eth0:0 10.20.73.29
后端真实机 10.0.0.7(web01)、10.0.0.9(web02)
 

二、异常现象

在client上ping VIP是通的,但是访问服务的时候却发现不通。

DR上所有连接都为SYN_RECE状态。(类似TCP SYN Flood。)

三、故障排除思路

1、抓包

从RS上抓包的情况来看,也和ipvsadm列出来的结果是一样的,服务器收到客户端发过来的S标记的包后再也没了下文。在DR上抓包,也是同样的效果。
 
2、分析
1.说明客户端发的包确实到了DR,并且DR也已经把包发送给了后端RS,问题应该出现在RS上。
此时的数据流分析如下:
客户端发送S标记的包过来,服务端发送ACK确认后,就老老实实在在等待客户端发送ACK过来后,就可以愉快的工作了,但是万万没想到的是,此时服务端的ACK包被无情的过滤了,客户端不可能发ACK过来,所以就一直停留在SYN_RECE状态了。
 
3、解决过程
1.抓包,只能看到结果,但是还不知道具体导致RS不回应Client的原因;
2、关闭防火墙、关闭selinux,reboot,问题依旧,没得到解决;
3、以为是没有开启路由转发导致,所以就echo "1" > /proc/sys/net/ipv4/ip_forward,打开RS的路由转发功能。
4.上面三板斧过后,还是不见效,于是就开始找度娘了,先是网上搜了一大把关于怎么配置lvs tunnel的文章,先看看是不是我配置有误,经过查看和对比,没有问题。问题还是没有得到解决。
5.当天晚上,没睡好觉,第二天一早就起来,继续排查和搜资料,可能是tunnel模式在现实中使用的比较少,所以网上关于tunnel提问的人也不是很多。看来这个问题只能自己摸索了。
 
于是先从tunnel模式的数据流着手,
【CIP->VIP】:客户端访问调度器上的VIP
【DIP->RIP|CIP->VIP】:DR经过IPIP协议将IP包进行二次包装,其实就是把包头进行特殊封装,把上次的包头作为数据包装了进去。
【VIP->CIP】:RIP收到包后,进行包头解析,发现是从DIP发过来的,但是因为RS上是经过IPIP协议进行解包的,所以他看到的真实源IP为VIP,目标IP为CIP,而此时,源IP恰巧就在RS上,嘿嘿,这里不是恰巧,是特意设置的,而且把他的嘴给封了,arp广播被禁用,这样,他就不会喊人了,把自己就当成了源IP了,所以此时RS就直接回应CIP了。
上面说了一大推理论,看来也没有解决问题,但是从上面的整个数据流来看,比较清晰明了,问题就出在RS发包上。但是为什么RS会丢包呢?思考了好久,反复模拟发包过程,突然想起了之前涛哥(网络老师)说的一句话,"数据在网络上是双向的,我们要最好确保他来回一致,如果来回路线不一致的话,就可能有去无回了,此时需要我们给他指定回来的路"。这个场景正好是路由来回不一致的场景,但是我已经指定了回来的路由/sbin/route add -host $VIP dev tunl0,那为什么还不行呢?是不是linux系统本身也会有限制呢?于是就把思维转向了sysctl中的那些内核参数,度娘一上,发现还真有个反向路径过滤参数rp_filter,这个参数也没有错,他正是为了干掉哪些DDOS攻击里面的TCP SYN Flood。而我们此时的场景正好符合他的要求,所以被无情的过滤了。具体请参考:http://en.wikipedia.org/wiki/Reverse_path_filtering
大概意思如下:
 设置参数为0           非源检测,即对源不进行检测。注意:如果这里不检测的话,对于洪泛攻击可能立马就瘫痪了。
设置参数为2            严格模式,进来的每一个包都进行检测,如果接口上不是最佳回包,数据库包将会检测失败。默认情况下,失败的的包会丢掉。
设置参数为2           松散模式,每个进来的包将会进行检测,如果源地址通过本机任何接口都不可达的话,数据包将会失败。
 
rp_filter - INTEGER(参数为整数)
        0 - No source validation.   
        1 - Strict mode as defined in RFC3704 Strict Reverse Path
            Each incoming packet is tested against the FIB and if the interface
            is not the best reverse path the packet check will fail.
            By default failed packets are discarded.
        2 - Loose mode as defined in RFC3704 Loose Reverse Path
            Each incoming packet's source address is also tested against the FIB
            and if the source address is not reachable via any interface
            the packet check will fail.
 
        Current recommended practice in RFC3704 is to enable strict mode
        to prevent IP spoofing from DDos attacks. If using asymmetric routing
        or other complicated routing, then loose mode is recommended.
 
        The max value from conf/{all,interface}/rp_filter is used
        when doing source validation on the {interface}.
 
        Default value is 0. Note that some distributions enable it
        in startup scripts.
Red Hat are (correctly) setting rp_filter to 1, strict mode.  In this case a packet coming in eth0 will have its source address routed out on the same interface that it came in on (because that's the default route).  However, a packet coming in on eth1 will have it source address routed out on a different interface to the one it came in on and it will be discarded.  Silently.
 
This is basically asymmetric routing and is quite possibly not what you want anyway (it messes up TCP flow control) so there are two ways to fix this: stick with asymmetric routing and permit it or fix the asymmetric routing.
 
The first one is easiest: in /etc/sysctl.conf change rp_filter=1 to rp_filter=2).  You'll need to load that and restart the network.  It's probably easiest to reboot :-) to be sure.  I suspect that it was not restarting enough things that prevented this change from working before.
 
The second one may be simple as simple as adding those routes that should go out on eth1 to the routing table or running some routing daemon.  It depends on your network topology, basically. This would be the preferred solution if it's practicable.
 
注释:解决方法,1是关闭反向路径过滤功能;2是添加一条满足反向路径过滤的路由。
由于linux系统处于自身保护考虑,这个参数默认设置成1,:严格模式。
二话不说,我先把参数给调了,看看效果,于是在tunnel模式里面加了一行:
echo "0" >/proc/sys/net/ipv4/conf/tunl0/rp_filter
重启服务:
service ipvstunl stop
service ipvstunl start
 
测试:OK,正常了。

记一次lvs-tunnel模式的故障分析(7)的更多相关文章

  1. 负载均衡集群相关、LVS介绍、LVS调度算法、LVS NAT模式搭建

    1.负载均衡集群相关 2.LVS的三种模式:NAT.DR .IP tunnel 3. LVS的调度算法(共有8种) 4.LVS NAT模式搭建准备条件:   在分发服务器上安装:yum install ...

  2. 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建

    7月4日任务 18.6 负载均衡集群介绍18.7 LVS介绍18.8 LVS调度算法18.9/18.10 LVS NAT模式搭建 扩展lvs 三种模式详解 http://www.it165.net/a ...

  3. Ubuntu LVS DR模式生产环境部署

    1.环境说明 系统版本:ubuntu14.04 LVS服务器:14.17.64.3 真实服务器:14.17.64.4-12 VIP:14.17.64.13 部署目的:用户请求14.17.64.13的报 ...

  4. Linux centosVMware 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建

    一.负载均衡集群介绍 主流开源软件LVS.keepalived.haproxy.nginx等 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做 ...

  5. Vmware虚拟机配置LVS/NAT模式遇到的坑。

    这两天在研究LVS的负载均衡,先从最简单的LVS/NAT模式开始入手. 最后配置完之后能够相互之间Ping通,并且能够直接访问real服务器提供的web服务,而且防火墙也已经关闭了. 但是通过访问LV ...

  6. LVS DR模式 负载均衡服务搭建

    LVS 负载均衡 最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡).LVS模式工作在网络层 ...

  7. lvs DR模式

    1.单机 director端ifconfig eth0:1 $vip broadcast $vip netmask 255.255.255.255 up ----broadcast广播(单机的时候加这 ...

  8. 一个公网地址部署LVS/DR模式

    http://blog.chinaunix.net/uid-7411781-id-3436142.html 一个公网地址部署LVS/DR模式   网上看了很多关于LVS的文章,在选取2种模式LVS/D ...

  9. LVS DR模式搭建、keepalived+lvs

    1.LVS DR模式搭建 条件: 即三台机器,在同一内网. 编辑脚本文件:/usr/local/sbin/lvs_dr.sh #! /bin/bashecho 1 > /proc/sys/net ...

随机推荐

  1. 【java】io流之字节输出流:java.io.OutputStream类及子类java.io.FileOutputStream

    package 文件操作; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impo ...

  2. 商城项目整理(三)JDBC增删改查

    商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: create table TEST.GOODS_TABLE ( gid NUMBER not null ...

  3. 查看windows、linux的SN

     gwmi win32_bios    [root@live-al-ops-pxe-2 ~]# dmidecode | grep Number | sed -n '1p' Serial Number: ...

  4. ES6中Promise对象个人理解

    Promise是ES6原生提供的一个用来传递异步消息的对象.它减少了传统ajax金字塔回调,可以将异步操作以同步操作的流程表达出来使得代码维护和可读性方面好很多. Promise的状态: 既然是用来传 ...

  5. im4java包处理图片

    使用方法:首先要安装ImageMagick这个工具,安装好这个工具后,再下载im4java包放到项目lib目录里就行了.package com.stu.util; import java.io.IOE ...

  6. selenium 封装

    周末无聊 在家封装一个pyselenium.可能这些封装大家都会使用,但是我还是根据我自己的习惯去选择性的去封装一些在我工作中用的,这样的话,我就不用去看selenium的api的,我可以根据我自己的 ...

  7. js 停止事件冒泡 阻止浏览器的默认行为(阻止a标签跳转 )

    在前端开发工作中,由于浏览器兼容性等问题,我们会经常用到"停止事件冒泡"和"阻止浏览器默认行为". 1..停止事件冒泡 JavaScript代码 //如果提供了 ...

  8. 记录python学习过程中的一些小心得

    1.python中一切皆对象,内置数据结构也是对象.处理一个对象就是利用它带有的方法和属性,对该对象进行处理,一步步达到我们想要的结果. 2.编程时,先构思好我们处理的对象是什么,具有哪些属性和方法, ...

  9. 使用Word进行文档修订版本的比较

    项目经理在实际的工作过程中,比如要写文档方案,就需要对文档的修订版本进行管理和控制.在以前的工作中,笔者使用的是UltraEdit这个软件工具中的Ultra Compare这个子工具来进行的文档版本的 ...

  10. python科学计算_numpy_ufunc

    ufunc简介 ufunc指universal function,是一种能够对数组中的所有元素进行操作的函数,ufunc是针对数组进行操作的函数,对一个数组进行重复的运算时,使用ufunc比math库 ...