Системные администраторы регулярно сталкиваются с сетевыми проблемами при развертывании и обслуживании программных приложений на серверах Linux. Решение этих проблем может быть сложным и отнимать много времени из-за нескольких факторов, включая сложность приложений, параллельные процессы и службы, запущенные на сервере, или даже наличие нескольких процессов, которые выполняются одновременно на одном процессоре.
Мы обсудим один из самых мощных инструментов для решения сетевых проблем: tcpdump. Но прежде чем мы приступим к отладке, мы должны сначала понять основы сети. Начнем с модели TCP/IP.
Модель TCP/IP (сокращение от Transmission Control Protocol/Internet Protocol) объединяет четыре различных протокола, развернутых в сетях. Эти протоколы представляют собой четыре уровня в модели TCP/IP:
Когда дело доходит до сложных сетевых проблем, рассмотрите возможность разбиения шагов, чтобы лучше понять процесс отладки.
Начните с понимания проблемы. Отладка усложняется из-за внутренней сложности сетей и приложений, использующих сетевые системы. Вам нужно точно определить уровень, на котором возникает проблема, и вам нужно понять ее механизм — когда и в каком контексте это происходит.
Например, один из ваших тестировщиков заметил, что загрузка файла из приложения теперь занимает примерно на 20% больше времени: время загрузки увеличилось с обычных 30 секунд до 36 секунд. Это сильный индикатор того, что где-то в сети действительно есть проблема.
В этом сценарии, чтобы изолировать и сузить проблему, вам следует сначала дважды проверить скорость сетевого интернет-соединения. Если скорость сети в порядке, вам следует исключить другие проблемы, такие как перегрузка сети, программные ошибки или проблемы безопасности.
Далее вам следует разработать рабочую теорию о том, что стоит за сетевой проблемой. Продолжая приведенный выше пример, есть много потенциальных причин увеличения времени загрузки.
В гипотетическом сценарии команда системного администрирования настроила виртуальную частную сеть (VPN) для тестовой среды веб-приложения. При загрузке файла напрямую с компьютера, использующего применяемую сеть VPN, вы не сталкиваетесь с какими-либо проблемами с производительностью. Однако они возникают при запуске автоматического тестирования загрузки файлов в кластере AWS. Это указывает на проблему с конфигурацией кластера AWS здесь.
После проверки пары и использования tcpdump для отладки сети вы обнаруживаете потерю пакета данных при загрузке файла из кластера AWS. Причиной является расстояние: текущий кластер AWS находится в регионе us-east-2, тогда как локальный VPN настроен в Сингапуре.
Кроме того, есть ненужные запросы туда и обратно. Каждый запрос на загрузку отправляется из кластера AWS через общедоступный Интернет, за которым следует локальный VPN; затем он обрабатывается Kong (API gateway) перед окончательным перенаправлением в кластер AWS, где настроена служба загрузки.
Измените домен из вашего теста автоматизации на внутренний домен настройки в том же кластере AWS — это позволит запросу на загрузку напрямую поступать к запущенной службе в кластере (вместо прохождения через VPN и последующего возврата обратно в кластер). Время загрузки из кластера AWS теперь должно занимать всего 20 секунд.
Отправленные и полученные сетевые пакеты предоставляют много информации о сетевой системе, которая может помочь нам в устранении сетевых проблем. Команда tcpdump это мощный инструмент, который собирает и анализирует эти сетевые пакеты.
Если вы застряли во время отладки, несмотря на то, что перепробовали множество различных инструментов, tcpdump может выполнить эту работу. Он поставляется с различными полезными возможностями, от отображения доступных сетевых интерфейсов до анализа захваченных пакетов, относящихся к определенному файлу.
Например, мы можем получить список сетевых интерфейсов, доступных в системе, выполнив:
tcpdump -D
Затем мы можем перехватывать пакеты данных, проходящие через сетевой интерфейс eth0, и сохранять их в файл.
sudo tcpdump -w test.pcap -i eth0
Далее, чтобы подробно просмотреть данные, полученные из сохраненного файла test.pcap, мы выполним следующее:
tcpdump -r test.pcap
Флаги TCP показывают текущее состояние TCP-соединения и помещаются в заголовок TCP. Например, чтобы проверить, завершил ли запрос отправку данных на сервер, мы можем выполнить фильтрацию по флагу FIN в заголовке TCP. Обычно используются следующие флаги:
Флаги TCP полезны для устранения неполадок в сети. Однако реализация инструмента для сбора флагов TCP сложна и требует много работы. К счастью, tcpdump поставляется с мощной функцией фильтрации, которая позволяет легко находить пакеты с определенным TCP-флагом или комбинацией TCP-флагов. Более того, мы даже можем фильтровать пакеты по IP-адресу, сетевому протоколу или источнику.
Например, мы можем фильтровать TCP-пакеты по IP хоста:
tcpdump -r test.pcap host 169.254.169.123
В качестве альтернативы мы можем фильтровать только готовые пакеты:
tcpdump -r test.pcap “tcp[tcpflags] & (tcp-syn)!=0”
Устранение неполадок в сети может быть сложной и отнимающей много времени задачей. В этой статье мы обсудили распространенные проблемы, с которыми системные администраторы сталкиваются в сетевых системах, и продемонстрировали, как использование tcpdump передовых методов, таких как фильтрация TCP-флагов, может ускорить процесс отладки.
Устранение неполадок в реальном мире может быть довольно сложным, поскольку в сетевой системе запущено множество различных служб и процессов. Ключом к эффективному решению этих сетевых проблем является определение потенциальных проблем и отладка каждой из них до тех пор, пока не будет обнаружена их первопричина.