10.2. Сетевые шлюзы и маршруты

Предоставил Coranth Gryphon , 6 октября 1995.

Чтобы некоторая машина могла найти другую, должен иметься механизм описания того, как добраться от одной машине к другой. Такой механизм называется маршрутизацией. "Маршрут" задается парой адресов: "адресом назначения" (destination) и "сетевым шлюзом" (gateway). Эта пара означает, что, если Вы пытаетесь соединиться с адресом назначения, то вам нужно будет пройти через "сетевой шлюз". Существует три типа адресов назначения: отдельные хосты, подсети и "маршрут по умолчанию" (default). "Маршрут по умолчанию" (default route) используется, если не подходит ни один из других маршрутов. Мы поговорим немного подробнее о маршрутах по умолчанию позже. Также имеется и три типа сетевых шлюзов: отдельные хосты, интерфейсы (также называемые "подключениями" (links)) и аппаратные адреса ethernet.

10.2.1. Пример

Для иллюстрации различных аспектов маршрутизации мы будем использовать следующий пример, который является результатом работы команды netstat -r:

    Destination	 Gateway	    Flags     Refs     Use     Netif Expire

    default 	 outside-gw	    UGSc       37      418	ppp0
    localhost	 localhost	    UH		0      181	 lo0
    test0		 0:e0:b5:36:cf:4f   UHLW	5    63288	 ed0	 77
    10.20.30.255	 link#1 	    UHLW	1     2421
    foobar.com	 link#1 	    UC		0	 0
    host1		 0:e0:a8:37:8:1e    UHLW	3     4601	 lo0
    host2		 0:e0:a8:37:8:1e    UHLW	0	 5	 lo0 =>
    host2.foobar.com link#1 	    UC		0	 0
    224		 link#1 	    UC		0	 0
        

В первых двух строках фигурируют маршрут по умолчанию (который будет описан в следующем разделе) и маршрут на localhost.

Интерфейс (колонка Netif), который будет использоваться для localhost, и который назван lo0, имеет также второе название, устройство loopback. Это значит сохранение всего трафика для указанного адреса назначения внутри, без посылки его по сети, так как он все равно будет направлен туда, откуда был создан.

Следующими выделяющимися адресами являются строчки 0:e0:.... Это аппаратные адреса ethernet. FreeBSD будет автоматически распознавать любой хост (в нашем примере это test0) в локальной сети ethernet и добавит маршрут для этого хоста, указывающий непосредственно на интерфейс ethernet, ed0. С этим типом маршрута также связан параметр таймаута (колонка Expire), используемый в случае неудачной попытки услышать этот хост в течении некоторого периода времени. В таком случае маршрут будет автоматически удален. Такие хосты поддерживаются при помощи механизма, известного как RIP (Routing Information Protocol), который вычисляет маршруты к хостам локальной сети при помощи определения кратчайшего расстояния.

FreeBSD добавит также все маршруты к подсетям для локальных подсетей (10.20.30.255 является широковещательным адресом для подсети 10.20.30, а имя foobar.com является именем домена, связанным с этой подсетью). Назначение link#1 соответствует первому сетевому адаптеру в машине. Отметьте отсутствие дополнительного интерфейса для этих строк.

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

Строка host1 относится к нашему хосту, который известен по адресу ethernet. Так как мы являемся посылающим хостом, FreeBSD знает, что нужно использовать loopback-интерфейс (lo0) вместо того, чтобы осуществлять посылку в интерфейс ethernet.

Две строки host2 являются примером того, что происходит при использовании алиасов в команде ifconfig (обратитесь к разделу об ethernet для объяснения того, почему мы это делаем). Символ => после интерфейса lo0 указывает на то, что мы используем не просто интерфейс loopback (так как это адрес, обозначающий локальный хост), но к тому же это алиас. Такие маршруты появляются только на хосте, поддерживающем алиасы; для всех остальных хостов в локальной сети в таких случаях будут показаны просто строчки link#1.

Последняя строчка (подсеть назначения 224) имеет отношение к многоадресной посылке, которая будет рассмотрена в другом разделе.

Другим столбцом, о котором стоит сказать, является Flags. Каждый маршрут имеет различные атрибуты, которые перечислены в этой колонке. Ниже приведена краткая таблица значений некоторых этих флагов и их значений:

UUp: Маршрут актуален.
HHost: Адресом назначения является отдельный хост.
GGateway: Посылать все для этого адреса назначения на указанную удаленную систему, которая будет сама определять дальнейший путь прохождения информации.
SStatic: Маршрут был настроен вручную, а не автоматически сгенерирован системой.
CClone: Новый маршрут сгенерирован на основе указанного для машин, к которым мы подключены. Такой тип маршрута обычно используется для локальных сетей.
WWasCloned: Указывает на то, что маршрут был автоматически сконфигурирован на основе маршрута в локальной сети (Clone).
LLink: Маршрут включает ссылку на аппаратный адрес ethernet.

10.2.2. Маршруты по умолчанию

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

Если все известные маршруты не подходят, у системы имеется последняя возможность: маршрут "default". Это маршрут с особым типом сетевого шлюза (обычно единственным, присутствующим в системе), и в поле флагов он всегда помечен как c. Для хостов в локальной сети этот сетевой шлюз указывает на машину, имеющую прямое подключение к внешнему миру (неважно, используется ли связь по протоколу PPP или устройство, подключенное к выделенной линии).

Если вы настраиваете маршрут по умолчанию на машине, которая сама является сетевым шлюзом во внешний мир, то маршрутом по умолчанию будет являться сетевой шлюз у Вашего провайдера Интернет (ISP).

Давайте взглянем на примеры маршрутов по умолчанию. Вот типичная конфигурация:

[Local2]  <--ether-->  [Local1]  <--PPP--> [ISP-Serv]  <--ether-->  [T1-GW]
    

Хосты Local1 и Local2 находятся в нашей сети, первый хост служит для подключения по протоколу PPP к серверу доступа вашего ISP. У Вашего провайдера имеется локальная сеть, в которой, кроме всего прочего, находится сервер, к которому вы подключены, и аппаратура (T1-GW) обеспечивающая собственное подключение провайдера к Интернет.

Маршруты по умолчанию для каждой из ваших машин будут следующими:

хостмаршрут по умолчаниюинтерфейс
Local2Local1ethernet
Local1T1-GWPPP

Часто задается вопрос "Почему (или каким образом) в качестве шлюза по умолчанию для машины Local1 мы указываем T1-GW, а не сервер провайдера, к которому подключаемся?".

Запомните, что из-за использования PPP-интерфейсом адреса в сети провайдера Интернет с вашей стороны соединения, маршруты для всех других машин в локальной сети провайдера будут сгенерированы автоматически. Таким образом, вы уже будете знать, как достичь машины T1-GW, так что нет нужды в промежуточной точке при посылке трафика к серверу ISP.

И напоследок отметим, что в локальной сети адрес ...1 часто используется в качестве адреса сетевого шлюза. Тогда (при использовании того же самого примера) если пространство адресов класса C вашей локальной сети было задано как 10.20.30, а ваш провайдер использует 10.9.9, то маршруты по умолчанию будут такие:

Local2 (10.20.30.2) --> Local1 (10.20.30.1)
Local1 (10.20.30.1, 10.9.9.30) --> T1-GW (10.9.9.1)
    

10.2.3. Хосты с двойным подключением

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

В одном случае у машины имеется два адаптера ethernet, каждый имеющий адрес в разделенных подсетях. Как альтернативу можно рассмотреть вариант с одним ethernet-адаптером и использованием алиасов в команде ifconfig. В первом случае используются два физически разделенных сети ethernet, в последнем имеется один физический сегмент сети, но две логически разделенных подсети.

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

10.2.4. Распространение маршрутов

Мы уже говорили о том, как мы задаем наши маршруты во внешний мир, но не упоминали о том, как внешний мир находит нас.

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

При получении адресного пространства, выделенного Вашей сети, Ваш провайдер настроит свои таблицы маршрутизации так, что весь трафик для Вашей подсети будет пересылаться по PPP-соединению к Вашей сети. Но как серверы по всей стране узнают, что Ваш трафик нужно посылать Вашему ISP?

Существует система (подобная распределению информации DNS), которая отслеживает все назначенные пространства адресов и определяет точку подключения к магистрали Интернет. "Магистралью" называют главные каналы, по которым идет трафик Интернет внутри страны и по всему миру. Каждая магистральная машина имеет копию основного набора таблиц, согласно которой трафик для конкретной сети направляется по конкретному магистральному каналу, и затем, передаваясь по цепочке провайдеров, он достигает вашей сети.

Задачей вашего провайдера является объявить на магистрали о том, что он отвечает за подключение (и поэтому на него указывает маршрут) вашей сети. Этот процесс называется распространением маршрута.

10.2.5. Устранение неполадок

Иногда с распространением маршрута возникают проблемы, и некоторые сайты не могут к вам подключиться. Наверное, самой полезной командой для определения точки неверной работы маршрутизации является traceroute(8). Она также полезна и когда вы сами не можете подключиться к удаленной машине (то есть команда ping(8) не срабатывает).

Команда traceroute(8) запускается с именем удаленного хоста, с которым вы хотите установить соединение, в качестве параметра. Она показывает промежуточные сетевые шлюзы по пути следования, в конце концов достигая адрес назначения или прерывая свою работу из-за отсутствия соединения.

За дополнительной информацией обратитесь к странице Справочника по traceroute(8).