director配置iptables错误导致访问vip http失败 排错与分析

【问题现象】

部署lvs-dr模式负载均衡集群,realserver通过80端口提供http服务。

【排错过程】

    发现通过vip无法访问http服务,而直接访问realserver的IP 的http服务时正常的。这说明realserver的http服务是正常的。

    为了排除lvs dr配置的vip 、arp抑制和 路由是正常的,又添加了ipvs规则,监听22端口,并负载分担到realserver。经过测试,22端口的ssh服务正常,可以ssh登陆到后端realserver。所以包括IP、arp、路由等配置的链路本身是正确的。

    另外检查了realserver的firewalld是关闭的。iptables也再INPUT链放通了80端口。realserver段检查不出什么问题。

    因为开始时通过浏览器访问vip的http服务,没有任何错误信息,非常不利于排错,于是又用另一台同网段的linux机器用curl 命令访问vip的http服务,结果报错

curl: (7) Failed connect to 192.168.14.100:80; No route to host

网上百度了一下该错误信息,很多文章都说与iptables相关。在定位时还做了一个测试,访问vip的http服务时,在director server和 real server上tcpdump抓包,只能在director上能抓到报文,realserver没有报文,这说明问题在director上。于是检查了一下 director server的iptables规则,果然有一条iptables规则 

-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

    但是没有80端口的iptablels规则,判断这里缺少放通80端口的iptables规则应该就是问题所在。

执行iptables命令,放通INPUT链的80端口之后,果然可以访问vip的http了!^_^

iptables -A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT


【原理分析】

这次故障是因为不了解ipvs负载均衡是作用在内核的INPUT上,忘了配置相应的iptables规则。

lvs工作机制:

1、当client向vip发送请求时,lvs服务器收到报文,将报文从物理网卡送到内核空间。

2、在系统内核空间匹配netfilter的chain,PREROUTING链首先判断报文目的IP是本机IP,将数据包发往INPUT链。

3、ipvs工作在INPUT链上,并且是在INPUT链匹配accept时,ipvs将报文与定义好的ipvs规则匹配,如果命中ipvs规则,ipvs会强行修改报文的目的ip地址和端口,然后将数据包发往POSTROUTING链。

4. POSTROUTING链再根据目的IP查路由,将报文最终发送给后端服务器。


director配置iptables错误导致访问vip http失败 排错与分析_第1张图片

你可能感兴趣的:(director配置iptables错误导致访问vip http失败 排错与分析)