Маршрутизация.
Маршрутизация -- широкая тема, и о ней можно можно написать очень много. Для большинства, однако, схема маршрутизации будет достаточно простой, поэтому здесь будет рассмотрены только базовые вопросы, связанные с маршрутизацией. Если Вы интересуетесь этой темой, то можете обратиться к источникам, указанным в начале этого документа.
Начнем с определения. Итак, что же такое IP-маршрутизация?
IP-маршрутизацией называется процесс, при помощи которого машина с несколькими сетевыми интерфейсами выбирает, через какой из интерфейсов послать полученный IP-пакет.
Проиллюстрируем это определение на примере. Представьте себе обычный офисный маршрутизатор, который имеет PPP-соединение с интернетом, несколько подключенных сегментов локальной ethernet-сети и PPP-соединение с другим офисом. Когда через один из интерфейсов на маршрутизатор приходит IP-пакет, маршрутизатор должен решить, через какой из интерфейсов отправлять этот пакет далее. Даже простым машинам может потребоваться маршрутизировать пакеты, так как они имеют по меньшей мере два интерфейса -- один кольцевой, описанный выше, и второй, через который они подключены к реальной сети, например ethernet-интерфейс, или интерфейс подключения по последовательным линиям PPP или SLIP.
Как же происходит маршрутизация? На каждой машине хранится специальный список правил маршрутизации, называемый таблицей маршрутизации. Любая строка этой таблицы как правило содержит по меньшей мере три поля. Первое поле -- адрес назначения, второе -- имя интерфейса, через который следует отправлять пакеты, и третье -- IP-адрес машины, через которую будут передаваться пакеты. В Линуксе, Вы можете просмотреть таблицу маршрутизации с помощью следующей команды:
user% cat /proc/net/route
или одной из команд:
user% /sbin/route -n user% netstat -r
Процесс маршрутизации достаточно прост: когда машина получает IP-пакет, его адрес назначения (адрес машины, на которую отправлен этот пакет) сверяется с каждой строкой таблицы маршрутизации. Выбирается подходящая строка и пакет передается через указанный в этой строке интерфейс. Если поле адреса `машины-передатчика' заполнено, то пакет передается на эту машину, иначе считается, что адресат пакета находится в сети, к которой подключен данный интерфейс.
Для управления таблицей маршрутизации используется программа `route'. Эта программа преобразует свои аргументы в параметры вызова ядра, и ядро добавляет, удаляет или изменяет строки в таблице маршрутизации.
Простой пример. Представьте себе, что у вас есть ethernet-сеть. Она организована как сеть класса C с адресом '192.168.1.0'. Вашей машине был выделен адрес '192.168.1.10' и было сказано, что маршрутизатор, через который Ваша сеть подключена к интернету находится по адресу '192.168.1.1'.
Первым делом Вы должны настроить сетевой интерфейс. Команда будет выглядеть так:
root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
После этого Вы должны добавить в таблицу маршрутизации на Вашей машине строку, согласно которой пакеты на машины с адресами `192.168.1.*' ядро должно отправлять через интерфейс eth0. Это делается с помощью следующей команды:
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
Обратите внимание на использование опции `-net'. Эта опция указывает, что адрес назначения в таблице маршрутизации будет адресом сети. С помощью опции `-host' вы можете задать маршрут на конкретный IP-адрес.
Этот маршрут позволит вам устанавливать IP-соединения со всеми машинами в вашем локальном ethernet-сегменте. Но как быть со всеми остальными машинами?
Было бы очень сложно задавать маршруты для всех возможных IP-сетей явно, поэтому используют следующий трюк -- маршрут по умолчанию. Маршрут по умолчанию подходит для всех адресов назначения, не указанных в таблице маршрутизации. С помощью маршрута по умолчанию Вы говорите ядру -- "а все остальное отправляй туда". В нашем примере маршрут по умолчанию настраивается командой:
root# route add default gw 192.168.1.1 eth0
Опция `gw' указывает программе route что следующий аргумент -- IP-адрес или имя маршрутизатора, на который надо отправлять все пакеты, соответствующие этой строке таблицы маршрутизации.
Итак полностью настройка будет выглядеть так:
root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0 root# route add default gw 192.168.1.1 eth0
Если Вы внимательно просмотрите ваши `rc' файлы, настраивающие сеть, Вы обнаружите, что по крайней мере один из них выглядит примерно так-же, как и в нашем примере. Приведенная конфигурация -- одна из самых распространенных.
Рассмотрим теперь несколько более сложную конфигурацию маршрутизации в сети. Представьте себе, что вы должны настроить маршрутизатор из предыдущего примера. У этого маршрутизатора есть одно PPP-соединение и три подключенных ethernet-сегмента. Настройка маршрутизации будет выглядеть так:
root# route add -net 192.168.1.0 netmask 255.255.255. 0 eth0 root# route add -net 192.168.2.0 netmask 255.255.255.0 eth1 root# route add -net 192.168.3.0 netmask 255.255.255.0 eth2 root# route add default ppp0
Во всей сети только маршрутизатор должен иметь в своей таблице маршрутизации отдельные строки для каждой из подсетей. На остальных машинах связь с другими сегментами локальной сети будет осуществляться с помощью маршрута по умолчанию. Они будут отправлять пакеты на маршрутизатор, о тот будет передавать их в нужный сегмент сети. Вас может удивить, что маршрут по умолчанию на маршрутизаторе не использует опции `gw'. Причина проста. Протоколы соединения по последовательным линиям, такие как PPP и SLIP всегда имеют только две машины в сети -- (соединение точка-точка) поэтому указание адреса бессмысленно -- на том конце соединения только одна машина. Таким образом, для подобных соединений нет нужды указывать адрес маршрутизатора, на который надо передавать пакеты. Для других типов сетей, таких как ethernet, arcnet или token ring требуется указывать адрес маршрутизатора, так как эти сети поддерживают подключение сразу многих машин к одному сегменту сети.