Немає відповіді на деякі пакети SYN, коли включені часові позначки


9

У мене на машині прослуховується TCP-сервер ("сервер"), на якому працює Ubuntu 12.04.3 (ядро 3.8.0-31-generic). Він отримує з'єднання від двох різних клієнтських машин. Машина A працює з Ubuntu 12.04.4 (3.11.0-17-generic), а машина B працює з Ubuntu 11.10 (3.0.0-32-сервер).

Якщо часові позначки TCP включені на сервері (sysctl net.ipv4.tcp_timestamps = 1), то іноді пакети SYN з машини A "ігноруються". Використовуючи tcpdump на сервері (в нерозбірливому режимі), я можу побачити, як SYN приходять в порядку і з правильними контрольними сумами - просто немає відповіді - немає SYN / ACK і немає RST. Machine A повторно передає SYN кілька разів, перш ніж відмовитися. Клієнтське програмне забезпечення, що працює на машині A (у цьому випадку wget), негайно повторюється з новим підключенням і досягає успіху, отримуючи миттєвий SYN / ACK.

Машина B не має проблем з тим самим сервером, і трафік виглядає нормально - він використовує ті самі параметри TCP, що і машина A (що я бачу з файлів захоплення). Вимкнення часових позначок TCP на сервері змушує все працювати як слід.

Здається, часові позначки в ігнорованих пакетах SYN є для мене дійсними, тому я не впевнений, чому вони викликають проблеми чи взагалі вони є основною причиною.

Я поставив тут анонімізований pcap https://www.dropbox.com/s/onimdkbyx9lim70/server-machineA.pcap . Це було зроблено на сервері (10.76.0.74), показуючи машину A (10.4.0.76), що успішно виконує HTTP GET (пакети від 1 до 10), а потім 1 секунду пізніше, намагаючись знову отримати ту саму URL-адресу (пакети 11 - 17), але замість цього ігнорує свої SYNs. Пакети від 18 до 27 - це ще один успіх.

Я підозрюю, що це схожа проблема, що описана в " Чому сервер не надсилає пакет SYN / ACK у відповідь на пакет SYN ", а відключення часових позначок - це рішення, яке я хотів би зрозуміти, що відбувається. Це просто помилка?

Не працює локальний брандмауер. Сервер обробляє досить багато TCP-підключень (приблизно 32K за один раз), але має багато вільної пам'яті / процесора. На момент випробування, показаного на pcap, не було інших з'єднань TCP між машиною A і сервером. Немає ознак того, що черга прийому серверних додатків раптово заповнюється (крім того, це повинно впливати на обох клієнтів, я б вважав). Оскільки пакети виглядають нормально у пакеті, зробленому на сервері, схоже, що мережевий пристрій, що втручається, зламає речі.

Я спочатку розміщував це на форумах ubuntu, але, з огляду на це, це може бути більш підходящим місцем. Сподіваючись на позику підказки.

Відповіді:


5

У моєму випадку наступна команда усунула проблему з відсутніми відповідями SYN / ACK з сервера Linux:

sysctl -w net.ipv4.tcp_tw_recycle=0

Я вважаю, що це правильніше, ніж вимкнення часових позначок TCP, оскільки часові позначки TCP корисні зрештою (PAWS, масштабування вікон тощо).

У документації tcp_tw_recycleпрямо зазначено, що не рекомендується це вмикати, оскільки багато NAT-маршрутизатори зберігають часові позначки і, таким чином, PAWS запускається, оскільки часові позначки з одного і того ж IP не відповідають.

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this
          option is not recommended for devices communicating with the
          general Internet or using NAT (Network Address Translation).
          Since some NAT gateways pass through IP timestamp values, one
          IP can appear to have non-increasing timestamps.  See RFC 1323
          (PAWS), RFC 6191.

Усі машини, про які йдеться, були модернізовані, і я вважаю, що проблеми більше не виникає, тому зараз не можу спробувати. У цьому випадку між клієнтом та сервером не було залучено NAT. Це все ще здається підозрілим помилкою, як мені.
користувач133831
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.