¿Как я могу отладить эту проблему?
(У меня есть полные записи tcpdump)
У меня есть TCP-сервер, к которому многие клиенты устанавливают постоянные соединения. Обычно все эти клиенты работают, и я никогда не достигаю предельного количества подключений Linux по умолчанию 1024 (открытых файлов) для каждого процесса.
Вчера кто-то (или что-то) начал плохо себя вести и оставлял много открытых соединений, что вынудило меня перезапустить сервер. Вы можете увидеть его поведение на следующем графике netstat munin:
Каждый раз, когда количество подключений достигает 1000, я перезапускаю сервер. Только в четвертый раз плохое поведение прекратилось так же загадочно, как и началось, без всякой видимой причины. Нечто подобное произошло неделю назад.
Все плохие соединения происходят из одной (под) сети: я могу их изолировать, но есть некоторые действительные соединения, которые происходят из той же сети (поэтому я не могу запретить соединения из этой сети).
До сих пор я использовал tcpdump, ethereal и ngrep, но я не нашел способа просмотреть установленные соединения, которые не передают данные.
Спасибо!
В Wireshark перейдите в Статистика-> Беседы-> TCP. Попробуйте взглянуть на список, чтобы увидеть, не выглядит ли что-нибудь странным, например хост с аномально большим количеством подключений, переданными младшими байтами или низкой скоростью передачи. Если вам действительно нужно, вы можете скопировать данные в электронную таблицу. (Вы можете сделать что-то подобное на стороне сервера, используя netstat, например, в Linux вы можете запустить netstat -nt | sort -n -t . -k5,5 -k6,6 -k7,7 -k8,8
для вывода списка подключений, отсортированных по IP-адресу клиента).
Если проблема ограничена одним или двумя клиентами, вы можете посмотреть на их трафик, чтобы попытаться еще больше сузить проблему.
(И если вы действительно используете Ethereal, вам следует немедленно перейти на Wireshark. Раскрытие информации: я ведущий разработчик.)
Анализ протокола несложный, но утомительный. Основной процесс является итеративным, и результаты предыдущего шага служат входными данными для следующего шага анализа. По сути, вы всегда сравниваете то, что должно происходить, с тем, что происходит, и замечаете аномалии.
Я бы посоветовал начать с захвата необработанных пакетов с простого фильтра, чтобы ограничить захват проблемными подсетями. В зависимости от протокола прикладного уровня я бы ограничил размер захвата примерно 100 байтами - этого достаточно, чтобы получить заголовки TCP и протокола нижнего уровня, а также небольшую часть прикладного уровня.
Как только вы узнаете, что у вас есть пример проблемного поведения, загрузите захват необработанных пакетов в выбранный вами анализатор протокола - tcpdump, wirehark, Netscout Sniffer или что угодно. Теперь вы можете начать поиск дополнительных шаблонов, которые позволят вам изолировать проблемный трафик. Если вы можете изолировать трафик, вы можете его анализировать.
В комментарии mas дал хорошую рекомендацию для фильтрации на основе кадров SYN / ACK и проверки наличия IP-адресов с большим количеством открытых соединений.
Затем вы можете просмотреть соединения с этих IP-адресов и подсчитать, сколько из них простаивает и сколько обменивается фактическими данными.
Взгляните на данные, которыми обмениваются. Имеют ли смысл данные протокола прикладного уровня для вашего приложения? Подсчитайте количество подключений там, где это имеет смысл, по сравнению с количеством связей с аномалиями.
Для некоторых хорошо известных проблем были созданы Expert Engines, которые могут автоматизировать часть этой работы. На мой взгляд, это больше, чем IDS, Expert Engine или набор Expert Engines, которые автоматизируют анализ захвата пакетов. Вы можете найти пакет, который выполняет необходимый вам анализ. А пока вы можете начать анализировать имеющиеся у вас данные.
Если все, что у вас есть, это tcpdump, вы должны его использовать, но я предпочитаю графические анализаторы протокола, особенно если они имеют некоторые функции табуляции или построения графиков. Графический интерфейс пользователя помогает визуализировать данные и многие части пакета с удобным цветовым кодом для облегчения чтения.