TCP在Linux笔记本电脑上消失


17

每隔几天我就会遇到以下问题。我的笔记本电脑(经过Debian测试)突然变得无法使用与Internet的TCP连接。

以下内容可以正常运行:

  • UDP(DNS),ICMP(ping)—我得到即时响应
  • 与局域网中其他计算机的TCP连接(例如,我可以ssh到邻居笔记本电脑)
  • 局域网中的其他机器一切正常

但是,当我尝试从笔记本电脑进行TCP连接时,它们会超时(对SYN数据包无响应)。这是典型的curl输出:

% curl -v google.com     
* About to connect() to google.com port 80 (#0)
*   Trying 173.194.39.105...
* Connection timed out
*   Trying 173.194.39.110...
* Connection timed out
*   Trying 173.194.39.97...
* Connection timed out
*   Trying 173.194.39.102...
* Timeout
*   Trying 173.194.39.98...
* Timeout
*   Trying 173.194.39.96...
* Timeout
*   Trying 173.194.39.103...
* Timeout
*   Trying 173.194.39.99...
* Timeout
*   Trying 173.194.39.101...
* Timeout
*   Trying 173.194.39.104...
* Timeout
*   Trying 173.194.39.100...
* Timeout
*   Trying 2a00:1450:400d:803::1009...
* Failed to connect to 2a00:1450:400d:803::1009: Network is unreachable
* Success
* couldn't connect to host
* Closing connection #0
curl: (7) Failed to connect to 2a00:1450:400d:803::1009: Network is unreachable

重新启动连接和/或重新加载网卡内核模块无济于事。唯一有用的是重新启动。

显然我的系统出了点问题(其他所有东西都可以正常工作),但我不知道到底是什么。

我的设置是通过PPPoE连接到ISP的无线路由器。

有什么建议吗?

评论的答案

这是什么网卡?

12:00.0 Network controller: Broadcom Corporation BCM4313 802.11b/g/n Wireless LAN Controller (rev 01)
  Subsystem: Dell Inspiron M5010 / XPS 8300
  Flags: bus master, fast devsel, latency 0, IRQ 17
  Memory at fbb00000 (64-bit, non-prefetchable) [size=16K]
  Capabilities: [40] Power Management version 3
  Capabilities: [58] Vendor Specific Information: Len=78 <?>
  Capabilities: [48] MSI: Enable- Count=1/1 Maskable- 64bit+
  Capabilities: [d0] Express Endpoint, MSI 00
  Capabilities: [100] Advanced Error Reporting
  Capabilities: [13c] Virtual Channel
  Capabilities: [160] Device Serial Number 00-00-9d-ff-ff-aa-1c-65
  Capabilities: [16c] Power Budgeting <?>
  Kernel driver in use: brcmsmac

出现问题时,NIC的状态是什么?

iptables-save 什么都不打印。

ip rule show

0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

ip route show table all

default via 192.168.1.1 dev wlan0 
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.105 
broadcast 127.0.0.0 dev lo  table local  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  table local  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  table local  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  table local  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.1.0 dev wlan0  table local  proto kernel  scope link  src 192.168.1.105 
local 192.168.1.105 dev wlan0  table local  proto kernel  scope host  src 192.168.1.105 
broadcast 192.168.1.255 dev wlan0  table local  proto kernel  scope link  src 192.168.1.105 
fe80::/64 dev wlan0  proto kernel  metric 256 
unreachable default dev lo  table unspec  proto kernel  metric 4294967295  error -101 hoplimit 255
local ::1 via :: dev lo  table local  proto none  metric 0 
local fe80::1e65:9dff:feaa:b1f1 via :: dev lo  table local  proto none  metric 0 
ff00::/8 dev wlan0  table local  metric 256 
unreachable default dev lo  table unspec  proto kernel  metric 4294967295  error -101 hoplimit 255

当机器在正常模式下工作时,以上所有内容均相同。

ifconfig—我运行了它,但是以某种方式忘记了保存,然后重新启动。将不得不等到下一次出现问题。对于那个很抱歉。

是否有任何QoS?

可能不是-至少我没有做任何专门的事情来启用它。

您是否尝试嗅探接口上实际发送的流量?

我多次运行curl和tcpdump,有两种模式。

第一个只是没有答案的SYN数据包。

17:14:37.836917 IP (tos 0x0, ttl 64, id 4563, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.1.105.42030 > fra07s07-in-f102.1e100.net.http: Flags [S], cksum 0x27fc (incorrect -> 0xbea8), seq 3764607647, win 13600, options [mss 1360,sackOK,TS val 33770316 ecr 0,nop,wscale 4], length 0
17:14:38.836650 IP (tos 0x0, ttl 64, id 4564, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.1.105.42030 > fra07s07-in-f102.1e100.net.http: Flags [S], cksum 0x27fc (incorrect -> 0xbdae), seq 3764607647, win 13600, options [mss 1360,sackOK,TS val 33770566 ecr 0,nop,wscale 4], length 0
17:14:40.840649 IP (tos 0x0, ttl 64, id 4565, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.1.105.42030 > fra07s07-in-f102.1e100.net.http: Flags [S], cksum 0x27fc (incorrect -> 0xbbb9), seq 3764607647, win 13600, options [mss 1360,sackOK,TS val 33771067 ecr 0,nop,wscale 4], length 0

第二个是这样的:

17:22:56.507827 IP (tos 0x0, ttl 64, id 41583, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.1.105.42036 > fra07s07-in-f102.1e100.net.http: Flags [S], cksum 0x27fc (incorrect -> 0x2244), seq 1564709704, win 13600, options [mss 1360,sackOK,TS val 33894944 ecr 0,nop,wscale 4], length 0
17:22:56.546763 IP (tos 0x58, ttl 54, id 65442, offset 0, flags [none], proto TCP (6), length 60)
    fra07s07-in-f102.1e100.net.http > 192.168.1.105.42036: Flags [S.], cksum 0x6b1e (correct), seq 1407776542, ack 1564709705, win 14180, options [mss 1430,sackOK,TS val 3721836586 ecr 33883552,nop,wscale 6], length 0
17:22:56.546799 IP (tos 0x58, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.1.105.42036 > fra07s07-in-f102.1e100.net.http: Flags [R], cksum 0xf301 (correct), seq 1564709705, win 0, length 0
17:22:58.511843 IP (tos 0x0, ttl 64, id 41584, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.1.105.42036 > fra07s07-in-f102.1e100.net.http: Flags [S], cksum 0x27fc (incorrect -> 0x204f), seq 1564709704, win 13600, options [mss 1360,sackOK,TS val 33895445 ecr 0,nop,wscale 4], length 0
17:22:58.555423 IP (tos 0x58, ttl 54, id 65443, offset 0, flags [none], proto TCP (6), length 60)
    fra07s07-in-f102.1e100.net.http > 192.168.1.105.42036: Flags [S.], cksum 0x3b03 (correct), seq 1439178112, ack 1564709705, win 14180, options [mss 1430,sackOK,TS val 3721838596 ecr 33883552,nop,wscale 6], length 0
17:22:58.555458 IP (tos 0x58, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
    192.168.1.105.42036 > fra07s07-in-f102.1e100.net.http: Flags [R], cksum 0xf301 (correct), seq 1564709705, win 0, length 0

ethtool输出

ethtool -k wlan0

Features for wlan0:
rx-checksumming: off [fixed]
tx-checksumming: off
  tx-checksum-ipv4: off [fixed]
  tx-checksum-unneeded: off [fixed]
  tx-checksum-ip-generic: off [fixed]
  tx-checksum-ipv6: off [fixed]
  tx-checksum-fcoe-crc: off [fixed]
  tx-checksum-sctp: off [fixed]
scatter-gather: off
  tx-scatter-gather: off [fixed]
  tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: off
  tx-tcp-segmentation: off [fixed]
  tx-tcp-ecn-segmentation: off [fixed]
  tx-tcp6-segmentation: off [fixed]
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: off [requested on]
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: off [fixed]
tx-vlan-offload: off [fixed]
ntuple-filters: off [fixed]
receive-hashing: off [fixed]
highdma: off [fixed]
rx-vlan-filter: off [fixed]
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: on [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: off
loopback: off [fixed]

iptables

# namei -l "$(command -v iptables)"
f: /sbin/iptables
drwxr-xr-x root root /
drwxr-xr-x root root sbin
lrwxrwxrwx root root iptables -> xtables-multi
-rwxr-xr-x root root   xtables-multi

# dpkg -S "$(command -v iptables)"
iptables: /sbin/iptables

# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
# iptables -t mangle -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
# iptables -t security -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

模块信息

# ethtool -i wlan0                   
driver: brcmsmac
version: 3.2.0-3-686-pae
firmware-version: N/A
bus-info: 0000:12:00.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

# modinfo brcmsmac
filename:       /lib/modules/3.2.0-3-686-pae/kernel/drivers/net/wireless/brcm80211/brcmsmac/brcmsmac.ko
license:        Dual BSD/GPL
description:    Broadcom 802.11n wireless LAN driver.
author:         Broadcom Corporation
alias:          pci:v000014E4d00000576sv*sd*bc*sc*i*
alias:          pci:v000014E4d00004727sv*sd*bc*sc*i*
alias:          pci:v000014E4d00004353sv*sd*bc*sc*i*
alias:          pci:v000014E4d00004357sv*sd*bc*sc*i*
depends:        mac80211,brcmutil,cfg80211,cordic,crc8
intree:         Y
vermagic:       3.2.0-3-686-pae SMP mod_unload modversions 686 

没有/sys/module/brcmsmac/parameters。这是我在这里的东西:

# tree /sys/module/brcmsmac
/sys/module/brcmsmac
├── drivers
│   └── pci:brcmsmac -> ../../../bus/pci/drivers/brcmsmac
├── holders
├── initstate
├── notes
├── refcnt
├── sections
│   └── __bug_table
└── uevent

有些网站实际可行

正如dr博士所建议,我尝试了其他一些站点,但令我惊讶的是,其中一些确实有效。以下是一些有效的主机:

  • rambler.ru
  • google.ru
  • ya.ru
  • opennet.ru
  • tut.by
  • ro-che.info
  • yahoo.com
  • ebay.com

这里有一些没有:

  • vk.com
  • ukr.net
  • tenet.ua
  • Prom.ua
  • reddit.com
  • github.com
  • stackexchange.com

网络捕获

我进行了网络捕获并将其上传到此处


1
出于好奇:发生问题时,NIC的状态是什么?(/ sbin / ifconfig?)
yves Baumes

您是否尝试嗅探实际在接口上发送的流量(wireshark / tcpdump ...)?这是什么网卡?无线吗?什么是输出iptables-save的,ip rule showip route show table all。是否有任何QoS?
斯特凡Chazelas

用您的问题的答案更新了帖子。
Roman Cheplyaka 2012年

1
我不是从源代码构建驱动程序。该模块本身来自库存的Debian内核(软件包linux-image-3.2.0-3-686-pae),而固件来自该firmware-brcm80211软件包。您有与我类似的问题吗?我宁愿避免手工构建东西,除非这是一个已知问题。另外,为什么NIC模块问题会在第4层上显现出来?
罗曼·切普利卡

1
Wi-Fi基站,交换机或路由器上很可能出了什么问题。如果可能,请尝试在此处跟踪数据包(或数据包计数)。如果没有,请尝试将其替换为备用项。
巴哈马特2012年

Answers:


5

在您提供的捕获中,第二个数据包中SYN-ACK中的时间戳回显应答与第一个数据包中SYN中的TSVal不匹配,并且落后了几秒钟。

并查看173.194.70.108和209.85.148.100发送的所有TSecr都相同,并且与您发送的TSVal无关。

似乎有些东西与TCP时间戳混合在一起。我不知道是什么原因造成的,但听起来好像是在您的计算机外部。重新启动路由器在这种情况下是否有帮助?

我不知道这是什么导致您的计算机发送RST(在第3个数据包上)。但这绝对不喜欢SYN-ACK,这是我唯一能发现的错误。我能想到的唯一其他解释是,如果不是您的机器正在发送RST,但是考虑到SYN-ACK和RST之间的时间差,我会怀疑。但是以防万一,您是否在此计算机上使用虚拟机或容器或网络名称空间?

您可以尝试完全禁用TCP时间戳,以查看是否有帮助:

sudo sysctl -w net.ipv4.tcp_timestamps=0

因此,这些站点要么发送伪造的TSecr,要么在途中(正在运行的任何路由器,或透明的代理)处理传出的TSVal或传入的TSecr,或带有伪造的TCP堆栈的代理。为什么我会弄乱tcp时间戳,我只能推测:错误,入侵检测规避,过于智能/虚假的流量整形算法。我以前没有听说过(但是那时我不是这个领域的专家)。

如何进一步调查:

  • 查看TPLink路由器是否怪罪,为什么要重置它以查看是否有帮助或捕获外部流量(如果可能的话),以查看它是否打乱了时间戳
  • 通过播放TTL,查看Web服务器收到的请求标头或查看请求无效网站时的行为,检查是否有透明的代理。
  • 捕获远程Web服务器上的流量,以查看是否破坏了TSVal或TSecr。

不,我没有任何虚拟机/容器正在运行。下次,我将尝试您的建议,谢谢。
Roman Cheplyaka 2012年

1
Xm ..关于tcp_timestamps的建议绝对可以解决我的问题。将net.ipv4.tcp_timestamps设置为0,然后在net.ipv4.tcp_timestamps = 1的情况下再次出现所有问题,Google和其他网站完全没有问题,但是为什么?
博士

1

它说上面的校验和不正确。是否有该设备的校验和卸载(我不知道无线设备可以卸载校验和)。

什么sudo ethtool -k wlan0告诉你。如果有卸载,则可能要尝试禁用它。

您需要具有root才能调用iptables-save。仍然有一些机会在那儿处理数据包。如果iptables-save不起作用,请尝试:

iptables -nvL
iptables -t mangle -nvL
iptables -t nat -nvL
iptables -t security -nvL

在网络捕获中,目标MAC地址是否与路由器的MAC地址匹配。从UDP流量到TCP流量的比较中有什么有趣的东西吗?

另外,您的无线适配器$dev的内核驱动程序(模块)(请参阅参考资料ethtool -i wlan0)在哪里,modinfo "$dev"并且grep . /sys/module/"$dev"/parameters/*告诉您什么?


接得好!我没有注意到错误的校验和。我将使用ethtool输出更新答案。iptables-save以root身份运行,不显示任何内容。下次,我将重新运行tcpdump以显示MAC地址。
Roman Cheplyaka 2012年

如果iptables-save不返回任何内容,则肯定存在错误。什么做namei -l "$(command -v iptables)"dpkg -S "$(command -v iptables)"告诉你吗?
斯特凡Chazelas

发布输出。
Roman Cheplyaka 2012年

使用模块信息更新了帖子。
Roman Cheplyaka 2012年

谢谢。查看我对答案的修改。您是否也可以将pcap粘贴到某个地方以便捕获,或者在tshark -Viwlan0 tcp此处粘贴这些SYN数据包之一的输出?
斯特凡Chazelas

1

看来,我的笔记本电脑也有完全相同的行为。我不知道原因,但有时我无法连接到google.com和其他一些外部资源。Ping和DNS查询工作正常。另外,我仅找到一种解决方案:reboot

我可以添加一些观察结果:

  1. 如果我在Virtual Box中启动其他操作系统(Windows,ArchLinux,Ubuntu),则可以与问题主机建立TCP连接,而不会出现任何问题。
  2. 互联网中的某些主机的行为类似于google.com,但其中有许多主机通常可以使用telnet或网络浏览器进行访问
  3. 我的笔记本电脑上没有WIFI适配器,只有以太网链接到路由器
  4. 我尝试将chroot切换到debian / gentoo用户空间-它没有帮助
  5. 我已经用新的NIC代替了它-无济于事

关于我的盒子的一些技术信息:

操作系统:Last ArchLinux amd64

$ ethtool -i  eth0
driver: via-rhine
version: 1.5.0
firmware-version: 
bus-info: 0000:02:07.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

$uname -a
Linux eniac-2 3.5.4-1-ARCH #1 SMP PREEMPT Sat Sep 15 08:12:04 CEST 2012 x86_64 GNU/Linux

我想,这种错误行为的发生是由于某些版本的Linux内核中存在一些细微的错误,但是我不知道如何调试此问题,并且由于不稳定的复制,我被卡住了。


感谢分享!可以工作的主机有哪些示例?
罗曼·切普利卡

发生这种错误行为时可以工作的主机示例:opennet.ru,tut.by。
博士

我现在坚信我们确实有同样的问题……
Roman Cheplyaka 2012年

是的 我同意。我正在考虑在dd-wrt或openwrt之类的设备上更新路由器固件,或者只是降级Linux内核。您是否尝试过任何这些步骤?
博士

1
不,我很想知道这到底是怎么回事。
罗曼·切普利卡

0
/sbin/iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

在将上述命令添加 Internet网关iptables命令之前,我遇到了与您描述的问题相同的问题。在rp-pppoe软件包和其他软件包中,默认情况下包含In。但是,当您进行自定义配置并且不手动进行设置时,网关后面的LAN上的计算机将遇到您所描述的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.