几周前,我们开始注意位于华盛顿的追踪api的服务器网络流量有很大的变化。从一个相当稳定的日常模式下,我们开始看到300-400 mbps尖峰流量,但我们的合法的流量(事件和人为更新)是不变的。
突然,我们的网络流量开始飙升像疯了似的。
找到虚假的流量来源是当务之急,因为这些尖峰流量正触发我们的上游路由器启动ddos减灾模式来阻止流量。
有一些很好的内置的linux工具帮助诊断网络问题。
ifconfig 会显示你的网络接口和多少数据包通过他们
ethtool -s 会显示你的数据包流的一些更详细的信息,象在网卡级丢弃的数据包的数量。
iptables -l -v -n 将显示你的各种防火墙规则处理数据包数。
sysctl -a | grep net.ip 将显示你所有kernel中网络相关的设置。
此计数器的通常速率在未受影响的服务器上一般是 30-40 /秒,所以我们知道肯定是哪里出问题了。计数器表明我们正拒绝大量的包,因为这些包含有无效的 tcp 时间戳。临时的快速解决方案是用下面的命令关闭 tcp 时间戳:
<code>sysctl -w net.ipv4.tcp_timestamps=0</code>
在 mixpanel,每当我们看到异常流量模式的时候,我们一般也运行 tcpdump,这样我们能够分析流量,然后试图确定根本原因。我们发现大量的 tcp ack 数据包在我们的 api 服务器和一个特定的 ip 地址之间来回发送。结果我们的服务器陷入到向另一台服务器来来回回发送 tcp ack 包的无限循环里面。一个主机持续地发出 tcp 时间戳,但是另一主机却不能识别这是有效的时间戳。
我们将接受这个补丁而且将之移植到当前正在使用的ubuntu(trusty)内核当中。感谢ubuntu让这一切变得非常简单,重新编译修补过的内核仅仅只需要运行下面的命令,安装生成的.deb包并重启系统。
<code># 下载内核源代码并构建依赖</code>
<code>apt-get build-dep linux-image-3.13.0-45-generic</code>
<code>apt-get source linux-image-3.13.0-45-generic</code>
<code></code>
<code># 应用补丁</code>
<code>cd linux-lts-trusty-3.13.0/</code>
<code>patch -p1 < mitigate-tcp-ack-loops.patch</code>
<code># 构建内核</code>
<code>fakeroot ./debian/rules clean</code>
<code>fakeroot ./debian/rules binary-headers binary-generic</code>
原文发布时间:2015-04-07
本文来自云栖合作伙伴“linux中国”