找回密码
 注册
查看: 390|回复: 1

sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle : No such file or director

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-9-8 15:56:13 | 显示全部楼层 |阅读模式
sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle : No such file or directory
& L4 N: W4 V* y% x. P$ V0 N8 B4 M' @& |- r: ^

4 ]- f6 Y2 w3 b# m7 w5 f# W最近发现一个奇怪的问题,一台服务器上部署的网站,用外网访问是正常的,但是使用公司内网访问就访问不上,不仅网站访问不上,连服务器有时候都连接不上。/ m9 q5 Q" V; m# t+ {& K6 y
原因是在内核优化时启用了net.ipv4.tcp_tw_recycle参数. J1 c8 P& |. u, {- v* c1 q
这个参数是默认关闭的,之所以打开是由于这个参数开启后,可以使TCP连接中TIME-WAIT sockets的快速回收,但是在NAT网络下,导致大量的TCP连接建立错误、! c) L. k! H: c& I, U
所以在公司内部有时候能访问,有时候访问不上
# b3 a$ k0 |( _1.先确定参数
" `+ X6 f4 |8 a0 T7 ]& ]依次执行如下命令,查看当前内核配置,确认该参数值为“1”。3 w, n/ u, t" P" g- S8 v# F5 [9 y

+ S4 |6 K, n4 X4 r  W5 ]2 C; vcat /proc/sys/net/ipv4/tcp_tw_recycle% z8 J5 C8 D% r& o
cat /proc/sys/net/ipv4/tcp_timestamps% G' \9 u& z6 G: I

; c. k0 P3 [/ H* e, x* A+ K2.在/etc/sysctl.conf配置文件添加如下内容。8 a$ @4 f2 Z& R
7 l( z" f$ K! ^- I. X. j7 I) H
net.ipv4.tcp_tw_recycle=0
  `" F2 A$ U1 p7 h9 z0 S; gnet.ipv4.tcp_timestamps=0
! e" G: Z% k' _+ o5 U% p- o1 J* c2 O8 R! d, I
3.执行如下命令,使配置生效。
* ]1 T& `! \8 {7 |3 g$ o
- l* S& a1 z$ J/ y0 c7 F/ j5 q3 hsysctl -p! X8 [5 q( C& b& u

, r; v) q/ E, N) O. G& D" A1 n修改完成后,在公司中访问就正常了: M, l. u8 Y: ~) T6 z5 o
记录下,对于网上提供的调优参数还是要多注意
# y& h( B" H0 n% O9 C
$ y$ p2 X  Y% `% o9 g6 _9 t( Q# D' V; X' E" H& L7 ?7 X4 l

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-8 15:57:43 | 显示全部楼层
同事反馈从公司连接线上一台服务器有时候会失败,经过抓包发现,TCP握手过程失败。查了相关资料,发现是跟net.ipv4.tcp_tw_recycle和net.ipv4.tcp_timestamps两个参数有关,将net.ipv4.tcp_tw_recycle改为0,问题解决。7 B+ e! J1 r7 C; v) V3 ?9 |
- A4 ^+ A/ n$ W' d1 d
排查过程
2 i- Q# T* \$ U. p在PC上通过wireshark抓包发现,失败的时候,TCP syn包是一直在重传的。在server端通过tcpdump抓包发现,PC侧发的syn包是已经到达,所以基本排除网络问题。tcpdump抓包中确实看不到server端响应的syn-ack,所以基本判定问题出在server段,接下来就是分析为啥server端不响应。
" v% H, F; @) ?2 O: c; `当net.ipv4.tcp_tw_recycle = 1和net.ipv4.tcp_timestamps = 1同时间开启,当多个PC经过NAT设备访问同一server的时候,受TCP PAWS(Protect Against Wrapped Sequence Numbers)影响,后发起连接的PC可能因为tcp options中的timestamp比前面PC的timestamp小,而导致syn不被响应。
% A8 k$ ]3 H0 W3 dlinux服务器上可以通过netstat -s查看是否存在该问题。如果多次执行下面的命令,发现数字再增加,说明存在该问题,而且现在还在发生。
( D) n7 X7 W; u$ x' {0 `
9 G! ?1 F- F0 l3 z& K% x9 |  M% \[root@anonymous ~]# netstat -s | grep "connections rejected because of time stamp"26 passive connections rejected because of time stamp
. D9 [6 u/ S5 `( f! a[root@anonymous ~]#
# N" ^0 E8 z6 j) {0 j0 C' j关于PAWS的检查机制,是对于处于TIME_WAIT状态的tcp连接的对端IP,为了防止来自同一IP的延迟数据的干扰,需要在60秒(#define TCP_PAWS_MSL 60)内新来的syn报文TCP options中的timestamp是递增的。详细解释可以参考RFC1323。
  h1 P% l' K5 a" B5 h6 m0 D) B& M7 q0 Q. a+ Q; K# j4 f: j
注意
/ x5 m. f% j" m1 ?排查过程中发现,windows系统和linux系统TCP syn options中timestamp是单调递增的,所以刚才描述的问题通常在多个PC经过NAT访问同一server的时候才容易复现。而测试中发现Mac系统本身syn报文options中的timestamp波动比较大,所以此问题很容易用Mac复现,只需要对着开启recycle和tcp_timestamps的server连续发起几次请求就可以。
3 e& u$ \. c( W0 }8 dMac上的timestamp变化
. M; ?/ ]$ A0 j' N; A2 |1 o% E7 s$ E: d2 Q5 A# N. S- L$ E. j" y  s
总结
# f) S& v% s$ J该问题将net.ipv4.tcp_tw_recycle或net.ipv4.tcp_timestamps改为0都可以解决,不建议将net.ipv4.tcp_timestamps改为0,因为它对精准计算RTT(Round-Trip Time))有用。此外,tcp_tw_recycle从4.12版本内核开始被移除了。我找了一个5.14版本的测试了下,确实不支持该配置了。* q, Q/ l  _# z# ~! v" e+ }2 |$ |
) o* N/ V; X! V* R' u6 v
[root@test ~]# sysctl -p
! @; @# w) J& zsysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory( a7 N0 O3 A9 q' D9 ^& _% D/ f) Y
[root@test ~]#
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:43 , Processed in 0.017452 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表