Диагностика сетевой доступности веб-приложений

Зачастую сетевые сбои, неполадки, ограничения со стороны провайдеров затрагивают даже самые крупные сервисы, что можно отслеживать например, через СБОЙ.РФ или DownDetector.

Платформа SimpleOne - тоже веб-сервис, для работы с ним через браузер нужна сетевая связность между устройством пользователя и той инфраструктурой с серверами, на которой запущено приложение. Если сетевая связность нарушена, TCP/IP-запросы клиента не приведут к корректным отправке и получению пакетов, могут возникать различные ошибки с разрешением DNS, таймаутами, сбросом соединения, белым экраном, зависаниями и т.д.

В текущей инструкции собираем полезные инструменты и команды (приводятся в ознакомительных целях), чтобы быстрее локализовать проблему, понять на каком уровне модели OSI она возникла и сделать выводы в чьей зоне ответственности восстановление доступности.

:hollow_red_circle: Curl

Curl — это консольная утилита для отправки сетевых запросов по URL (адрес ресурса, сайта в интернете) с широким набором доп. флагов и функций.

curl -v https://home.simpleone.ru/

Флаг -v детально показывает процесс соединения с ресурсом, запрос и ответ, из вывода станет понятно разрешается ли доменное имя в ip адрес в DNS системе, доступен ли этот ip адрес по сети, устанавливается ли шифрованное TLS соединение.

При корректной работе ресурса с приемлемой скоростью будет возвращён код HTTP/1.1 200 OK, и сообщение об установлении соединения, например Connection #0 to host home.simpleone.ru left intact.

Важно проверить, что сетевые неполадки не являются локальной проблемой, для этого можно обратиться к соседним сайтам (в этой же инфраструктуре), либо к публичным ресурсам и проверить работают ли вообще другие сайты, есть ли выход в интернет, например:

curl -v https://2ip.ru/  # возвращает Ваш IP адрес выхода в интернет
curl -v https://www.google.com/

Если наблюдаются затруднения с открытием любых ресурсов, лучше проверить скорость интернета спец. сервисами (https://speedtest.ru/), обратиться к провайдеру.

:hollow_red_circle: Ping

Ping — это простая команда для проверки, доступен ли сайт или адрес, позволяет понять:

  • доходят ли запросы до ресурса и отвечает ли он на них

  • сколько миллисекунд идёт ответ

  • есть ли потери пакетов в сети

# пинг по доменному имени с направлением 3х тестовых пакетов
ping -c 3 home.simpleone.ru

# пинг Google Public DNS, обычно так проверяют наличие Интернета
ping 8.8.8.8

При отсутствии сетевых неполадок время между ответами должно быть низкое и стабильное (без прыжков), а также не должно быть потерь пакетов 0% packet loss

:hollow_red_circle: Трассировка

Если через ping наблюдаются потери и задержки, можно использовать трассировку, чтобы посмотреть путь пакетов по промежуточным узлам.

Трассировка — это отслеживание пути сетевых пакетов от клиента до целевого сервера, с отображением всех промежуточных узлов.
Позволяет понять:

  • Где возникает задержка — на каком промежуточном узле (хопе) она появляется.

  • Где теряются пакеты — на каком участке маршрута происходит потеря пакетов.

# На Windows
tracert test.simpleone.ru

# На Linux
traceroute test.simpleone.ru
mtr test.simpleone.ru   # динамическая трассировка в реальном времени

На скрине представлен пример трассировки, где пакеты до финального узла доходят стабильно и без потерь.

Знаки * * * не являются здесь неполадкой, но свидетельствуют о том что некоторые промежуточные узлы не отвечают на ICMP-запросы.

Отсутствие ответа на последнем узле или рост задержек на конкретном из узлов помогли бы нам локализовать сетевую проблему.

:hollow_red_circle: Проверка с других устройств, сетей и локаций

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

  • Сервис Check-host - позволяет проверить доступность конкретного интернет ресурса сразу с десятка разных локаций. Доступны для проверки HTTP запросы, DNS, Ping

  • Виртуальный интерактивный вэб-браузер Browserling для тестирования работы сайта с Интернета

:glowing_star: Будем благодарны, если поделитесь в комментариях Вашими наработками по диагностике сетевых неполадок!

4 лайка

Начнем с curl.
В MacOS или Linux - это более менее одна программа. А вот MS Windows не мог не обойтись без подставы.
Сам по себе curl появился в windows начиная с Windows 10 Insider Preview build 17063 (давно, в общем). Но MS не была бы MS, если бы не сделала по своему. В powershell curl является альясом для Invoke-WebRequest (iwr) и имеет совершенно другой синтаксис. Если curl начал выдавать ошибку и требовать чего-то странного, то проверь в какой среде ты его запускаешь.

Далее речь пойдет об нормальном curl
Настроить уровень логов можно указав несколько “v”. 5 штук выведет макимально подробный лог.
curl -vvvvv https://url...

Если инстанс с самоподписанным сертификатом, то поможет ключ -k.
В противном случае будет ошибка проверки самоподписанного сертификата.

curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325) - Цепочка сертификатов выпущена центром сертификации, не имеющим доверия.
More details here: https://curl.se/docs/sslcerts.html

curl - это штука, которая легко заменяет postman, причем бесплатно и можно встраивать во всякие скрипты.

1 лайк

Продолжим.
Перед тем, как запускать curl полезно сначала узнать вообще кто-то ждет подключения к серверу?
Для это на Linux есть несколько способов.

  1. NetCat - простая программа для проверки открытости портов. Может проверять как tcp, так и udp
nc [HostName or IP] [PortNumber]
  1. nmap - мощный комбайн по взлому проверке сетей. Позволяет просканировать всю сеть или все открытые порты. По большому счету программа слишком мощная для проверки только одного отрытого порта

  2. telnet - классика. Из недостатков только что не умеет проверять udp.

telnet [HostName or IP] [PortNumber]
  1. И когда совсем ничего нет - bash.. Просто пытаемся прочитать данные из драйвера.
timeout 2 bash -c "</dev/tcp/[IP]/[PortNumber]" && echo "Порт открыт" || echo "Порт закрыт" 

Для Windows арсенал немного бедней.

  1. telnet - ничем не отличается от Linux

  2. В powershell есть аплет для проверки доступности - Test-NetConnection.

Test-NetConnection -ComputerName [HostName or IP] -Port [PortNumber]

В сокращенном виде

tnc  [HostName or IP] -p [PortNumber]

Диагностика DNS.
Т.к. SimpleOne прям критически завязана на DNS записи, то не забываем проверять правильность получаемых клиентами записей от dns сервера.
Утилиты, наобходимые для проверки:
nslookup - для Linux и Windows,
dig, host - для linux.

Описывать их уже не буду. Ибо тема достаточно большая.