现在的位置: 首页 > 综合 > 正文

mysql The last packet successfully received from the server was XXX seconds ago

2013年11月10日 ⁄ 综合 ⁄ 共 2855字 ⁄ 字号 评论关闭

用JDBC去连MYSQL的时候,报错The last packet successfully
received from the server was XXX seconds ago

防火墙已经打开这个IP,仍然报错,最终看了这篇文章:

iptables关于MTU数据包问题(内网VPN防火墙策略)  

2012-11-21 11:28:22|  分类: IPTABLES|字号 订阅

之前再测试puppet的时候,内网无论如何也无法连接。但是端口都是通的,问题暂时没有得到解决,一次无意跟技术中心同事的交流,他们给了解决办法,因为PDF保密性我就把文字放到这里吧。

 


案例回顾

.W负责维护管理Dorado系统,之前文件传输一直走公网,很正常。
后来大内网建成了,为了安全和快速,文件传输改走大内网。结果碰到
奇怪的问题:使用scp或者wget通过大内网传输文件时,只能
传输1KB左右大小的文件,稍大一点的文件,比如2KB以上
的文件就不能传输。当停止iptables后,则可以传输大文件。更奇怪
的事还在后面,然后再次启用iptables,大约在10分钟内仍然可以传输大
文件,但超过10分钟后,问题会重现。


公网传输文件OK.jpg

案例回顾

这个问题令W感到非常困惑:

.如果网络不通,为什么能够传输1KB的小文件?
.如果iptables权限没有问题,为什么停止iptables后就能传输大文件了?
.为什么超过10分钟后,问题会重现?


大内网传输文件ERROR.jpg

案例回顾

最初的解决办法:

.既然跟iptables有关,那就把大内网的网络权限放开:


/sbin/iptables-A INPUT -s 10.0.0.0/8 -j ACCEPT

这样问题解决了,能通过大内网正常传输文件了。由于W还有其他更重
要的任务要做,就没有深究其原因。

Z同学也碰到同样的问题:

.N天过去了,突然某天,Z叫道:“怪事!怪事!rsync通过公网可以同步
文件,通过大内网怎么就不能同步文件了呢?Rsync需要的网络权限我也
开放了啊!”,W没想到Z也遇到了同样的问题,W便将自己最初的解决
办法告诉了Z,问题也解决了。
.可问题就真的解决了吗?到底是什么原因造成的呢?
.大家一番讨论之后,还是没有结果。但大家达成了一致的看法:问题不
能就这么放过了,一定要找到根本的原因。

 

知识铺垫

.大内网:IDC 支持部正在进行的工作,使用GRE VPN技术在Internet上组
建的私有网络。目前通过北京电信通转发,使电信和联通之间的互访更
快速。
.GRE:通用路由封装协议,规定了如何用一种网络协议去封装另一种网
络协议的方法,它是一种应用非常广泛的第三层VPN隧道协议。
.MTU:最大传输单元(Maximum Transmission Unit)是指一种通信协议
的某一层上面所能通过的最大数据包大小(以字节为单位)。由于以太
网传输电气方面的限制,每个以太网帧最大不能超过1518bytes,刨去以
太网帧的帧头(源MAC+目标MAC+Type+CRC)18Bytes,那么剩下承载上
层协议的Data域(IP头+TCP头+应用数据)最大就只能有1500Bytes. 这个
值我们就把它称之为MTU。
.MSS:MaxitumSegment Size,就是TCP数据包每次能够传输的最大数据
分段。需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes,
所以往往MSS为1460。TCP协议在建立连接的时候通常要协商双方的MSS
值。

iptables关于MTU数据包问题(内网VPN防火墙策略) - vindiesel@126 - vindiesel@126的博客

 


.PMTU:在因特网上,两台主机之间的通信要经过多个网络,而每个不
同的网络在IP层可能有不同的MTU。两台通信主机路径中的最小MTU被
称作路径MTU(PMTU)。通过配置PMTU 老化时间来更改PMTU 项在缓
存中的时间。缺省情况下,PMTU 的老化时间是10 分钟。
.PMTUD:路径最大传输单元发现(Path MTU discovery)。通过在IP首
部中设置“不要分片(DF)”比特,来发现当前路径的路由器是否需要
对正在发送的IP数据报进行分片。如果一个待转发的IP数据报被设置DF
比特,而其长度又超过了MTU,那么路由器就会丢弃这个报文,并返回
一个ICMP不可达的差错报文(类型为3,代码为4:需要进行分片但设置
了不分片比特),其中填有下一跳正确的MTU。如果发送端主机接收到
这个ICMP差错控制报文,它就可以用正确的MTU重新传送这个报文,并
在以后的传输中沿用这个MTU大小。

 


案例原因

.首先通过抓包工具,发现有这样的信息:10.12.253.2 > 
10.12.91.186: ICMP 10.6.19.52 unreachable -need to frag(mtu1476)


MTU为什么是1476呢?

公司的大内网使用了GRE VPN技术。GRE隧道需要对IP包再封装,会额外增加
GRE报文头(4字节)+外层IP报文头(20字节),总共24字节。而以太网默
认的MTU为1500,减去GRE封装的24字节,因此VPN网关的MTU就变成了
1476了。

为什么会提示ICMP 10.6.19.52 unreachable -need to frag呢?

这是因为IP报文超过了路由器的MTU,因此路由器会向发送端返回一个ICMP
不可到达的差错报文,提示IP包太大了需要分片。这时要求发送端主机开放
iptables权限:icmp-type fragmentation-needed,才能收到该报文。而恰恰该
主机没有开放该权限,因此收不到ICMP差错报文。


解决办法

有以下三种解决办法(可任选其一):

.开放相应的iptables权限


/sbin/iptables-A INPUT -p icmp--icmp-type fragmentation-needed -j ACCEPT

.减小主机的MTU值


临时设置:/sbin/ifconfigeth* mtu1476

永久设置:在/etc/sysconfig/network-scripts/ifcfg-eth*文件中:

添加:MTU=1476

.更改路由器的TCP MSS数值


1500-20-20-24=1436


总结启示

.因为GRE隧道会在IP报文上,增加GRE报文头(4字节)
+外层IP报文头(20字节),总共24字节,因此会使
GRE VPN的MTU变小,为1476 Bytes。
.随着大内网的建成和完善,以后会有更多的项目会使
用大内网,很可能会遇到同样的问题,本文可以作为
一个参考。

 


.一些常见应用的MTU值


MTU值描述

1500

以太网信息包最大值,也是默认值。是没有
PPPoE和VPN的网络连接的典型设置。是各种路
由器、网络适配器和交换机的默认设置

1492

PPPoE的最佳值

1476

GREVPN的最大值

1472

使用ping的最大值(大于此值的信息包会先被分
解)

1468

DHCP的最佳值

1430

VPN和PPTP的最佳值

576

拨号连接到ISP的标准

在iptables 里加上 iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT 即正常。

抱歉!评论已关闭.