Устранение неполадок TCP/IP: структурированный подход. Часть 2. Устранение неполадок в таблицах маршрутизации

Опубликовано: 24 Марта, 2023
Устранение неполадок TCP/IP: структурированный подход. Часть 2. Устранение неполадок в таблицах маршрутизации

  • Устранение неполадок TCP/IP: структурированный подход. Часть 4. Использование Netdiag.exe

В первой статье этой серии я описал структурированный подход к устранению неполадок, связанных с сетями TCP/IP в сетях на основе Windows. Ключом к этому структурированному подходу были три вещи:

  • Понимание сетевых технологий и протоколов, лежащих в основе проблемы.
  • Определение различных элементов проблемы и их атрибутов.
  • Определение шагов и инструментов по устранению неполадок, которые следует применить для решения проблемы.

Я отобразил эти элементы в виде маркированного списка, а не нумерованного списка, потому что устранение неполадок в сети обычно не так просто, как 1-2-3. Другими словами, это часто больше искусство (т.е. основанное на интуиции), чем наука (основанная на методологии).


Получите свою копию Windows Server Hacks!

В основе сети TCP/IP лежит таблица маршрутизации, структура данных на каждом хосте в сети TCP/IP. Таблицы маршрутизации служат для следующих трех целей:

  • Они используются для хранения информации о других подсетях в сети и о том, как вы можете связаться с хостами в этих сетях.
  • Они используются для определения, на какой хост (называемый IP-адресом следующего перехода) должен быть перенаправлен каждый пакет, чтобы достичь хоста, которому этот пакет в конечном итоге предназначен.
  • Они используются для определения того, какой сетевой интерфейс (называемый интерфейсом следующего перехода) следует использовать для пересылки этого пакета, чтобы он дошел до своего конечного пункта назначения.

Поэтому понимание таблиц маршрутизации необходимо, если вы хотите эффективно устранять проблемы с маршрутизацией в сети TCP/IP. Давайте посмотрим, как работают таблицы маршрутизации, как они выглядят в разных сценариях и какие шаги и инструменты устранения неполадок могут быть указаны в разных ситуациях. Мы начнем с изучения таблицы маршрутизации на односетевом сервере (сервере с одним сетевым интерфейсом), которому назначен один IP-адрес. Я выбрал этот пример, потому что его проще всего понять, а в следующей статье в следующем месяце мы рассмотрим более сложные сценарии, включая серверы с несколькими IP-адресами (например, веб-серверы) и серверы с несколькими сетевыми интерфейсами (например, серверы, подключенные как к локальной сети, так и к отдельной сети, используемой для выполнения заданий резервного копирования).

Таблица маршрутизации для односетевого сервера с одним IP-адресом

Следующая таблица маршрутизации предназначена для сервера с IP-адресом 172.16.11.30 в сети 172.16.11.0/24:

C:>распечатать маршрут

 

Таблица маршрутизации IPv4

================================================= ==========================

Список интерфейсов

0x1 ……………………… Интерфейс MS TCP Loopback

0x10003 …00 03 ff 25 88 8c …… Адаптер PCI Fast Ethernet на базе Intel 21140

(общий)

================================================= ==========================

================================================= ==========================

Активные маршруты:

Сетевое назначение        Сетевая маска          Шлюз       Интерфейс  Метрика

          0.0.0.0          0.0.0.0      172.16.11.1     172.16.11.30     20

        127.0.0.0        255.0.0.0        127.0.0.1        127.0.0.1      1

      172.16.11.0    255.255.255.0     172.16.11.30     172.16.11.30     20

     172.16.11.30  255.255.255.255        127.0.0.1        127.0.0.1     20

   172.16.255.255  255.255.255.255     172.16.11.30     172.16.11.30     20

        224.0.0.0        240.0.0.0     172.16.11.30     172.16.11.30     20

  255.255.255.255  255.255.255.255     172.16.11.30     172.16.11.30      1

Шлюз по умолчанию:       172.16.11.1

================================================= ==========================

Постоянные маршруты:

  Никто

Чтобы отобразить эту таблицу маршрутизации, вы открываете окно командной строки и вводите route print в командной строке. Давайте разберем эту таблицу, чтобы мы могли понять, как она работает.

Каждая запись маршрутизации (или маршрут) в таблице маршрутизации состоит из пяти полей:

  • Сетевое назначение. IP-адрес или подсеть, представляющие возможный целевой пункт назначения, на который могут пересылаться IP-пакеты.
  • Сетевая маска. Битовая маска, используемая для сопоставления поля назначения в IP-адресе пакета с одним из возможных сетевых назначений, указанных выше.
  • Шлюз. IP-адрес следующего перехода, на который должен быть перенаправлен пакет для достижения конкретной сети назначения.
  • Интерфейс. Интерфейс следующего перехода, который необходимо использовать для пересылки пакета в конкретную сеть назначения.
  • Метрика. Стоимость маршрута.

Пример 1. Целевой хост в локальной подсети

Для нашего первого примера предположим, что этот конкретный сервер (172.16.11.30) должен отправить пакет другому хосту с IP-адресом 172.16.11.80, который находится в той же подсети. Таким образом, этот пакет будет иметь адрес источника 172.16.11.30 и адрес назначения 172.16.11.80. Вот как Windows использует свою таблицу маршрутизации, чтобы решить, какой маршрут использовать:

  1. Сначала Windows по очереди берет каждый маршрут из таблицы и выполняет побитовое И между адресом назначения в пакете (172.16.11.80) и битовой маской (сетевой маской) выбранного маршрута. Вот результаты, где каждый маршрут в таблице идентифицируется своим сетевым пунктом назначения:

    Маршрут

    Сетевая маска

    172.16.11.80 И Сетевая маска

    0.0.0.0

    0.0.0.0

    0.0.0.0

    127.0.0.0

    255.0.0.0

    172.0.0.0

    172.16.11.0

    255.255.255.0

    172.16.11.0

    172.16.11.30

    255.255.255.255

    172.16.11.80

    172.16.255.255

    255.255.255.255

    172.16.11.80

    224.0.0.0

    224.0.0.0

    160.0.0.0

    255.255.255.255

    255.255.255.255

    172.16.11.80

  1. Для каждого маршрута результат этой операции И затем сравнивается с полем Network Destination маршрута, и совпадение означает, что маршрут можно использовать для пересылки пакета на адрес назначения. Если найдено более одного совпадения, Windows использует маршрут с самым длинным совпадением (маршрут, маска сети которого имеет наибольшее число битов 1). Если это не приводит к уникальному совпадению, Windows использует совпадение с наименьшей стоимостью (показатель). Наконец, если несколько совпадений имеют одинаковую наименьшую стоимость, Windows произвольно выбирает одно из них в качестве маршрута для использования. Из приведенной выше таблицы вы можете видеть, что этот процесс И приводит к двум совпадениям (маршруты 1 и 3), поэтому Windows выбирает тот, который имеет самое длинное совпадение, то есть строку 3. Результатом всего этого является то, что Windows теперь знает, какой маршрут использовать, чтобы доставить этот пакет к месту назначения. Вот как этот маршрут выглядит в таблице маршрутизации сервера:

    Сетевое назначение        Сетевая маска          Шлюз       Интерфейс  Метрика

          172.16.11.0    255.255.255.0     172.16.11.30     172.16.11.30     20

  1. Windows теперь использует следующий алгоритм, чтобы решить, что делать дальше:
    1. Если поле шлюза маршрута совпадает с адресом одного из сетевых интерфейсов на сервере (или если шлюз пуст), то Windows отправляет пакет непосредственно на адрес назначения, используя интерфейс, указанный в маршруте.
    2. Если поле шлюза маршрута не соответствует адресу ни одного из сетевых интерфейсов на сервере, то Windows отправляет пакет на адрес, указанный в поле шлюза маршрута.

Очевидно, здесь имеет место условие А, поскольку поле шлюза маршрута (172.16.11.30) — это адрес, присвоенный единственной сетевой карте сервера. Таким образом, Windows определяет, что адрес назначения находится в локальной подсети, а это означает, что Windows может отправить пакет непосредственно на этот адрес, не перенаправляя его на какие-либо маршрутизаторы. Таким образом, в этом случае Windows просто отправляет пакет на адрес 172.16.11.80, используя сетевой интерфейс сервера 172.16.11.30, и хост-получатель получает его.

Пример 2. Целевой хост в удаленной подсети

Теперь давайте повторим тот же процесс, но на этот раз предположим, что сервер пытается отправить пакет на хост в другой подсети, скажем, на хост с адресом 172.16.10.200. Другими словами, пакет имеет адрес отправителя 172.16.11.30 и адрес получателя 172.16.10.200. Вот как Windows использует свою таблицу маршрутизации, чтобы решить, какой маршрут использовать на этот раз:

  1. Windows берет каждый маршрут из таблицы и выполняет побитовое И между адресом назначения в пакете (172.16.10.200) и битовой маской (сетевой маской) маршрута. На этот раз результаты такие:

Маршрут

Сетевая маска

172.16.10.200 И Сетевая маска

0.0.0.0

0.0.0.0

0.0.0.0

127.0.0.0

255.0.0.0

172.0.0.0

172.16.11.0

255.255.255.0

172.16.10.0

172.16.11.30

255.255.255.255

172.16.10.200

172.16.255.255

255.255.255.255

172.16.10.200

224.0.0.0

224.0.0.0

160.0.0.0

255.255.255.255

255.255.255.255

172.16.10.200

  1. Для каждого маршрута результат операции И сравнивается с полем Network Destination маршрута, и совпадение означает, что маршрут можно использовать для пересылки пакета на адрес назначения. Из нашей второй таблицы выше вы можете видеть, что на этот раз есть только одно совпадение, т. е. первая строка, где поле Network Destination 0.0.0.0 соответствует результату действия AND. Таким образом, маршрут, который Windows будет использовать для пересылки пакета к месту назначения, будет следующим:

    Сетевое назначение        Сетевая маска          Шлюз       Интерфейс  Метрика

              0.0.0.0          0.0.0.0      172.16.11.1     172.16.11.30     20

  1. Затем Windows использует ранее описанный алгоритм, чтобы решить, что делать дальше, и на этот раз имеет место условие B, поскольку поле шлюза маршрута (172.16.11.1) не соответствует адресу, назначенному единственной сетевой карте сервера, то есть 172.16..11.30. Таким образом, Windows определяет, что адрес назначения находится в удаленной подсети, и это означает, что Windows не может отправить пакет напрямую в пункт назначения, а вместо этого должна переслать пакет маршрутизатору, который затем позаботится о доставке пакета в пункт назначения, перенаправив его дальше.. Таким образом, в этом случае Windows отправляет пакет на адрес, указанный в поле Шлюз выбранного маршрута (172.16.11.1), используя сетевой интерфейс сервера 172.16.11.30. Как только маршрутизатор с адресом 172.16.11.1 получает пакет, он определяет, какие действия необходимо предпринять для пересылки пакета в конечный пункт назначения 172.16.10.200, и, конечно, это зависит от того, является ли сеть 172.16.11.10/24 сетью 172.16.11.10/24. соседней подсети к 172.16.11.11/24 (т.е. соединенной с ней одним маршрутизатором) или удаленной сети (соединенной серией маршрутизаторов с промежуточными сетями между ними).

Советы по устранению неполадок

Что может выйти из строя в описанном выше процессе? Во-первых, возможно, что Windows не сможет выбрать маршрут, поле Network Destination которого соответствует побитовому И поля Netmask маршрута и адреса назначения пакета. Если это произойдет, у вас есть ошибка маршрутизации, и об этом, вероятно, вам укажет какое-то сетевое приложение, работающее на вашем сервере. Обычно Windows использует TCP для уведомления верхнего уровня сетевого стека о том, что пакет не может быть отправлен, и в результате обычно появляется какое-то сообщение об ошибке.

В этой ситуации у вас, вероятно, есть либо поврежденная таблица маршрутизации, либо недопустимый постоянный маршрут в вашей таблице маршрутизации. Постоянные маршруты — это маршруты, которые вы добавляете в таблицу вручную с помощью команды route -p add и которые сохраняются после перезагрузки, поскольку их значения сохраняются в реестре. Если вы добавите недопустимые маршруты, они могут привести к странным результатам, хотя чаще всего они просто приводят к загадочному сбросу трафика.

С другой стороны, если узел назначения находится в удаленной подсети, а Windows пересылает пакет на маршрутизатор (адрес шлюза по умолчанию), и этот маршрутизатор не может выбрать маршрут, то в этом случае обычно происходит следующее: маршрут возвращается ICMP-сообщение «Destination Unreachable — Host Unreachable» на хост, отправивший пакет. В этом случае TCP уведомит верхние уровни и отобразит какое-то сообщение об ошибке.

В любой ситуации полезно изучить таблицы маршрутизации на отправляющем узле и любых промежуточных маршрутизаторах на пути к целевому узлу и посмотреть, непротиворечивы ли эти таблицы маршрутизации и не выглядят ли они поврежденными. Поврежденную таблицу маршрутизации можно восстановить (по крайней мере, на компьютерах с Windows) путем сброса стека TCP/IP с помощью команды netsh int ip reset, подробности см. в статье KB299357. Обратите внимание, что эта операция сброса не удаляет постоянные маршруты, добавленные вами в таблицу маршрутизации.

Вывод

Теперь, когда вы немного знаете о том, как работают таблицы маршрутизации и как с ними устранять неполадки, в следующей статье мы рассмотрим более сложные примеры, такие как серверы с несколькими адресами и несколькими сетевыми картами.

  • Устранение неполадок TCP/IP: структурированный подход. Часть 4. Использование Netdiag.exe