3

我有一个带有 nginx 的 ubuntu 12.04 服务器,端口为 80

只有一条防火墙规则,涉及到端口映射端口 26 到 25

nginx 设置为侦听端口 80,最初以相当默认的方式,但现在使用

listen x.x.x.x:80 backlog=5000;

nginx 没有加载,大约每秒 50 个请求说 nginx_status

Active connections: 480 
server accepts handled requests
84618 84618 143733
Reading: 0 Writing: 4 Waiting: 474                                                                                                                    

一些(以百分比计很少)用户抱怨他们的一台计算机(例如“它只发生在家里”)似乎忽略了它的 SYN 数据包。他们可以无损失地ping通。有时他们会收到一些对 tcp 请求的响应。他们可以在安静的端口上获得响应,例如 pop 服务器。但是,通常他们会经历很长时间的休息。我有来自他们的数据包转储显示了这一点。

就我而言,我还可以看到一些IP 地址被忽略了。

例如,从 2010 端口到 80 端口的多个 SYN 数据包没有得到回复,而服务器正在完成 2031 端口上的先前连接

02:21:46.950979 IP 72.38.0.37.2010 > 64.91.255.98.80: Flags [S], seq 3835139709, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0
02:21:49.887320 IP 72.38.0.37.2010 > 64.91.255.98.80: Flags [S], seq 3835139709, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0
02:21:55.923151 IP 72.38.0.37.2010 > 64.91.255.98.80: Flags [S], seq 3835139709, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0
02:22:24.950448 IP 72.38.0.37.2031 > 64.91.255.98.80: Flags [S], seq 4138069869, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0
02:22:24.950488 IP 64.91.255.98.80 > 72.38.0.37.2031: Flags [S.], seq 248034551, ack 4138069870, win 14480, options [mss 1460,sackOK,TS val 240617577 ecr 0,nop,wscale 7], length 0
02:22:24.982809 IP 72.38.0.37.2031 > 64.91.255.98.80: Flags [.], ack 1, win 50112, options [nop,nop,TS val 372774 ecr 240617577], length 0
02:22:24.982852 IP 72.38.0.37.2031 > 64.91.255.98.80: Flags [P.], seq 1:526, ack 1, win 50112, options [nop,nop,TS val 372774 ecr 240617577], length 525
02:22:24.982869 IP 64.91.255.98.80 > 72.38.0.37.2031: Flags [.], ack 526, win 122, options [nop,nop,TS val 240617585 ecr 372774], length 0
02:22:25.016783 IP 64.91.255.98.80 > 72.38.0.37.2031: Flags [P.], seq 1:265, ack 526, win 122, options [nop,nop,TS val 240617594 ecr 372774], length 264
02:22:25.190570 IP 72.38.0.37.2031 > 64.91.255.98.80: Flags [.], ack 265, win 50079, options [nop,nop,TS val 372777 ecr 240617594], length 0
02:22:45.017288 IP 64.91.255.98.80 > 72.38.0.37.2031: Flags [F.], seq 265, ack 526, win 122, options [nop,nop,TS val 240622594 ecr 372777], length 0
02:22:45.049437 IP 72.38.0.37.2031 > 64.91.255.98.80: Flags [.], ack 266, win 50079, options [nop,nop,TS val 372976 ecr 240622594], length 0
02:22:49.998299 IP 72.38.0.37.2031 > 64.91.255.98.80: Flags [R.], seq 526, ack 266, win 0, length 0
02:23:18.883263 IP 72.38.0.37.2059 > 64.91.255.98.80: Flags [S], seq 2419025537, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0
02:23:21.890861 IP 72.38.0.37.2059 > 64.91.255.98.80: Flags [S], seq 2419025537, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0

更简单地说,在 20 秒的开始附近,这是一个来自一个 IP 的单独数据包,它没有与任何其他数据包配对(到此主机):

2:48:05.141703 IP 96.48.197.237.1275 > 64.91.255.98.80: Flags [S], seq 2682822499, win 65535, options [mss 1460,nop,wscale 2,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0

我编写了一个 perl 脚本来监视 tcpdump 并查找/报告悬空 SYN 的数量,它每隔几秒就会发现几个(随着我们不断增长的从不回复的 TCP SYN 数据包的累积计数稳步上升)。明显未回复的 SYN 的比率约为 2500 分之一。当我 ping 这些 IP 时,假设它们是可 ping 的,没有数据包丢失,与它们通信也没有问题。

内核日志中没有任何有用的信息(例如“发送 syncookies”)。

nginx有

worker_processes 8
worker_connections 4096

keepalive 已打开,open_file_cache 模块正在使用中,但我正在努力查看哪些其他变量可以静默忽略 SYN 数据包,但仅针对特定 IP 且可重复。

除了默认的 ubuntu 设置之外,sysctl.conf 还具有

# increased
net.ipv4.tcp_fin_timeout = 10
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 1024
# default
net.ipv4.tcp_tw_reuse = 0
# default
net.netfilter.nf_conntrack_tcp_loose = 1
net.ipv4.netfilter.ip_conntrack_tcp_loose = 1
# reduced
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.ipv4.tcp_ecn = 0

我以前没有遇到过这个问题,同样的受众,更早的内核 nginx,不同的硬件(这是一个虚拟服务器)。不同的数据中心。

我的“煤矿中的金丝雀”报告说,从他们的角度来看,他们在 XP 机器上看到超时和缺乏回复,但如果它通过 linux 机器设置作为代理则不会。所以他们正在对此进行调查。但是无论他们得出什么结论,我都不确定为什么我可以嗅探到端口 80 的传入 SYN 数据包,而没有在同一接口上发送后续回复数据包。

4

2 回答 2

1

根据这里的信息

https://serverfault.com/questions/235965/why-would-a-server-not-send-a-syn-ack-packet-in-response-to-a-syn-packet

关闭服务器上的 TCP 时间戳会阻止 SYN 从发送 tsval 设置为零的 SYN 数据包的 Windows XP 客户端丢弃,并且服务器上未回复的 SYN 数量变为零并保持在那里。

sysctl -w net.ipv4.tcp_timestamps = 0

我的理解是启用时间戳时 XP 堆栈的行为是众所周知的,因为它已在 linux 列表中与 ipv4 进行了讨论,并且在某个时间点,启用 tcp_timestamps 的 linux 只需切换到与 XP 的非时间戳会话(或其他有缺陷的客户)。似乎这种行为已经改变,现在至少在繁忙的端口上,如果 tcp_timestamps 为 1,则丢弃 tsval 为 0 的 SYN 数据包

于 2013-07-22T00:06:58.167 回答
0

您的系统是否启用了三向同步检查?听起来它正在检查三向握手,并且某些数据包没有通过此检查,即使它们不是恶意的,它们也被丢弃了。

检查或发布您的所有配置和/或检查您的路由器/防火墙,因为此选项通常默认设置。

于 2013-07-21T07:26:18.650 回答