IPVS direct routing on top of openstack (by quqi99)

2023-11-18

作者:张华 发表于:2023-07-12
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

IPVS是Linux内核态的一个L4 LB (KTCPVS, Kernel TCP Virtual Server则是L7 LB), IPVS通过在Netfilter框架中的不同位置注册自己的处理函数来捕获数据包,并根据与IPVS相关的信息表对数据包进行处理,按照IPVS规则中定义的不同的包转发模式,对数据包进行不同的转发处理。
IPVS有哪些包转发模式:NAT、IP tunneling和Direct Routing。本文要做的实验是关于Direct Routeing (client -> LB -> backend -> client), 即从backend返回的包直接direct routing至client (若仍由LB转发的叫NAT, 不会对传输层的端口做修改叫tunneling).

实验

./generate-bundle.sh --name ussuri-ovn-2203 --replay --run
juju config neutron-api-plugin-ovn dns-servers=10.5.0.15
./tools/vault-unseal-and-authorise.sh
./configure
openstack router remove subnet provider-router private_subnet
openstack subnet delete private_subnet
openstack network delete private

source ./novarc
network=172.16.0.0/24
net_start=`ipcalc $network| awk '$1=="HostMin:" {print $2}'`
net_end=`ipcalc $network| awk '$1=="HostMax:" {print $2}'`
d=${net_start##*.}
net_start=${net_start%.*}.$((++d))
n_id="`openstack network create --enable nosec --disable-port-security -c id -f value`"
sn_id="`openstack subnet create --allocation-pool start=$net_start,end=$net_end \
--subnet-range $network --dhcp --ip-version 4 --network $n_id nosec_subnet -c id -f value`"
openstack router add subnet provider-router $sn_id
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
openstack server create --wait --image jammy --flavor m1.small --key-name mykey --nic net-id=$n_id nosecvm1
openstack server create --wait --image jammy --flavor m1.small --key-name mykey --nic net-id=$n_id nosecvm2
openstack server create --wait --image jammy --flavor m1.small --key-name mykey --nic net-id=$n_id nosecvm3
./tools/float_all.sh

IPVS server:   nosecvm1=172.16.0.223/fa:16:3e:1e:fe:eb
real server:   nosecvm2=172.16.0.75/fa:16:3e:06:8e:ab eth-vip=172.16.0.177/b2:65:dc:e1:a8:e5
client server: nosecvm3=172.16.0.24/fa:16:3e:5f:46:c0

#on nosecvm1
apt install ipvsadm -y
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -A -t 172.16.0.177:80 -s rr
ipvsadm -a -t 172.16.0.177:80 -r 172.16.0.75 -g
ipvsadm -l -n

#on nosecvm2
sudo apt install nginx net-tools -y
VIP=172.16.0.177
RIP=172.16.0.75
sudo arptables -F
sudo arptables -D INPUT -d $VIP -j DROP
sudo arptables -D OUTPUT -s $VIP -j mangle --mangle-ip-s $RIP
sudo arptables -L -n -v
sudo modprobe -v dummy numdummies=1
sudo ip addr add $VIP/32 dev dummy0

ip link add eth-vip type dummy
ip link set eth-vip up
ip a add $VIP/32 dev eth-vip
arptables -F
arptables -A INPUT -d $VIP -j DROP
arptables -A OUTPUT -s $VIP -j DROP
arptables -L -n -v

#on nosecvm3
curl 172.16.0.177

Then I successfully reproduce the problem.

root@nosecvm3:~# curl 172.16.0.177
curl: (7) Failed to connect to 172.16.0.177 port 80 after 3069 ms: No route to host

Why was my test result (the comment '2023-08-02 08:49 UTC') random last time? That's because I didn't run above arptables commands to suppress the ARP reply from the real server.

I can reproduce the problem again after running above arptables commands and run 'arp -d 172.16.0.177' in client server even if I haven't created p1 (openstack port create --enable-port-security --network nosec p1).

实验要注意一点,必须运行上面的arptables命令来防止client直接访问了real server, 正确地应该是client通过IPVS来访问real server.

分析

TCP回顾如下:
在这里插入图片描述
在这里插入图片描述

使用了IPVS DR的TCP拓扑如下( https://bugzilla.redhat.com/show_bug.cgi?id=2175037) :
在这里插入图片描述
上面的drop package只在ovn中出现, 在ovs中不出现,
“ovn-trace” 与 "ovs-appctl ofproto/trace"确认没有drop ACK包, 所以ACK应该已经到了LB.
所以可能和ovs的conntrack有关,但是问题发生时’ovs-appctl dpctl/dump-conntrack’显示是ESTABLISH
fdb is not suspect because ACK packets are dropped in br-int on the compute node, and br-int doesn’t have NORMAL rules.
这里有一个commit很可疑 - https://github.com/ovn-org/ovn/commit/d17ece7f3706bd1257e181d69705019c0abb7e51
conntract学习 - https://blog.motitan.com/2017/09/02/ovn%E5%AD%A6%E4%B9%A0-5-conntrack/

其他 - 检查conntrck

都disable port SG了,不应该有conntrack了,确认它

while true; do curl 192.168.21.238; sleep 3; done
conntrack -L |grep '192.168.21' |grep -v 'sport=22'
ovs-appctl dpctl/dump-conntrack |grep '192.168.21' |grep -v 'sport=22'
ovs-dpctl dump-conntrack |grep '192.168.21' |grep -v 'sport=22'
ovs-dpctl dump-flows |grep '192.168.21' |grep -v 'sport=22'

其他 - 查看一个port下的流

ovn-nbctl lsp-get-ls neutron_port_id
ovn-sbctl find Port_Binding logical_port=neutron_port_id
ovn-sbctl dump-flows datapath_id_from_previous_command or neutron-<net-id>

20230829更新

VIP: 192.168.22.222
Client: 192.168.22.219
Frontend: 192.168.22.40
Backend: 192.168.22.192

正常的,只有zone7, 10
tcp 6 431998 ESTABLISHED src=192.168.22.219 dst=192.168.22.192 sport=34850 dport=80 src=192.168.22.192 dst=192.168.22.219 sport=80 dport=34850 [ASSURED] mark=0 zone=7 use=1
tcp 6 431998 ESTABLISHED src=192.168.22.219 dst=192.168.22.192 sport=34850 dport=80 src=192.168.22.192 dst=192.168.22.219 sport=80 dport=34850 [ASSURED] mark=0 zone=10 use=1

但有问题的,有zone7, 10, 8
tcp 6 55 SYN_RECV src=192.168.22.219 dst=192.168.22.222 sport=57756 dport=80 src=192.168.22.222 dst=192.168.22.219 sport=80 dport=57756 mark=0 zone=10 use=1
tcp 6 115 SYN_SENT src
=192.168.22.219 dst=192.168.22.222 sport=57756 dport=80 [UNREPLIED] src=192.168.22.222 dst=192.168.22.219 sport=80 dport=57756 mark=0 zone=8 use=1
tcp 6 298 ESTABLISHED src=192.168.22.219 dst=192.168.22.222 sport=57756 dport=80 src=192.168.22.222 dst=192.168.22.219 sport=80 dport=57756 [ASSURED] mark=0 zone=7 use=1

IPVS Route模式路由是非对称的, 此时在conntrack就容易引起问题,OVN运行conntrack两次(ingress and egress), zone是根据port id来的,这样ingress的包被conntrack看成了zone=frontend, 但是egress的包被conntrack看成了zone=backend, 所以不匹配出问题了。
从Client到Backend的包先经过了LB VM, 但由于是IPVS Direct Routing模式从backend回来的SYNACK包没有经过LB VM而是直接到了Client. 所以connection tracking将始终显示SYN_SENT状态. Client得到SYNACK之后的回复包又得经过LB VM这时就会被作为inv给drop掉。

Ingress: Client -> Frontend (IPVS Load Balancer) -> Backend (Web Server)
Egress: Backend (Web Server) -> Client

OVN目前已经优化如针对stateless的SG rule会略过conntrack
https://github.com/ovn-org/ovn/commit/a0f82efdd9dfd3ef2d9606c1890e353df1097a51

这样:

  • LB应该disable SG, 因为它是将client来的不同IPs的包发给backend, 我们在openstack中无法使用allowed_address_pairs因为它是来自不同互联网中的随机IP的
  • LB也应该disable conction tracking
    而目前OVN只会在statelesss模式时disable connection tracking, neutron也是不支持在disable SG还能用 stateless SG的

一个work around是Client得到SYNACK之后的回复包又经过LB VM作为inv设置不被drop掉 (sudo ovn-nbctl set NB_Global . options:use_ct_inv_match=false), 但这个option是全局性的, 这里有一些讨论 - https://mail.openvswitch.org/pipermail/ovs-dev/2021-March/380859.html

Reference

[1] https://zhuanlan.zhihu.com/p/627514565?utm_id=0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IPVS direct routing on top of openstack (by quqi99) 的相关文章

随机推荐

  • 用c++编写网络爬虫

    include
  • el-date-picker时间选择器设置可选范围当前时间的六个月内

    el date picker时间选择器
  • Vue3快速上手

    Vue3快速上手 1 Vue3简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 耗时2年多 2600 次提交 30 个RFC 600 次PR 99位贡献者 github上的tags地址 https g
  • 三分钟看懂神经网络机器翻译

    神经网络机器翻译 NMT 已成为本地化行业中最热门的话题之一 与以往基于统计的机器翻译 SMT 相比 可以使翻译质量提升 30 同时解决了远距离语言对的复杂性问题 如中文到英语 日语到英语等 SDL 的一项近期调查显示 61 的受访者认为机
  • Dex文件加载以及类加载流程

    Dex文件加载以及类加载流程 安卓源码连接 http androidxref com 4 4 4 r1 app在启动的过程中创建了PathClassLoader加载dex文件 那么我们跟进PathClassLoader libcore da
  • 2022-2027年中国金融市场规模现状及投资规划建议报告

    报告类型 产业研究 报告格式 电子 纸介版 出品单位 华经产业研究院 本报告由华经产业研究院重磅推出 对中国金融行业的发展现状 竞争格局及市场供需形势进行了具体分析 并从行业的政策环境 经济环境 社会环境及技术环境等方面分析行业面临的机遇及
  • Springboot配置双数据源

    Springboot配置双数据源 数据库相关信息 yml相关配置 单数据源与双数据源进行对比 数据源配置 Mysql spring datasource 单数据源 需要删除双数据源相关配置文件 注意是url url jdbc mysql l
  • 面试官问 Vue 性能优化,我该怎么回答

    前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术 帮我们处理了前端开发中最脏最累的 DOM 操作部分 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM 但 Vue 项目中仍然存在项目首屏优化 Webpack 编译配置优
  • DPC_WATCHDOG_VIOLATION蓝屏分析

    https blog csdn net xiangbaohui article details 104849967 DPC WATCHDOG VIOLATION蓝屏分析 1 背景 今天在我们客户的电脑上面出现了一个蓝屏 并且反馈蓝屏码很奇怪
  • 使用vb.net实现五子棋的人工智能五子棋的AI构想

    五子棋的人工智能 利用策略类AI和vb net实现五子棋 作者 张宇 引言 人工智能也就是所谓的AI Artificial Intelligence 它是一门很抽象的技术 AI程序的编写不需要依
  • 如何编写R函数

    转载自http blog sciencenet cn blog 255662 501317 html R语言实际上是函数的集合 用户可以使用base stats等包中的基本函数 也可以自己编写函数完成一定的功能 但是初学者往往认为编写R函数
  • 【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真

    模拟CMOS集成电路设计 带隙基准 Bandgap 设计与仿真 前言 一 设计指标 二 电路分析 三 仿真测试 3 1测试电路图 3 2测试结果 1 基准温度系数仿真 2 瞬态启动仿真 3 静态电流仿真 4 线性调整率仿真 5 电源抑制PS
  • CTF show WEB9

    题目地址https ctf show 尝试简单的万能密码以及过滤绕过 各种方法均没有回显 查看网站源代码 没有提示 这时候猜测可能有其他页面 直接后台目录扫描 发现index phps源代码文件 发现有这么一行 sql select fro
  • Buildroot系列开发(一)发行版Linux系统组成

    内容参考 百问网 公众号百问科技 微信 baiwenwang1 QQ 2797826447 官网 100ask net 文章目录 1 常见的操作系统架构 2 windows 与 linux对比 3 什么是发行版linux系统 4 GNU 1
  • FTP上传错误----“200 Type set to I”

    用Filezilla Server做的FTP服务器 没有使用客户端上传东西 直接用win10的文件管理器访问上传文件 发现有的文件上传时会提示 200 Type set to I 如下图所示 一阵猛上网搜索 原以为是由于 主动模式 Acti
  • 论文笔记:Continuous Trajectory Generation Based on Two-Stage GAN

    2023 AAAI 1 intro 1 1 背景 建模人类个体移动模式并生成接近真实的轨迹在许多应用中至关重要 1 生成轨迹方法能够为城市规划 流行病传播分析和交通管控等城市假设分析场景提供仿仿真数据支撑 2 生成轨迹方法也是目前促进轨迹数
  • Augmented Language Models(增强语言模型)

    Augmented Language Models A Survey 先上地址 https arxiv org pdf 2302 07842 pdf 概率论难以支撑通用人工智能技术的诞生 Yann LeCun LLMs取得的巨大进展不再多说
  • Windows 端 VS Code 远程连接服务器以及配置服务器上的 Jupyter Notebook 环境

    Windows 端 VS Code 远程连接服务器以及配置服务器上的 Jupyter Notebook 环境 一 VS Code 配置远程连接 1 Windows 下生成 ssh 密钥 打开命令提示符窗口 执行以下命令 ssh keygen
  • 【计算机视觉

    文章目录 一 检测相关 8篇 1 1 Impact of Image Context for Single Deep Learning Face Morphing Attack Detection 1 2 A Theoretical and
  • IPVS direct routing on top of openstack (by quqi99)

    作者 张华 发表于 2023 07 12 版权声明 可以任意转载 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 IPVS是Linux内核态的一个L4 LB KTCPVS Kernel TCP Virtual Server则