日常问题1::timestamp与NAT的千丝万缕

问题描述

公有云上面部署的服务,同时开启tcp_timestamps和tcp_tw_recycle选项时,出现了大量的syn报文。经过抓包分析,发现client端的syn报文请求没有被响应,client端又触发重传,导致大量的syn报文涌入。

问题测试

尝试修改tcp_timestamps = 0,tcp_tw_recycle = 1,该问题依然存在。

尝试修改tcp_timestamps = 1,tcp_tw_recycle = 1,该问题依然存在。

尝试修改tcp_timestamps = 0,tcp_tw_recycle = 0,该问题修复。

由此确认,tcp_tw_recycle是由引起的问题。

TCP行为分析

tcp_timestamp 是 RFC1323 定义的优化选项,主要用于 TCP 连接中 RTT(Round Trip Time) 的计算,如果没有开启tcp_timestamp,rtt的计算智能依赖于本端的发送和接收时记录的时间,不利于RTT精度的计算。而RTT不准,就会引起拥塞算法的表现下降。

ps:tcp_timestamps详情请见:https://tools.ietf.org/pdf/rfc7323.pdf

为了保证传输的安全性,内核协议栈实现了PAWS,该机制要求所有来个同一个ip+port的TCP包必须具备单调递增的timestamp。当收到一个timestamp值,小于服务端记录的该五元组最后发送的timestamp值时,则会认为这是一个非法数据数据包。

tcp_tw_recycle用于启用tcp time_wait的快速回收。
注意:这个与tcp_tw_reuse,允许重用处于time wait的连接(四元组)不同。tcp_tw_recycle,是在开启tcp_timestamps时更侵略性的回收TCP连接。

问题就处在了这个参数在NAT场景下的使用tcp_tw_recycle。由于NAT必然会导致大量的源ip+port的重复,让服务端以为还是以前的某一流,但是timetstamp却是源自client的真实数据,出现了不一致性,导致内核判断错误。

linux代码的实现

3.10.x版本的实现


if (tmp_opt.saw_tstamp && 

    tcp_death_row.sysctl_tw_recycle &&  //这里需要同时开启tcp_timestamps和tw_recycle

    (dst = inet_csk_route_req(sk, &fl4, req)) != NULL &&

    fl4.daddr == saddr) {

if (!tcp_peer_is_proven(req, dst, true)) {

NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);

goto drop_and_release;

}

}

在后续的版本打入了下述
patchhttps://lists.openwall.net/netdev/2014/08/12/2

-       if (tmp_opt.saw_tstamp && tcp_death_row.sysctl_tw_recycle) {
+       if (tcp_death_row.sysctl_tw_recycle) {//只要开启了tw_recycle,就会进入。其他流程不变

再往后,内核直接干掉了recycle的配置项,patch如下

SHA-1: 4396e46187ca5070219b81773c4e65088dac50cc

* tcp: remove tcp_tw_recycle

The tcp_tw_recycle was already broken for connections

behind NAT, since the per-destination timestamp is not

monotonically increasing for multiple machines behind

a single destination address.

After the randomization of TCP timestamp offsets

in commit 8a5bd45f6616 (tcp: randomize tcp timestamp offsets

for each connection), the tcp_tw_recycle is broken for all

types of connections for the same reason: the timestamps

received from a single machine is not monotonically increasing,

anymore.

Remove tcp_tw_recycle, since it is not functional. Also, remove

the PAWSPassive SNMP counter since it is only used for

tcp_tw_recycle, and simplify tcp_v4_route_req and tcp_v6_route_req

since the strict argument is only set when tcp_tw_recycle is

enabled.

上述patch提到了4.10版本引入的 random offset timestamps特性,后面的blog还会再研究这个特性。
综上所述,在云场景的催生下,内核协议栈已经放弃了对tcp_tw_recycle的支持。
除了上述问题以外,还需要再思考几个问题

  1. 当服务端某个连接处于TIME_WAIT状态时,收到了来自同源IP+源port的SYN报文,内核的流程是什么?
    这个答案在标准里是有定义的,内核协议也有comment描述
    /*
     *  Now real TIME-WAIT state.
     *
     *  RFC 1122:
     *  "When a connection is [...] on TIME-WAIT state [...]
     *  [a TCP] MAY accept a new SYN from the remote TCP to
     *  reopen the connection directly, if it:
     *
     *  (1)  assigns its initial sequence number for the new
     *  connection to be larger than the largest sequence
     *  number it used on the previous connection incarnation,
     *  and
     *
     *  (2)  returns to TIME-WAIT state if the SYN turns out
     *  to be an old duplicate".
     */

2.当TIME_WAIT状态的连接数,超过tcp_tw_buckets的值时,内核的流程是什么?
在tcp_time_wait的处理函数里,有这么一段comment

    /* Sorry, if we're out of memory, just CLOSE this
     * socket up.  We've got bigger problems than
     * non-graceful socket closings.
     */
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容