← Назад к вопросам

Как проверить links установлен между хостами Linux

1.7 Middle🔥 211 комментариев
#Linux и администрирование#Сети и протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверка сетевой связности (link) между хостами в Linux

Проверка установленных сетевых связей (links) между хостами Linux — фундаментальная задача для любого DevOps-инженера, особенно при диагностике проблем инфраструктуры, развертывании микросервисов или настройке кластеров. Под "link" здесь обычно подразумевается возможность установления сетевого соединения на определенном порту и протоколе, а не только физическое соединение. Вот комплексный подход к проверке.

1. Базовые утилиты ICMP (проверка доступности хоста)

Первым делом нужно убедиться, что хост отвечает на сетевом уровне (L3). Для этого используются утилиты ping и ping6 (для IPv6).

# Базовая проверка доступности хоста по ICMP
ping -c 4 192.168.1.10
ping -c 4 example.com

# Для IPv6
ping6 -c 4 2001:db8::1
  • Ключевые параметры: -c (количество пакетов), -i (интервал), -W (таймаут ожидания ответа).
  • Важно: Отсутствие ответа на ping не всегда означает проблему с link, так как на целевом хосте или межсетевом экране может быть запрещен ICMP-трафик.

2. Проверка портов и протоколов (L4)

Если хост доступен по ICMP или нужно проверить конкретный сервис, используется проверка портов (Transport Layer, L4).

A. Утилита telnet (классический способ для TCP):

# Проверяет, может ли установиться TCP-соединение с портом 80 хоста example.com
telnet example.com 80

Если соединение установлено, вы увидите сообщение Connected to example.com. или зависший курсор (для бинарных протоколов). Если порт закрыт или недоступен — Connection refused или таймаут.

B. Утилита nc (netcat, более гибкая):

# Проверка TCP-порта (аналогично telnet, но с таймаутом)
nc -zv -w 3 example.com 443

# Проверка UDP-порта (например, для DNS)
nc -zuv -w 3 8.8.8.8 53
  • Ключевые параметры: -z (режим сканирования), -v (подробный вывод), -w (таймаут), -u (UDP).

C. Утилита nmap (профессиональный сканер портов):

# Быстрая проверка нескольких ключевых TCP-портов
nmap -p 22,80,443,8080 192.168.1.10

# Проверка, открыт ли конкретный UDP-порт
nmap -sU -p 53 192.168.1.1

3. Проверка маршрутизации (traceroute)

Если хост недоступен, важно понять, на каком участке сети обрывается связь. Для этого служит traceroute (или tracert в Windows).

# Показывает путь пакетов до целевого хоста
traceroute example.com

# Часто более удобная альтернатива с цифровыми адресами
traceroute -n 8.8.8.8

# Для IPv6
traceroute6 example.com

Утилита отправляет серию пакетов с увеличивающимся TTL (Time To Live). Каждый маршрутизатор на пути, уменьшая TTL до нуля, отправляет обратно ICMP-сообщение. Это позволяет увидеть всю цепочку хостов и выявить "узкое место".

4. Проверка DNS-разрешения

Проблема может быть не в сетевом link, а в преобразовании имени хоста в IP-адрес. Проверка DNS — обязательный этап.

# Проверка A-записи (IPv4) с помощью nslookup или host
nslookup example.com
host example.com

# Проверка с использованием конкретного DNS-сервера
nslookup example.com 8.8.8.8

# Утилита dig предоставляет наиболее детальную информацию
dig example.com A +short
dig @8.8.8.8 example.com ANY

5. Мониторинг и проверка сетевыми утилитами

Иногда нужно проанализировать сам трафик или установленные соединения.

A. Просмотр установленных соединений (netstat, ss):

# ss — современная замена netstat, показывает все установленные TCP-соединения
ss -tulnp

# Ключи: -t (TCP), -u (UDP), -l (слушающие порты), -n (цифровые адреса), -p (процессы)
# Это показывает, какие порты открыты и слушают на локальном хосте.

B. Анализ трафика (tcpdump):

# Захват пакетов на интерфейсе eth0, идущих на порт 80
sudo tcpdump -i eth0 -n 'dst port 80'

# Захват ICMP-пакетов для проверки двусторонней связи
sudo tcpdump -i any icmp

6. Автоматизация проверок для DevOps

В практике DevOps часто требуется автоматизированная проверка связности, например, в Ansible, bash-скриптах или системах мониторинга (Zabbix, Prometheus Blackbox Exporter).

Пример bash-скрипта:

#!/bin/bash
HOSTS=("web1.example.com:80" "db.internal:5432" "192.168.1.1:22")

for TARGET in "${HOSTS[@]}"; do
    HOST=${TARGET%:*}
    PORT=${TARGET#*:}
    if nc -zv -w 3 "$HOST" "$PORT" &>/dev/null; then
        echo "SUCCESS: Link to $HOST on port $PORT is UP"
    else
        echo "ERROR: Link to $HOST on port $PORT is DOWN"
    fi
done

Использование в Ansible:

- name: Test connectivity to critical services
  wait_for:
    host: "{{ item.host }}"
    port: "{{ item.port }}"
    timeout: 5
    delay: 1
  loop:
    - { host: 'api.service', port: 8080 }
    - { host: 'cache.redis', port: 6379 }

Резюме и best practices

  1. Начинайте с простого: Сначала ping для базовой доступности L3, даже учитывая его ограничения.
  2. Проверяйте сервисы напрямую: Используйте nc или telnet для проверки конкретного TCP/UDP-порта, который использует ваше приложение.
  3. Не забывайте про DNS: Всегда проверяйте разрешение имен, особенно в облачных средах.
  4. Используйте traceroute для диагностики: Если хост недоступен, эта утилита укажет, где происходит обрыв.
  5. Смотрите на локальные настройки: Убедитесь, что на исходном хосте не блокирует трафик iptables/nftables или SELinux.
  6. Автоматизируйте: Включайте проверки связности в скрипты развертывания и конфигурации инфраструктуры как код (IaC).

Таким образом, проверка link — это многоэтапный процесс, который включает не только подтверждение физической или канальной связи (L1/L2), но и гарантирует работоспособность стека сетевых протоколов вплоть до транспортного уровня (L4) для конкретных сервисов.