在dpvs上实现ICMP的源进源出

2024-03-12 15:12
文章标签 实现 icmp dpvs 进源

本文主要是介绍在dpvs上实现ICMP的源进源出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 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);elsereturn 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

这篇关于在dpvs上实现ICMP的源进源出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/801681

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import