Вчера мой сервер (линодный VPS) внезапно начинал отключаться по таймауту при каждом запросе.
Я довольно неопытен в работе с сетями и хотел бы изучить процесс отладки этих проблем с подключением.
Меня смущает то, что вчера некоторые люди (мой телефон, я дома, друзья дома) могли постоянно заходить на сайт, и я вижу с помощью netstat
что соединение установлено. Я отключил межсетевые экраны и настроил iptables на прием всех подключений, чтобы исключить любые странные автоматические правила, помещающие наш IP в черный список. Я не уверен, что это актуально, но время трассировки из локальной сети истекло - трассировка с некоторых машин за пределами находит мой сервер.
Я подтвердил правильность различных настроек, сравнив их с настройками на моем сервере разработки, который работает правильно.
Следующие файлы соответствуют моей среде разработки (за исключением соответствующих IP-адресов):
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/networking/interfaces
ifconfig
Apache прослушивает порт 80, и настройка выглядит точно так же, как мой работающий сервер.
# server that doesn't work:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22008/apache2
tcp 0 0 69.164.201.172:80 71.56.137.10:57487 SYN_RECV -
# server that does work
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3334/apache2
tcp 0 0 72.14.189.46:80 71.56.137.10:57490 ESTABLISHED 20931/apache2
Каждый раз, когда я загружаю страницу один раз, netstat -an | grep :80
показывает все соединения в состоянии SYN_RECV.
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 69.164.201.172:80 71.56.137.10:56657 SYN_RECV
tcp 0 0 69.164.201.172:80 71.56.137.10:56669 SYN_RECV
tcp 0 0 69.164.201.172:80 71.56.137.10:56671 SYN_RECV
Так что SYN_RECV
означает, что сервер ожидает ACK
для отправки обратно от клиента.
Как мне отладить, отправляется ли обратно ACK? Как мне отладить, где эта связь не работает?
В вставке ниже мой сервер постоянно отправляет пакеты клиенту и не получает ответа.
Что это значит? Что клиент не получает ответа? А может я глотаю ответ где-то на сервере? Как мне узнать, как еще больше сузить виновника?
tcpdump -i eth0 -n -tttt port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2011-05-25 20:12:54.627417 IP 71.56.137.10.57160 > 69.164.201.172.80: Flags [S], seq 382527960, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
2011-05-25 20:12:54.627512 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:54.814463 IP 69.164.201.172.80 > 71.56.137.10.57157: Flags [S.], seq 604630211, ack 496040070, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:55.214482 IP 69.164.201.172.80 > 71.56.137.10.57158: Flags [S.], seq 998358186, ack 2224730755, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:57.624737 IP 71.56.137.10.57160 > 69.164.201.172.80: Flags [S], seq 382527960, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
2011-05-25 20:12:57.624793 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:12:59.014477 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:13:03.618790 IP 71.56.137.10.57160 > 69.164.201.172.80: Flags [S], seq 382527960, win 8192, options [mss 1460,nop,nop,sackOK], length 0
2011-05-25 20:13:03.618866 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:13:05.014514 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
2011-05-25 20:13:17.014504 IP 69.164.201.172.80 > 71.56.137.10.57160: Flags [S.], seq 1330600505, ack 382527961, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 6], length 0
Посмотрев на tcpdump для моего функционального сервера, я действительно вижу обратную и четвертую связь между сервером и клиентом.
00:00:00.000000 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [S], seq 34114118s [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
00:00:00.000110 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [S.], seq 2454858 win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 5], length 0
00:00:00.061827 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [.], ack 1, win 100:00:00.004292 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [P.], seq 1:597, ngth 596
00:00:00.000074 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [.], ack 597, win00:00:00.493990 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [.], seq 1:2921, ngth 2920
00:00:00.000024 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [P.], seq 2921:30, length 98
00:00:00.065135 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [.], ack 3019, wi00:00:00.034766 IP 71.56.137.10.57260 > 72.14.189.46.80: Flags [P.], seq 597:12925, length 699
00:00:00.000035 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [.], ack 1296, wi00:00:00.000457 IP 72.14.189.46.80 > 71.56.137.10.57260: Flags [P.], seq 3019:328, length 211
00:00:00.019196 IP 71.56.137.10.57262 > 72.14.189.46.80: Flags [S], seq 10674886s [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
Мы будем очень благодарны за любые предложения, пояснения или комментарии, чтобы я мог немного больше понимать TCP и, надеюсь, будет немного более полезным в следующий раз, когда мне понадобится отладить подобную проблему.
Спасибо!
На этот усталый глаз похоже, что рядом с рассматриваемым сервером возникла какая-то проблема с маршрутизацией. Пакеты приходят по одному пути, но, кажется, уходят по другому пути, и что-то с отслеживанием состояния находится на этом пути и отбрасывает странные пакеты «ACK без SYN».
Однажды со мной такое случилось. В конечном итоге у сервера была плохая сетевая маска, поэтому при поступлении трафика из другой подсети он выдавал ARP-запрос, чтобы получить MAC-адрес узла. К сожалению, для меня как маршрутизатор, так и наш балансировщик нагрузки были включены для Proxy-ARP, и балансировщик нагрузки был немного быстрее при срабатывании триггера, чем маршрутизатор. Таким образом, пакеты SYN приходили через маршрутизатор, но пытались покинуть подсеть через балансировщик нагрузки. Поскольку у LB не было соединения для этого пакета ACk, он уронил его на пол.
В вашем случае некоторые разумные маршруты трассировки могут пролить свет на проблемы сетевого пути. С затронутого сервера попытайтесь проследить маршрут до IP-адресов, которые вызывают проблему, и сделайте то же самое с тех же IP-адресов. Если вы идете разными путями, возможно, это именно то, что вам нужно.
просто была такая же проблема.
В моем случае это была неправильная конфигурация сети.
сервер был настроен с 10.0.1.111 255.255.254.0, а клиент был настроен с 10.0.0.15 255.255.255.0. Изменение сетевой маски на стороне клиента на / 23 решило мою проблему.
надеюсь, это может помочь.
с уважением tcpdump