tcp 内核参数对NAT 用户的影响

鉴客 发布于 2011/10/26 11:16
阅读 493
收藏 3
NAT

非原创,前同事参详出来的,我知道一下原因,但今天遇到了,决定mark 一下。

故障现象:

NAT 用户,也就是使用同一个出口ip 的那些用户,例如,使用办公网络的用户。NAT 用户访问网站时,表现为连接不上,技术一点说,就是建立不了tcp 握手。

很奇怪吧?同一个网络的用户,我可以访问,旁边的同学就不能访问。难道是RPWT 吗?

在网上可以搜到一个很普遍的系统优化方法,修改/etc/sysctl.conf ,添加

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

sysctl -p 让内核参数生效。

以前大家通常会遇到netstat 看到很多 TIME-WAIT 状态的连接,于是就会添加以上两句,加速回收TIME-WAIT 的资源。

但是这个优化现在已经行不通了。

为了提高TCP的性能,“RFC1323 – TCP Extensions for High Performance”提出了 一个机制(http://tools.ietf.org/html/rfc1323#page-29)来替代TIME- WAIT状 态的功能。linux 实现了它。这个机制通过记录来自每台主机的每个连接的分组时间戳来实现,要求 来自同一主机的同一连接的分组所携带的时间戳要比之前记录 的时间戳新,以便 “防止回绕的序号PAWS机制“ (http://tools.ietf.org/html/rfc1323#page-17) 丢弃接收属于旧连接的延时分组。这依赖于来自每个主机的每个 TCP连接分组所携 带的时间戳要单调递增才能实现。然而经过NAT的连接,其分组携带时间戳每个用户都不同的(甚至有人写了个论文,利用这个分组的时间戳来计算NAT 后端有多少台主机 http://phrack.org/issues.html?issue=63&id=3#article),也就是说同一个ip ,携带的时间戳不会单调递增。服务器端对同一个ip 过来的包的timestamp 做一个验证,导致这些连接分组被认为是属于旧 连接的延时分组而被丢弃。

具体有多少被drop 的包呢??请看 netstat -s 的其中一行

7439 packets rejects in established connections because of timestamp

为了防止这种情况呢,也很简单,修改一下内核参数,把 /proc/sys/net/ipv4/tcp_tw_{reuse,recycle} 的值都置为 0 吧。

文章出处:http://blog.helosa.org/2011/04/21/tcp-kernel-nat.html

加载中
0
ddatsh
ddatsh

不知在什么发行版会出现

WIN中 netstat -s 没有reject xx

0
netexr
netexr
要是把TCP的时间戳关闭呢?
返回顶部
顶部