keepalived vip ping不通_【干货分享】OpenStack LVS负载均衡为什么不通?

a0c027336ed617712521fd22b71778db.png

f7bc4ec74e8ae8357d9934ac3f03a764.png

OpenStack环境Neutron 的安全组会向虚拟机默认添加 anti-spoof 的规则,将保证虚拟机只能发出/接收以本机Port为原地址或目的地址(IP、MAC)的流量,提高了云的安全性。但是LVS等需要绑定VIP的场景,默认流量是被拦截的。需要做allow pairs设置才能放通流量。

02

业务拓扑

36400c4f4b4056491b386911daae8e80.png

● Director Server分发器

VIP:xx.xx.xx.241

内网IP 主xx.xx.xx.5

            备xx.xx.xx.7

Keepalived配置文件路径 /etc/keepalived/keepalived.conf

● 真实服务器RS关闭ARP,并添加lo:0 IP为VIP

内网(专网)IP xx.xx.xx.8   xx.xx.xx.10

                      xx.xx.xx.11   xx.xx.xx.13

以上六台虚拟机都对VIP做过allowed_address_pairs(仅对VIP做的,后面会详述)。

03

问题现象

配置了LVS的DR模式,配置完成后Client ping VIP可以通,但是发送HTTP请求,没有反应。抓包发现,Director收到了Client的报文,但是RS没有收到HTTP请求,只有VRRP报文。

04

排除过程

4.1怀疑是LVS配置问题

1a0e3d7bfa6549f3b1b89010e171e236.png

Client能ping通VIP,CURL VIP没响应,LVS 处在SYN_RECV状态,抓包发现,LB端有进来的VIP报文,RS没有。问题应该是LB端发不出去,或RS收不到报文。

结果

反复检查keepalived和RS配置,没有问题。同样的配置在非openstack上跑,可以跑通。排除配置问题。

4.2 怀疑是宿主机防火墙问题

4.2.1 怀疑是宿主机本地防火墙规则问题

在查看宿主机防火墙cat /etc/sysconfig/firewalld的时候,发现有一条规则影响业务,注掉并重启防火墙就可以跑通业务。

88bafdfb4ba8f50c9ca7bef4b3e24332.png

重启宿主机iptables后:

72ce1b516448b3b24062ccbc95afae4a.png

结果

其实并不是这个问题,是重启防火墙之后,启用了本地防火墙规则,把原先Neutron的防火墙规则冲掉了,iptables几乎都空了,所以业务感觉通了。等Neutron同步规则后,还是会不通。

4.2.2怀疑是虚机防火墙问题

一开始出现不通的时候, iptables -F清空虚机里面的iptables规则,发现并没有实质作用

还是必须重启宿主机的iptables。

虚机iptables规则:

53ca4d5394d63a38d04ba4276be7ab35.png

结果

其实虚机的iptables已经几乎没有规则了,也并没有影响业务的条目。重启宿主机iptables通,实则还是上一个问题,把宿主机本地Neutron的iptables规则给冲了。

4.2.3怀疑是Neutron安全组问题

后期排查主要是在Neutron安全组方向。必现的场景是,在删除增加后端或者重启Neutron-openvswitch-agent的时候,业务就不通了。

● 尝试分别对LVS节点(xx.xx.xx.5、xx.xx.xx.7)和RS节点(xx.xx.xx.8、xx.xx.xx.10、xx.xx.xx.11、xx.xx.xx.13)做了allow_pairs,但是业务不通。

Dump宿主机防火墙的时候,发现如下规则:

69683e98062bfed5ddbbba6540b70295.png

这些条目出现的原因是对Port和VIP做了allow_pairs绑定。会生成对应条目的iptables。由Chain ID追溯,是Neutron-openvswi-FORWARD规则,属于虚机Port转发链规则,问题应该就是出在这边。

● 尝试对LVS的Port加了80端口的放通规则后,业务通了:

bb1d6736957dd533a2cce5724e8fdd0f.png

结果

确实是安全组导致iptables把流量给drop了,有多个办法可以规避这个问题:

● 在iptables对应子链加规则放行。但是在界面更新或’neutron-openvswitch-agent’重启的时候,Neutron重新下发规则,会刷掉本地手动加的规则,不可以完全保证业务不通。

● 把端口的port-curity-enable设置成false,但是安全组不再生效

● 写脚本探测iptables重载,再添加规则。但是规则没有添加的瞬间,也会出现业务短时间断的情况。

●  在’neutron-openvswitch-agent’里添加规则放行,但是需要修改Agent,太麻烦。

●  在安全组设置这个规则,但是没找到相应的入口。

05

解决方案

5.1 LVS DR模式模型原理

5fe4801939ff4655c228822e532ca247.png

DR模式的工作过程

●  Client 发送Request包到LB服务器的VIP上

●  负载均衡服务器根据VIP选择对应的RS。然后修改报文目的MAC为RS的MAC地址,将Client的请求发给RS

●  被选择的RS把应答包直接传给Client

5.2 问题根本原因

上面的DR模式过程可以看出,LVS转发过程中不修改IP,只修改DST MAC,Source IP没变。而由上面的截图可以看出,allow_pairs在iptables里是用一组IP和MAC的组合规则来放通流量。所以只绑定VIP为allow_pairs,实际是VIP和自己网卡的MAC的规则,而目的MAC在经过LVS的时候已经被修改成后端MAC了,流量自然就过不去。而VRRP报文能出去的原因是IP和MAC都是本机的,在iptables里。

5.3 解决办法

● 负载均衡器设置

1. 一种办法,因为Client的CIP是任意的,负载均衡器需要转发Source IP为CIP的报文,所以可以让allow_pairs绑定IP为0.0.0.0/0,让所有的IP可以从Director出去。原理是放开了基于本机MAC的所有IP报文。如:neutron port-update port_id --allowed-address-pairs type=dict list=true ip_address=0.0.0.0/02. 另一种办法,负载均衡器修改的目的MAC是后端服务器的,可以把后端服务器的MAC都加到allow_pairs。如果MAC不确定的情况,直接设成0:0:0:0:0:0,放开所有的MAC。如:neutron port-update port_id --allowed-address-pairs type=dict list=true ip_address=$VIP mac_address=$RSMAC● 后端设置因为RS需要转发Source IP为VIP的报文,所以应该对RS对应PORT 做放开VIP的allow_pairs。如:neutron port-update port_id --allowed-address-pairs type=dict list=true ip_address=$VIP

添加后的iptables会出现如下的规则:

f8a32597871e9013c445495409282e83.png

问题解决

5.4 可能出现的安全问题

因为上述规则实际上是放开了对应虚机的流量限制,DR模式可以让任意IP或者MAC能访问VIP,流量从LVS节点透传过来,这个对虚机和应用的安全性会有一定的隐患,这里有几条安全建议:

1.搭建前端硬件防火墙

2.虚机操作日志记录,权限管理

3.虚机安装安全软件

4.虚机arp_announce设置成2(总是使用最合适的网卡来响应)

5.虚机iptables设置,只允许VRRP和对应TCP+PORT的规则

6.更换NAT/TUNNEL/FULLNAT,可以做内外网隔离的模式

06

总结

LVS的特点是需要在Port添加VIP,内部去进行地址的转换,再发给后端。单纯在iptables层去修改问题,还是会被Neutron刷新。可以在安全组里面去修改,也可以在Neutron命令行设置,才能保证设置持久化,不会出现iptables被刷新的问题。

OpenStack的网络环境iptables规则比较复杂,出现问题的时候,应该在iptables找到自己的IP:Port,NIC Dev ID, 子Chain ID,向上追溯属于哪条链、哪个表,再结合网络拓扑和业务场景去规划和设置确定问题在哪。

单纯考虑到VIP是不够的。类似问题解决办法不是一成不变的,除了刚才提到的,还有多种办法,可以关闭Port安全组,也可以在安全组添加条目,或者修改agent代码关闭Port的firewall或者添加accept条目等等,方法有很多,需要权衡利弊根据需求选择。

End

往期推荐

【干货分享】|  深度解析python之生成器

【干货分享】|  大云弹性计算产品BC-EC全面支持跨版本升级

【干货分享】|  为啥热迁移总是断网呢?

39386933a1eaebc40ccfc54f431d55f1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装ssh,supervisor等基础工具

2019独角兽企业重金招聘Python工程师标准>>> Docker安装ssh,supervisor等基础工具 需要提前下载好官方的ubuntu镜像,我这里使用的是ubuntu:14.04版本,这里安装了一些基础的工具ssh,curl,wget,vi…

nginx集群_windows环境下搭建简单Nginx+Tomcat集群

通俗点将,负载均衡就是因为访问流量太大,导致项目访问不流畅、甚至宕掉,所以通过一种分流的方式来缓解这种情况。一、 工具nginx-1.8.0apache-tomcat-6.0.33二、 目标实现高性能负载均衡的Tomcat集群:三、 步骤1、首先下载Nginx&a…

颜色传感器TCS230及颜色识别电路(转)

摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器。该传感器具有分辨率高、可编程的颜色选择与输出定标、单电源供电等特点;输出为数字量,可直接与微处理器连接。文中主要介绍TCS230的原理和应用,以及色光和白平衡的知识&…

mysql命令行导入和导出数据

首先打开命令窗口,输入命令:mysql -h localhost -u selffabu -p 连接成功后,进行下面的操作 MySQL中导出CSV格式数据的SQL语句样本如下: Sql代码select * from test_info into outfile /tmp/test.csv fields terminated by , optionally enclosed by " esc…

7.组件连线(贝塞尔曲线)--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...

上节讲到如何创建组件,清除设计器视图,以及设计视图的持久化和恢复,本节将重点讲如何实现组件间的连线,前面章节有提到为了方便从持久化文件中恢复,组件和连线是分别存放的:nodes和lines对象,两…

定位排查工作流的计算结果数据量不符合预期的方法

近期有发现一些用户在咨询,为什么数据从数据源出来后,经过了一些计算,结果不符合预期了。最常见的是说,为什么我的数据在Mysql里有xx条,怎么到MaxCompute里算了下结果变了。因为这是两个不同的系统,我们又没…

canvas 插件_基于canvas的JavaScript 二维码生成工具——QRCanvas

介绍在我们日常的开发中,特别是在现代的社会环境下,二维码的应用可谓是丰富多彩,各种各样让人眼花缭乱的二维码,可见二维码已经渗透进我们生活的方方面面,也可以说目二维码确确实实方便了我们的生活。因为作为开发人员…

消息队列NetMQ 原理分析2-IO线程和完成端口

目录 前言介绍目的IO线程初始化IO线程Proactor启动Procator线程轮询处理socketIOObject总结前言 介绍 [NetMQ](https://github.com/zeromq/netmq.git)是ZeroMQ的C#移植版本,它是对标准socket接口的扩展。它提供了一种异步消息队列,多消息模式,消息过滤(订阅&#xf…

VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法

VC连接MySQL的配置过程在上一篇博文中,不过当你设置好,以为万事大吉的时候,运行却出现这个错误:libmysql.lib : fatal error LNK1113: invalid machine type。 无效的机器类型,真的是很让人捉急。 发生这个错误的原因是…

linux 内存泄漏 定位,一种内存泄露检查和定位的方法

一个系统后台服务进程,可能包括多个线程,在生成环境下要求系统程序能够稳定长时间稳定运行而不宕机。其中一个基本的前提就是需要保证系统程序不存在内存泄露。那么,该如何判读系统程序是否存在内存泄露呢?如果存在,又…

ifconfig命令找不到_02. Linux命令之查看网络连接

1. 查看网络连接数和端口使用 netstat 命令查看网络连接情况netstat -anp参数:-a 显示所有选项-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化成数字。-p 显示建立相关链接的程序名关键列解释:Proto 表示协议…

python学习之模块(pip),列表生成式,模块操作mysql,excel

python基础 生成式 列表生成式  格式 [表达式 for 表达式 in 迭代对象 (可加判断)] 原: 1 res1 [] 2 for i in range(1,5): 3   res1.append(i) 4 print(res1) 改: 1 res2 [i for i in range(1,5)] 2 print(res2) 字典生成式  格式 {key:value f…

linux驱动read函数 copytouser,Linux驱动编程 step-by-step (五)主要的文件操作方法实现...

主要的文件操作方法实现文件操作函数有很多的操作接口,驱动编程需要实现这些接口,在用户编程时候系统调用时候会调用到这些操作structfile_operations {...loff_t (*llseek) (structfile *, loff_t,int);ssize_t (*read) (structfile *,char__user *,siz…

基于光线追踪的渲染中景深(Depth of field)效果的实现

图形学离线渲染中常用的透视摄像机模型时根据小孔成像的原理建立的,其实现通常是从向成像平面上发射ray,并把trace这条ray的结果作为成像平面上对应交点的采样结果。即: 图片来自《Fundamentals of Computer Graphics》 现实中的镜头拍摄的图…

带你制作百词斩单词表读写插件

上篇博文简单的介绍了一下Chrome插件,今天就与大家分享一下我做的这款有实际意义的插件吧。 做这款插件主要是用百词斩站点进行单词学习时,遇到的一点点闹心事儿。在单词表中不能听发音。也不能练习拼写。所以才忍无可忍的做了这么一款插件。自我感觉还是…

iphone各机型参数对比_带你了解新款iPhone 12系列四款机型

2020年10月14日凌晨1:00,苹果召开新品发布会,发布了新款iPhone 12系列手机,“果粉”们期待已久的iPhone 12终于来了。iPhone 12系列手机共有四款机型,分别是iPhone 12 mini、iPhone 12、iPhone 12 Pro、iPhone 12 Pro …

高并发第一弹:准备阶段 了解高并发

高并发第一弹:准备阶段 了解高并发 首先需要知道什么并发, 什么是高并发. 并发: 关于并发的学习,可以从JDK提供的并发包为核心开始,许多其他的类和封装都是对其进行扩展或者补充,我们来看一下Java并发包(java.util.concurrent包,简…

matlab立体坐标定位_【半导光电】基于光电探测器的激光章动定位算法(二)

今日光电有人说,20世纪是电的世纪,21世纪是光的世纪;知光解电,再小的个体都可以被赋能。欢迎来到今日光电!----与智者为伍 为创新赋能----1. 章动定位算法实验前,首先需要对光路进行调节,保证经…

Android:支持多选的本地相册

前段时间在做一个动态发布功能,需要用到图片上传。一开始直接调用的系统相册和相机,由于系统相机不支持多选,就花点时间做了个本地相册,在此开源下。 先上截图,依次为选择相册界面、相册详情界面、查看图片大图界面 相…

心灵与大脑

2019独角兽企业重金招聘Python工程师标准>>> http://blog.sina.com.cn/s/blog_6f034fc30102f2tg.html 转载于:https://my.oschina.net/chirnson/blog/832011