TCP умирает на ноутбуке с Linux

17

Раз в несколько дней у меня возникает следующая проблема. Мой ноутбук (тестирование Debian) внезапно перестает работать с 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.

Любой совет?

Ответы на комментарии

Что это за NIC?

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

Каково состояние вашей сетевой карты, когда возникает проблема?

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 -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

Некоторые сайты действительно работают

По предложению доктора , я пробовал некоторые другие сайты, и, к моему большому удивлению, некоторые из них действительно работали. Вот некоторые работающие хосты:

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

А вот некоторые, которые этого не сделали:

  • vk.com
  • meta.ua
  • ukr.net
  • tenet.ua
  • prom.ua
  • reddit.com
  • github.com
  • stackexchange.com

Захват сети

Я сделал сетевой захват и загрузил его здесь .

Роман Чепляка
источник
1
Просто из любопытства: каково состояние вашей сетевой карты, когда возникает проблема? (/ sbin / ifconfig?)
Ив Бомес
Вы пытались прослушать трафик, фактически отправленный через интерфейс (wireshark / tcpdump ...)? Что это за NIC? Это беспроводной? Что выход iptables-save, из ip rule show, ip route show table all. Есть ли QoS на месте?
Стефан Шазелас
Обновил пост с ответами на ваши вопросы.
Роман Чепляка
1
Я не собирал драйверы из исходного кода. Сам модуль поставляется из стандартного ядра Debian (пакета linux-image-3.2.0-3-686-pae), а прошивка - из firmware-brcm80211пакета. Были ли у вас проблемы, похожие на мою? Я бы предпочел избегать сборки вещей вручную, если только это не известная проблема. Кроме того, почему проблема с модулем NIC проявляется на уровне 4?
Роман Чепляка
1
Скорее всего, что-то не так на вашей базовой станции Wi-Fi, коммутаторе или маршрутизаторе. Если возможно, попробуйте отследить пакеты (или количество пакетов) там. Если нет, попробуйте поменять их местами.
багамат

Ответы:

5

В предоставленном вами захвате эхо-ответ с отметкой времени в SYN-ACK во втором пакете не соответствует TSVal в SYN в первом пакете и отстает на несколько секунд.

И посмотрите, как все TSecr, отправленные как 173.194.70.108, так и 209.85.148.100, одинаковы и не имеют отношения к 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, просматривая заголовки запросов, полученные веб-серверами, или просматривайте поведение при запросе мертвых веб-сайтов.
  • захватывать трафик на удаленном веб-сервере, чтобы посмотреть, не искажены ли они TSVal или TSecr.
Стефан Шазелас
источник
Нет, у меня не было запущено ни одного vms / контейнера. Я попробую ваши предложения в следующий раз, спасибо.
Роман Чепляка
1
Хм .. Ваше предложение о tcp_timestamps определенно решает мою проблему. Нет проблем с Google и другим веб-сайтом вообще после установки net.ipv4.tcp_timestamps в 0 и все куча проблем снова в случае net.ipv4.tcp_timestamps = 1, но ПОЧЕМУ?
доктор
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-адрес назначения с адресом маршрутизатора. Что-нибудь интересное в сравнении трафика UDP с трафиком TCP?

Кроме того, где $devнаходится драйвер ядра (модуль) (см. ethtool -i wlan0) Для вашего беспроводного адаптера, что вам сказать modinfo "$dev"и grep . /sys/module/"$dev"/parameters/*сказать?

Стефан Шазелас
источник
Хороший улов! Я не заметил неправильные контрольные суммы. Я обновлю ответ выводом ethtool. iptables-save запускался с правами root, ничего не печатает. В следующий раз я перезапущу tcpdump, чтобы показать MAC-адреса.
Роман Чепляка
Если iptables-save ничего не возвращает, значит, что-то определенно не так. Что тебе namei -l "$(command -v iptables)"и dpkg -S "$(command -v iptables)"сказать?
Стефан Шазелас
Опубликовал вывод.
Роман Чепляка
Обновил пост с информацией о модуле.
Роман Чепляка
Благодарю. Смотрите мои правки на мой ответ. Вы также можете вставить куда-нибудь pcap для своего захвата или, может быть, вывод tshark -Viwlan0 tcpодного из этих пакетов SYN здесь?
Стефан Шазелас
1

Кажется, у меня тоже самое поведение на ноутбуке. Я не знаю причину, но время от времени я не мог подключиться к google.com и некоторым другим внешним ресурсам. Пинги и DNS-запросы работают отлично. Также я нашел только одно решение: перезагрузка .

Я мог бы добавить несколько замечаний:

  1. Если я загружу какую-либо другую ОС в моем Virtual Box (Windows, ArchLinux, Ubuntu), я могу без проблем установить TCP-соединения с проблемными хостами.
  2. Некоторые хосты в Интернете ведут себя как google.com, но есть много таких, которые обычно доступны через telnet или веб-браузер.
  3. У меня на ноутбуке нет WIFI-адаптера, у меня только Ethernet-соединение с роутером
  4. Я попытался войти в пользовательское пространство Debian / Gentoo - это не помогает
  5. Я заменил свой NIC на новый - это не помогает

Некоторая техническая информация о моей коробке:

ОС: последний 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.
доктор
Теперь я убежден, что у нас действительно одна и та же проблема ...
Роман Чепляка
Да! Я согласен. Я думаю об обновлении прошивки моего роутера на что-то вроде 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

У меня была та же проблема, которую вы описали, пока я не добавил вышеуказанную команду в мои команды iptables интернет-шлюза. По умолчанию входит в пакет rp-pppoe и другие. Но когда вы выбираете пользовательские конфигурации и не устанавливаете их вручную, компьютеры в локальной сети за шлюзом будут иметь проблемы, которые вы описываете.

Костя Бергер
источник