多EIP下的UDP通信异常分析

news2024/9/21 3:03:26

背景

SRE和程序在测试DDos多EIP防御方案的过程中,发现多EIP模式下, 监听的UDP端口连接会出现客户端访问异常。 表现为客户端发送一次数据后服务端这边主动断开了,或是客户端和服务端同时断开。

该问题会导致业务在多EIP方案下无法达到预期效果,无法进行自动切换EIP对外提供服务。

环境

  • 业务场景:对外的进程默认走udp协议通信,UDP失败后会尝试走TCP协议。
  • 监听方式:0.0.0.0:端口。
  • 防火墙:对外提供的端口全开放。
  • 网络:云(单网卡多EIP)、物理机(多网卡/IP)。

问题定位

抓包发现通信异常的时候,数据包中间会有一个icmp数据包,而我们并没有使用icmp相关协议,并且是icmp unreachable提示。


$tcpdump -nvv -i any |grep 128.1.208.1 02

tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 2621 44 bytes

128.1.208.102.44731 > 128.1.208.149.3000: [udp sum ok] UDP, length 2

13.250.175.90.53 > 128.1.208.30.59236: [udp sum ok] 36073 q: A? ******. (148)

128.1.208.102.44731 > 128.1.208.149.3000: [udp sum ok] UDP, length 2

128.1.208.149 > 128.1.208.102: ICMP 128.1.208.149 udp port 3000 unreachable, length 38

128.1.208.102.44731 > 128.1.208.149.3000: [udp sum ok] UDP, length 2

当服务器创建 UDP socket 时,它可以把其中一个主机本地 IP 地址(包括广播地址)指定为 socket 的本 地 IP 地址。那么,只有当 UDP 包的目的 IP 地址与指定的地址相匹配时,该包才能被送到创建该 UPD socket 的业务层。否则,内核将返回一个 ICMP 端口不可达差错,而服务器(业务层)永远看不到该数 据报。

如果存在一个通配的 IP 地址,那么就隐含了一种优先级关系。如果为 UDP socket 指定了特定 IP 地址,那 么在匹配目的地址时,始终优先匹配该 IP 地址。只有在匹配不成功时才使用通配 地址进行匹配。

经常可以看到远端 IP 地址和远端端口号都显示为 .(或 0.0.0.0:*),其意思是该 socket 将接受来自任何 IP 地址和任何端口号的 UDP 数据报。大多数系统允许 UDP socket 对远端地址进行限制,以令其只能接收 来自特定 IP 地址和端口号的 UDP 数据报。

在伯克利派生系统中存在如下副作用:如果在指定远端地址(IP 和 PORT)时没有选择本地地址,那么内 核将自动选择本地地址。其值就成为“选择到达远端 IP 地址路由时”用于做路由判定的 IP 地址。

问题复现

服务端

import socket

ADDR = ('0.0.0.0', 12345) BUFSIZ = 65535

udpSerSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udpSerSock.bind(ADDR)

while True:

print 'waiting for connection...'

data, addr = udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto(data, addr)

print '...recevied from {0}: {1}'.format(addr, data)

udpSerSock.close()

客户端

 

结论

在多IP且UDP的场景下, 如果使用了bind 0.0.0.0 这种方式, 操作系统会自动选择数据包回复的源地址, 默认 为默认路由对应接口的主IP。

解决方案

方案1:

更新服务端逻辑, 对进来的数据包进行目的地址判断, 使用正确的目的地做为发送数据的源地址, 避免系统自动选择出错(socket中的recvmsg). 

但是该方式改动较大、这个因为我们用的是boost的asio库,asio库不支持获取和修改IP_PKTINFO信息。

方案2

代码层实现分别bind 所有外网ip地址,达到和bind 0.0.0.0一样的效果。

该方式相比原方式改动最小。

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

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

相关文章

【Visual Studio】Qt 获取系统时间,并实时更新时间,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个需求来源于这个工程:【Visual Studio】Qt 的实时绘图曲线功能,使用 C 语言,配合 Qt 开发串口通信界面。 文章目录 Qt…

chatgpt赋能python:Python求和1-100的方法

Python求和1-100的方法 Python语言简介 Python是一个广泛使用的高级编程语言,其设计哲学强调代码可读性和语法简洁性。Python语言作为一门多范式的编程语言,支持对象、函数式和结构化编程等多种形式。Python应用领域广泛,如机器学习、桌面应…

chatgpt赋能python:Python求1!:介绍

Python求1!:介绍 在Python编程中,阶乘是一个常见的数学运算。阶乘指定的数的所有小于或等于其本身的正整数之积,例如,1!等于1,2!等于2乘以1,3!等于3乘以2乘以1,以此类推。 在这篇文…

【工程项目管理】工程项目管理实践报告

前言: 1.大学课程的大作业,觉得存起来也没什么用就干脆发出来了。。。 2.很可能有不严谨之处,各位看官如若发现欢迎指出~ 创作者文章管理系统 1 实践环节作业1:选题及任务分解WBS (1)选题 a.项目名称&a…

【1 beego学习 -MAC框架与ORM数据库】

0 beego的启动流程 1 入口 package mainimport ( //全局使用的路由和models_ "studyDemo/models"_ "studyDemo/routers"beego "github.com/beego/beego/v2/server/web" )func main() {beego.Run() }2 根据请求路由加载对应的控制器 package r…

【计算机组成原理】微程序控制器

目录 一、微程序控制器概述 二、微程序控制器设计方法 三、微指令执行过程 四、控制字段的编码方式 五、下址字段的设计方法 六、微程序入口地址的产生方法 一、微程序控制器概述 微程序:微指令构成的有序集合,一条指令对应一段微程序 微指令&…

【小沐学Android】Material Design设计规范之颜色篇

文章目录 1、简介1.1 Android1.2 Material Design 2、Material Design 12.1 材料设计2.2 颜色 3、Material Design 23.1 材料系统3.2 颜色 4、Material Design 34.1 颜色样式4.2 配色方案4.3 Material Theme Builder 结语 1、简介 1.1 Android 谷歌在2007年发布了第一个测试版…

chatgpt赋能python:Python清除代码:让你的项目更加优美

Python清除代码:让你的项目更加优美 随着时间推移和项目规模扩大,代码中可能会出现许多冗余、无用或重复的代码。这不仅会让代码难以维护,还会降低代码的性能和可读性。而Python作为一种高级编程语言,提供了许多工具和技术来清除…

牛客练习赛108 E.琉焰(非树边性质/线段树分治+可撤销并查集 or LCT)

题目 思路来源 官方题解 题解 针对每个连通块,单独考虑: 一方面, 任取连通块的某棵生成树, 对于任意非树边(u,v),把树边u到v上的所有边都选中,即被覆盖1次, 任取某个非树边集合S&#xff…

LangChain for LLM Application Development 基于LangChain开发大语言应用模型(下)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) LangChain for LLM Application Development 基于LangChain开发大语言应用模型(上) 一、LangChain: Q&A over Documents基于文…

bert4rec简介

1、bert4rec提出动机 用户行为动态变化,序列行为建模取得了不错的效果 单向结构限制了行为序列中隐藏信息的挖掘 序列神经网络顺序依赖,无法并行计算 为此,提出了 基于双向self-attention和Cloze task的用户行为序列建模方法。据我们所知…

解决Jenkins报错

解决Jenkins报错 1 linux空间不够问题1.1 报错现象1.2 定位问题1.3 解决措施 2 bash问题2.1 问题现象2.2 问题定位2.3 解决措施 3 虚拟环境问题3.1 问题现象3.2 问题定位3.3 解决措施 4 jenkins构建完成但一直转圈问题4.1 问题现象4.2 问题定位4.3 解决措施 5 jenkins自动化部署…

C高级6.24

一、整理grep、find、cut、tar、apt-get、dpkg、ln、ln-s指令 1.grep ----->查找字符串 grep 字符串 文件名 -w:按单词查找 -R:实现递归查找,主要用于路径是目录的情况 -i:不区分大小写 -n:显示行号 grep -w "^ubuntu" /etc/passwd ---->查找以ub…

【深度学习】RepVGG解析和学习体会

文章目录 前言0. Vgg1.RepVGG Block 详解 前言 论文名称:RepVGG: Making VGG-style ConvNets Great Again 论文下载地址:https://arxiv.org/abs/2101.03697 官方源码(Pytorch实现):https://github.com/DingXiaoH/RepV…

今天是世界Wi-Fi日!

很多人都不知道,今天其实是世界Wi-Fi日: 这个特殊的纪念日,是由无线宽带联盟(Wireless Broadband Alliance)确定的,并得到了互联城市咨询委员会 (CCAB)等组织的大力支持。 无线宽带联…

数据处理神器tidyverse!教你如何秒速搞定数据处理!

一、前言 在R语言中,tidyverse是一个庞大的数据分析生态系统,它由一系列数据可视化和数据处理软件包组成,能够极大地提高数据分析的效率和准确性。 在使用 Tidyverse 的过程中,我们会经常用到以下几个工具: ggplot2&am…

chatgpt赋能python:Python浮点数:介绍、精度和应用

Python浮点数:介绍、精度和应用 Python是一种高级编程语言,许多程序员使用Python编写计算机程序。与其他编程语言不同,Python是一种动态类型的语言,并且它处理浮点数时更加灵活。在本文中,我们将介绍Python浮点数的概…

python自动化办公——读取PPT写入word表格

Python自动化办公——读取PPT内容写入word表格 文章目录 Python自动化办公——读取PPT内容写入word表格一、需求分析二、导入依赖三、代码四、结果及总结 一、需求分析 📖由于我们知识图谱课程需要将课堂小组汇报的PPT总结成word文档,而我觉得一页一页复…

win10安装nginx的配置和使用方法(图文)

window10系统安装nginx服务,提供网页方面的服务。下面为详细图文安装配置教程。 1)下载nginx软件 官方下载地址:http://nginx.org/en/download.html 2)解压缩软件 unzip nginx-1.20.1.zip 或者 使用解压缩软件,下…

视频与AI,与进程交互(二) pytorch 极简训练自己的数据集并识别

目标学习任务 检测出已经分割出的图像的分类 2 使用pytorch pytorch 非常简单就可以做到训练和加载 2.1 准备数据 如上图所示,用来训练的文件放在了train中,验证的文件放在val中,train.txt 和 val.txt 分别放文件名称和分类类别&#xff…