在dpvs上实现ICMP的源进源出

news2025/1/13 3:09:41

目录

  • 1. 缘起
  • 2. 源码分析
  • 3. 让ICMP也走源进源出

1. 缘起

  在网络通信中,当一个请求报文从源主机到达目标主机,并经过中间路由器或交换机进行转发时,请求报文进入主机A的路径和响应报文离开主机A的路径可能不同。这种情况下,就会出现所谓的三角路径问题。如下图:
在这里插入图片描述

   具体来说,当一个请求报文进入主机A的路径与响应报文离开主机A的路径不同,可能导致以下问题:

  1. 网络性能不稳定:如果进入主机A的路径与离开主机A的路径存在较大差异,可能会导致网络性能不稳定。例如,进入主机A的路径可能经过高负载的网络链路,而离开主机A的路径可能经过较空闲的链路。这样的差异可能导致请求和响应之间的延迟不一致,影响网络性能和用户体验。

  2. 安全性问题:在某些情况下,网络中的安全策略可能只应用于特定的路径。如果请求报文进入主机A的路径与响应报文离开主机A的路径不同,可能导致安全策略无法完全覆盖所有的路径,从而增加了网络的安全风险。

  3. 问题排查困难:当出现网络故障或问题时,如果请求报文进入主机A的路径与响应报文离开主机A的路径不同,可能增加了故障排查的难度。因为网络管理员需要同时考虑请求和响应的不同路径,以确定问题的根本原因。

为了解决这个问题,可以采取以下措施:

  1. 路由优化:网络管理员可以优化网络的路由配置,使得请求报文进入主机A的路径和响应报文离开主机A的路径尽可能一致。这可以通过路由策略调整、链路负载均衡等方式实现。

  2. 建立对称路径:尽可能建立对称路径,即让请求报文和响应报文经过相同的网络路径。这可以通过协议配置、网络设备设置等手段实现。

  3. 网络监控和故障排查:网络管理员应该使用适当的网络监控工具来监测网络性能和路径信息。当出现问题时,可以通过监控数据和故障排查工具来分析请求和响应的路径差异,并找出问题所在。

  最近,我们在用dpvs的fnat模式的部署测试中,就碰到了三角路径的问题。其原因是由于dpvs设置的默认路由和进来的路由不一致导致的,当时抓包发现tcp和udp报文走的路径和来源路径是一致的,就是所谓的源进源出,而ping报文则不是,dpvs上的出向流量走的是dpvs上面配置的默认路由。我们希望ping报文能够像tcp/udp一样也能够走源进源出的路径。
  下面就以fnat模式来进行分析。

2. 源码分析

   于是对tcp/udp的出向报文发送逻辑进行了分析。经过分析,tcp/udp出向报文是通过xmit_outbound转发到客户端的,由__dp_vs_in函数调用,源码片段如下:

    /* holding the conn, need a "put" later. */
    if (dir == DPVS_CONN_DIR_INBOUND)
        return xmit_inbound(mbuf, prot, conn);
    else
        return xmit_outbound(mbuf, prot, conn);

   如果dir != DPVS_CONN_DIR_INBOUND就表示当前需要转发的数据包是出向流量,于是调用xmit_outbound函数进行数据包的转发。

  再看xmit_outbound的逻辑:

/* return verdict INET_XXX */
static int xmit_outbound(struct rte_mbuf *mbuf,
                         struct dp_vs_proto *prot,
                         struct dp_vs_conn *conn)
{
   
    int err;
    assert(mbuf && prot && conn);

    if (dp_vs_stats_out(conn, mbuf)) {
   
        dp_vs_conn_put(conn);
        return INET_DROP;
    }

    if (!conn->packet_out_xmit) {
   
        RTE_LOG(WARNING, IPVS, "%s: missing out_xmit\n", __func__);
        dp_vs_conn_put(conn);
        return INET_ACCEPT;
    }

    err = conn->packet_out_xmit(prot, conn, mbuf);
    if (err != EDPVS_OK)
        RTE_LOG(DEBUG, IPVS, "%s: fail to out xmit: %d\n", __func__, err);

    dp_vs_conn_put(conn);
    /* always stolen the packet */
    return INET_STOLEN;
}

  这里关键的就是调用了conn->packet_out_xmit进行数据包的转发。而packet_out_xmit函数指针在fnat模式下面对应的是dp_vs_out_xmit_fnat函数,对于ipv4,dp_vs_out_xmit_fnat函数最终调用的是__dp_vs_out_xmit_fnat4来进行数据包的转发。所以我们来看看__dp_vs_out_xmit_fnat4的实现,源码如下:

static int __dp_vs_out_xmit_fnat4(struct dp_vs_proto *proto,
                                  struct dp_vs_conn *conn,
                                  struct rte_mbuf *mbuf)
{
   
    struct flow4 fl4;
    struct ipv4_hdr *iph = ip4_hdr(mbuf);
    struct route_entry *rt;
    int err, mtu;

    if (!fast_xmit_close && !(conn->flags & DPVS_CONN_F_NOFASTXMIT)) {
   
        /* 通过来源端口转发 */
		dp_vs_save_outxmit_info(mbuf, proto, conn);
        if (!dp_vs_fast_outxmit_fnat(AF_INET, proto, conn, mbuf)) {
   
            return EDPVS_OK;
        }
    }

	/* 通过路由转发 */
    /*
     * drop old route. just for safe, because
     * FNAT is PRE_ROUTING, should not have route.
     */
    if (unlikely(mbuf->userdata != NULL))
        route4_put((struct route_entry *)mbuf-&g

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

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

相关文章

精通Linux的磁盘分区:从理论到实战

前言 在这篇技术文章中,我详细介绍了Linux磁盘分区的理论知识,并结合实际示例演示了如何在CentOS 7系统上使用fdisk工具进行磁盘分区和删除操作。无论您是新手还是有一定经验的用户,本文都将帮助您轻松掌握磁盘分区的关键概念和操作技巧。如…

C++:vector类

vector的介绍及使用 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样, vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的…

Linux信号灯

概念:是不同进程间或一个给定进程内部不同线程间同步的机制。类似我们的 PV操作概念: 生产者和消费者场景 P(S) 含义如下:if (信号量的值大于0) { 申请资源的任务继续运行;信号量的值减一;} else { 申…

同态滤波算法详解

同态滤波是一种用于增强图像的方法,特别适用于去除图像中的照明不均和阴影。该算法基于照射反射模型,将图像分解为两个分量:照射分量(illumination component)和反射分量(reflection component)…

腾讯云服务器地域是什么?地域选择看着一篇就够了

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

如何在Windows系统部署Plex影音站点并实现公网访问内网媒体库

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

NO5 蓝桥杯实践之矩阵键盘的使用(或许是一篇求助帖...)

1 任务 2 思路 视频中老师的思路写的代码过长,所以我想了个自己的思路,但是没完全跑出来,求大神指教!!!! 我的思路是首先将矩阵键盘的行和列对应的端口引脚分别存储在类似数组,然后…

【Python】快捷找到最大最小 N 个元素

heapq 简单数据结构取出最大最小N个元素复杂数据结构中取出最大最小N个元素代码解析:lambda Python 中有 heapq 模块可以快捷找到数组中最大最小的 N 个元素; heapq.nlargest(num, arr) # 从arr数组中取出最大num个元素 heapq.nsmallest(num, arr) # …

matplotlib-柱状图

日期:2024.03.14 内容:将matplotlib的常用方法做一个记录,方便后续查找。 # from matplotlib import pyplot as plt# 设置画布大小 plt.figure(figsize(20,8),dpi 300)# 全局设置中文字体 plt.rcParams[font.sans-serif] [Simhei]# 绘制三…

2024年1月粮油调味行业分析(TOP品牌/店铺/商品销售数据分析)

鲸参谋监测的某东1月份粮油调味市场销售数据已出炉! 根据鲸参谋电商数据分析平台显示,今年1月份,某东平台上粮油调味品的销量约6200万件,环比上个月增长45%,同比去年下滑15%;销售额约25亿元,环…

宝妈在家带孩子还是出去工作?足不出户,两者如何兼顾?

我是电商珠珠 很多女性生完孩子之后,就在家当家庭主妇带孩子。部分人舍不得吃穿,把从老公那里要来的钱都给孩子买了东西。自己也想过要出去工作,但是空窗期太久,觉得自己什么都不会,没有企业会要。 前段时间有一个硕…

CUDA下载安装与配置

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 CUDA是什么? CUDA(Compute Unified Device Architecture)是由NVIDIA推出的并行计算平台和编程…

sqllab第十二关通关笔记

知识点: 一般字符型注入分类 单引号闭合双引号闭合这是一个双引号闭合 看界面又是一个输入框的注入;通过admin admin进行登录发现页面还是有回显 直接使用万能密码尝试 构造payload:usernameadminor11 没有任何反应;可能是没加注释符的关闭 构造user…

npm yarn 一起使用报错

项目记录,具有独特性,仅供参考 项目好好的运行,前一天装个测试工具包, 突然就不行了,卸载重装也不行,所有的项目都安装失败,新起一个项目也不行,有时候某个单独安装一个包可以&…

C# 连接neo4j数据库,包括非默认的neo4j默认库

官方文档没找见,自己在源码里面找到的 private string _dbHost "bolt://localhost:7687"; private string _dbUser "neo4j"; private string _dbPassword "******"; private IDriver? _driver;public CQLOperation(string _data…

采购代购系统独立站,接口采集商品上货

采购代购系统独立站的建设与商品上货接口的采集是一个综合性的项目,涉及前端开发、后端开发、数据库设计以及API接口的对接等多个环节。以下是一个大致的步骤和考虑因素: 一、系统规划与需求分析 明确业务需求:确定代购系统的核心功能&…

有没有图像转3D模型的软件?

云端地球是一款免费的在线实景三维建模软件,不需要复杂的技巧,只要需要手机,多拍几张照片,就可以得到完整的三维模型! 无论是大场景倾斜摄影测量还是小场景、小物体建模,都可以通过云端地球将二维数据向三…

Windows系统下载安装Emby结合内网穿透实现公网访问本地影音网站

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

Python实现BOA蝴蝶优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

*地宫取宝c++

题目 输入样例1: 2 2 2 1 2 2 1输出样例1: 2输入样例2: 2 3 2 1 2 3 2 1 5输出样例2: 14 思路 题目说从入口开始,只能向右或向下行走到达右下角,类似“摘花生”这道题的模型。题目又说只有当格子里的宝…