当前位置:首页 > 技术 > 正文内容

一次MTU问题导致的RDS访问故障

Lotus2022-11-28 14:17技术

导语

VPN是一种通过公网连接两个或多个私网站点的专用网络,使得这些站点仿佛是通过专线连接在一起。IPSec是一套协议框架,用于保证数据传输的私密性,完整性,真实性。但是VPN网络经常会带来一些连通性上的问题,通常与MTU设置的不合理有关。本文通过一个实际案例,来具体分析解决这个问题。

作者:陆信宇

一、环境拓扑


  1. 链路中,各个设备接口的MTU为1450
    MTU是数据链路层的概念,限制的是数据链路层payload的大小,即上层协议大小(包括上层协议头),例如设置主机接口mtu为1450。则在一个TCP报文中,1450 = 20字节IP头 + 20字节TCP头 + 1410TCP数据。
  2. RDS为京东智联云云数据库实例,实例中创建有400个数据库。
  3. SH_MariaDB_VM是一台上海地域的云主机,部署了mariadb服务,数据和RDS实例相同。
  4. BJ_VPNGW和SH_VPNGW分别是北京VPC和上海VPC的vpn网关
  5. bj_client所在子网和RDS所在子网通信时,下一跳为各自所在地域的vpn网关

一次MTU问题导致的RDS访问故障_数据


二、现象描述


  1. bj_client通过BJ_VPNGW连接RDS。执行show databases时,一直卡住无返回。
  2. bj_client通过BJ_VPNGW连接SH_MariaDB_VM。执行show databases正常,没有卡住的现象。


三、排查过程


  1. bj_client可以ping通RDS,telnet RDS 3306端口正常,使用mysql客户端也可以正常连接。
  2. 在BJ_VPNGW和SH_VPNGW上抓包分析。发现RDS回包正常到达SH_VPNGW,但是没有到达BJ_VPNGW。数据包在SH_VPNGW被丢弃。怀疑是MTU问题,导致丢包。
  3. 继续抓包分析RDS和SH_MariaDB_VM回包的区别。发现SH_VPNGW都给RDS和SH_MariaDB_VM回了一个IMCP Error报文,报文中指定了​​MTU next hop: 1374​​ 。但是RDS的重传报文中,ip层的Total Length一直是1450。SH_MariaDB_VM在首次被丢包后,重传报文的Total Length为1374。判断ICMP Error报文没有被正常转发给RDS服务端。后核实RDS前面还有一层LB,该LB没有转发ICMP Error。
  4. 调整bj_client接口mtu为1374之后,问题解决。


四、问题原因

由于bj_client、RDS、SH_MariaDB_VM的mtu都是1450,所以bj_client与RDS、SH_MariaDB_VM进行TCP三次握手时,协商的MSS大小为1410(MTU - 20B ip头 - 20B tcp头)。即后续发送的TCP报文的数据部分,最大不能超过1410字节,且IP头中DF置位,不允许报文分片。

bj_client连接RDS执行show databases命令。由于请求包较小,所以请求报文可以正常通过vpn网关到达RDS。RDS收到报文后开始响应。由于RDS中数据库很多,所以响应报文会拆分成多个进行发送,每个报文的TCP数据部分是1410字节。报文到达VPN网关后,VPN网关在原数据包基础上再次封装ESP、UDP、IP,封装之后的报文大小超过了VPN网关出接口的mtu值,又因为数据包不允许分片,导致VPN网关丢弃报文。VPN网关丢弃报文之后,会向RDS发送一个ICMP Error,指明mtu of next hop: 1374 ,告知RDS以1374为最大mtu发包。但是因为RDS实例前面还有一层LB,且这个LB不会转发ICMP Error报文,导致ICMP Error报文并没有到达真正的RDS服务端,最终导致RDS没有调整数据包大小就直接重传,数据包再次被vpn网关丢弃,进入死循环。


五、解决方案

根据以上分析,有三种解决方法。

  1. 调小服务端或者客户端mtu,让两端在建立三次握手协商mss时,以更小的mss收发数据。可以设置为ping探测的路径MTU值。
  2. 在VPN网关配置​​iptables -t mangle -A FORWARD -o eth0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu​​ 。两端建立三次握手的报文到达vpn网关时,修改MSS值,使MSS自适应PMTU(Path MTU)
  3. 保证icmp error报文可达


六、其他

  1. 什么是MTU
    MTU是数据链路层的概念,限制的是数据链路层payload的大小,即上层协议大小(包括上层协议头)
    例如设置主机接口mtu为1450。则在一个TCP报文中,1450 = 20字节IP头 + 20字节TCP头 + 1410TCP数据。
  2. 什么是MSS
    MSS最大报文段,是TCP中一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(注意不包含TCP头部大小)
  3. 如何探测路径MTU值
    Linux主机中: 执行​​​ping x.x.x.x -s 1422 -M do​​​ ,x.x.x.x是目标地址,-s指明icmp报文的数据部分大小(不包含icmp 8字节头部)。​​-M do​​​ 表示不允许分片。多试几次,找到临界点。以mtu为1450为例,1450 = 20字节IP头 + 8字节icmp头 + 1422数据,则-s指定为1422可以正常通过
    Windows主机中: 执行​​​ping x.x.x.x -l 1472 -f​​ ,x.x.x.x是目标地址,-l指明icmp报文的数据部分大小(不包含icmp 8字节头部)。-f表示不允许分片。
  4. 如何查看MTU

Linux: ifconfig

一次MTU问题导致的RDS访问故障_RDS_02

windows: netsh interface ipv4 show  subinterfaces

一次MTU问题导致的RDS访问故障_数据链路层_03

  1. 如何设置MTU

Linux: ifconfig
windows: netsh interface ipv4 show  subinterfaces


原文链接

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/1037.html

分享给朋友:

“一次MTU问题导致的RDS访问故障” 的相关文章

国庆节,零代码帮你搞定假期美食菜单

当国庆假期遇上美食 每一口都唇齿留香 特色美食太多,不知道吃什么? AppCube带你一分钟搞定假期美食 来一场舌尖上的旅行 零代码,让假期生活有滋有味 国庆小长假,三五好友结伴出游,最纠结的莫过于中午吃什么,晚上吃什么?翻翻攻略,当地特色美食令人眼花缭乱……体验通过AppCube设计一款“国庆假期美食菜单收集”应用,解决大家的选择困难症。 基于AppCube零代码能力,小白也能DIY应用开发...

css:利用伪类处理图片加载失败的样式问题

实现效果 实现代码 index.html <h2>未做错误处理</h2> <div style="font-size: 0"> <img src="./img/image.jpg" alt="" /> <img src="./img/image-1.jpg" alt="" /> &l...

多功能手持VH501TC采集仪如何设置振弦传感器的激励方法和激励电压

河北稳控科技多功能手持VH501TC采集仪如何设置振弦传感器的激励方法和激励电压 VH501TC 提供多种振弦传感器激励方法,以最大限度兼容所有厂家和型号的振弦传感器。 振弦传感器激励方法参数位于实时数据窗口右侧,共有 5 种方法可选,分别用 MODTH0~MODTH4 表示。各方法说明如下: 激励电压数据在屏幕上显示为 xxx/xxx 的形式,其中前面的数字表示实际的激励电压,后面的数字...

Golang依赖包的各项指标分析总结

专注于PHP、MySQL、Linux和前端开发,感兴趣的感谢点个关注哟!!!​​文章已收录​​,主要包含的技术有PHP、Redis、MySQL、JavaScript、HTML&CSS、Linux、Java、Golang、Linux和工具资源等相关理论知识、面试题和实战内容。 文章导读 在日常开发中,我们在自己的代码库中难免都会引入外部的包,或者公司内部的私有包。在引入这些包时,我们一般都...

C语言下for循环的一点技巧总结

for循环是普遍应用与各种计算机语言的一种循环方式。 一般情况下, for循环规则:for(条件一;条件二;条件三) 条件一为满足条件,也就是条件一为1时,进入这个for循环。条件二为循环条件,也就是说当条件二不满足时继续循环。条件三为循环递增条件,里面罗列循环节递增的方式。for循环在实际运行的时候是:首先判断条件一是否为1,为1时进入循环内的下一步,为0跳过整个for循环。其次判断条件二是否为...

一次服务器被入侵的处理过程分享

下文中的,给文件和目录加锁,是指给文件和目录增加了一些属性,只读等。 chattr +ia 目录 一、服务器入侵现象 二、服务器排查和处理 2.1、服务器被入侵的可能原因 2.2、排查和处理步骤 三、本次入侵需要带来启示的点 四、本次服务器被入侵的一些启示 一、服务器入侵现象 近期有一个朋友的服务器(自己做了网站)好像遭遇了入侵,具体现象是: 服务器 CPU 资源长期 1...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。