Linux. Полное руководство.

19.2. Программы маршрутизации в Linux.

19.2.1. Демон routed.

Стандартной программой маршрутизации в Linux является демон routed. Этот демон, как правило, настраивается сам (динамически) и не требует конфигурирования. Обнаруженные маршруты он заносит в маршрутную таблицу ядра.

В своей работе демон routed использует протокол RIP. Чтобы воспользоваться преимуществами протоколов RIP-2 или OSFP, вы должны использовать другой демон — gated. Демон routed может работать либо в режиме сервера (-s), либо в режиме подавления сообщений. Во втором режиме он будет только получать от соседей маршрутную информацию, но сам ее отсылать не будет.

Для добавления статических маршрутов вручную служит команда route. Рассмотрим пример такого маршрута. Пусть у нас есть две сетевые платы eth0 и eth1:

# ifconfig eth0 192.168.1.1 up.

# ifconfig eth0 192.168.2.1 up.

И нам нужно обеспечить маршрутизацию между подсетями 192.168.1.0 и 192.168.2.0. С этой целью объявляем, что машины, которые находятся в вашем локальном сегменте 192.168.1.*, «сидят» на первом интерфейсе и общаться с ними нужно напрямую:

# route add net 192.168.1.0 192.168.1.1 netmask 255.255.255.0 0.

А с машинами с адресами 192.168.2.* будем разговаривать через eth1:

# route add net 192.168.2.0 192.168.2.1 netmask 255.255.255.0 0.

Последний аргумент команды route — это метрика. Ее можно понимать как «расстояние до шлюза назначения» или «сколько пересадок между шлюзами придется сделать пакету по пути туда и обратно». T.к. адреса 192.168.1.1 и 192.168.2.1 являются нашими собственными адресами, то это расстояние равно нулю.

Сетевые пакеты для IP-адресов, которые не лежат в нашей локальной сети, будем отправлять на машину 192.168.1.11, а она сама будет разбираться, что с ними делать:

# route add default 192.168.1.11 1.

Таким образом мы объявили маршрут по умолчанию со значением метрики, равным 1.

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

Забегая несколько вперед, замечу, что такой статический маршрут представляет собой обычное правило перенаправления трафика, поэтому его можно реализовать и средствами пакетного фильтра IPTables:

# iptables -P FORWARD DROP.

# iptables -A FORWARD -S 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT.

# iptables -A FORWARD -S 192.168.2.0/24 -d 192.168.1.0/24 -j ACCEPT.

А вот более сложный пример, приведенный в документации по IPTables. Пусть у нас имеется одно-единственное соединение с Интернетом и мы не хотим, чтобы кто-либо вошел в нашу сеть извне:

## Загрузим модули для отслеживания соединений.

# (не нужно, если они встроены в ядро).

# insmod ip_conntrack.

# insmod ip_conntrack_ftp.

## Создадим цепь block, которая будет блокировать.

# соединения извне.

# iptables -N block.

# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT.

# iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT.

# iptables -A block -j DROP.

## Весь входящий и маршрутизированный трафик будет.

# проходить через block.

# iptables -A INPUT -j block.

# iptables -A FORWARD -j block.

19.2.2. Демон gated — правильный выбор.

В последнее время демон gated используется чаще, чем стандартный routed. Объясняется это тем, что gated более гибок в конфигурировании и обладает большими возможностями, в частности, им поддерживаются протоколы RIP-2 и OSFP.

Программа gated была разработана группой американских университетов для работы сети NFSNET. Она позволяет организовать многофункциональный шлюз, обслуживающий как внутреннюю, так и внешнюю маршрутизацию. На данный момент gated поддерживает следующие протоколы маршрутизации:

♦ RIP версий 1 и 2.

♦ HELLO.

♦ OSPF версии 2.

♦ EGP версии 2.

♦ BGP версии 2, 3 и 4.

Таблица 19.1 поможет вам сравнить возможности демонов routed и gated.

Протоколы, поддерживаемые gated и routed Таблица 19.1.

Демон Протоколы внутренних маршрутизаторов Протоколы внешних маршрутизаторов
RIP HELLO OSPF BGP EGP
routed V1 – – – –
gated, версий 2 V1 + – V1 +
gated, версия 3 V1, V2 + V2 V2, V3 +

Рассмотрим классическое подключение локальной сети к Интернету. Пусть адрес нашей локальной сети 143.100.100.0, а на шлюзе установлены две сетевые платы с IP-адресами 143.100.100.1 и 143.100.200.1. Пусть в нашей сети есть машина с IP-адресом 143.100.100.5, на которой также установлен gated. Настроим gated сначала на этой рабочей станции, а потом — на сервере. Для настройки может использоваться утилита gdc, поставляемая вместе с самим gated.

Настройка gated осуществляется путем редактирования файла конфигурации /etc/gated.conf. Содержимое этого файла для рабочей станции приведено в листинге 19.1, а для сервера — в листинге 19.2.

Листинг 19.1. Файл конфигурации /etc/gated.conf для рабочей станции.

# Это IP-адрес рабочей станции.

Interface 143.100.100.5 passive;

# используем протокол RIP (Route Internet Protocol).

Rip yes;

Листинг 19.2. Файл конфигурации /etc/gated.conf для сервера.

# Описываем интерфейсы и протокол.

Interface 143.100.100.1 passive;

Interface 143.100.200.1 passive;

Rip yes;

Export proto rip interface 143.100.100.1.

{

 proto direct {

  announce 143.100.200.0 metric 0;

 };

};

Export proto rip interface 143.100.200.1.

{

 proto rip interface 143.100.100.1 {

  announce all;

 };

};

Первая директива export объявляет подсеть 143.100.100.0 (наша сеть) через интерфейс 143.100.100.1, который объявляется шлюзом в данную подсеть, то есть считается, что интерфейс 143.100.100.1 принадлежит узлу, входящему в эту сеть. Директива proto direct говорит о том, что пакеты для подсети нужно посылать непосредственно на интерфейс, а нулевая метрика означает, что интерфейс стоит на шлюзе в подсеть.

Вторая директива export сообщает всем узлам подсети через интерфейс 143.100.200.1 все маршруты, которые данный шлюз получает из подсети 143.100.100.0 через интерфейс 143.100.100.1.

При написании директив export внешняя конструкция всегда определяет интерфейс, через который сообщается информация, а внутренняя — источник, через который эту информацию будет получать gated.

Рассмотрим пример из документации по gated, в котором нашу сеть через подсеть подключают к Интернету (листинг 19.3).

Листинг 19.3. Подключение через подсеть.

Rip yes;

Export proto rip interface 136.66.12.3 metric 3.

{

 proto rip interface 136.66.1.5.

 {

  announce all;

 };

};

Export proto rip interface 136.66.1.5.

{

 proto rip interface 136.66.12.3.

 {

  announce 0.0.0.0;

 };

};

Первая директива export говорит о том, что gated получает все, что передается в подсеть, связывающую данную сеть с Интернетом, через интерфейс 136.66.12.3 (речь идет о маршрутах, а не о самих данных).

Вторая директива export определяет место назначения — куда по умолчанию нужно отправлять информацию из сети, чтобы она достигла адресата, который расположен за пределами локальной сети. Адрес 0.0.0.0, соответствующий любой машине за интерфейсом 136.66.12.3, определяется через интерфейс 136.66.1.5 для всей локальной сети.

После настройки gated нужно перезапустить:

# service gated restart.