Сетевые средства Linux

Маршрутизация в Linux

Разбить на страницы
Показывать лекцию целиком

Содержание

  • Включение функции пересылки проходящих пакетов.
  • Выбор IP-адреса для исходящих соединений.
  • Маршрутизация на основе правил и таблиц.
  • Включение функции пересылки проходящих пакетов

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

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

    По умолчанию сетевая подсистема Linux обрабатывает пакеты, предназначенные данному узлу или созданные данным узлом; функция обработки пакетов, в которых не указан IP-адрес данной станции как источник или приемник (forwarding, пересылка пакетов ) отключена. Для включения функции пересылки проходящих пакетов необходимо установить в 1 значение, записанное в файле ip_forward псевдофайловой системы proc:

    # echo 1 > /proc/sys/net/ipv4/ip_forward

    Данная настройка будет действовать до перезагрузки компьютера. Для восстановления конфигурации нужно после перезагрузки выполнять указанную команду (указать ее в файле /etc/rc.local ) или лучше установить в файле /etc/sysctl.conf следующий параметр:

    net.ipv4.ip_forward=1

    Пример 10.1.Объединение виртуальных локальных сетей с помощью маршрутизатора на основе Linux.

    Для того, чтобы в примере 5.6. "Постоянные сетевые конфигурации" подсети 192.168.1.0/24 и 192.168.2.0/24 могли взаимодействовать друг с другом через указанный в примере компьютер Linux (выступает в качестве шлюза для данных подсетей) необходимо:

  • на данном компьютере включить функцию пересылки пакетов одним из описанных выше способов;
  • на всех компьютерах первой подсети указать в качестве шлюза для второй подсети адрес 192.168.1.4 (разумеется, также можно указать данный адрес как шлюз по умолчанию), а для компьютеров второй подсети - шлюз для первой подсети 192.168.2.4.
  • Таблица маршрутизации шлюза:

    # ip route show
    192.168.2.0/24 dev vlan2  proto kernel  scope link  src 192.168.2.4 
    192.168.1.0/24 dev vlan1  proto kernel  scope link  src 192.168.1.4

    Эти записи добавляются в таблицу маршрутизации шлюза автоматически (например, если на интерфейсе vlan1 установлен IP-адрес 192.168.1.4/24, то система полагает, что сеть 192.168.1.0/24 непосредственно подключена к данному интерфейсу). Таким образом, если на интерфейс vlan1 шлюза приходят сетевые пакеты, в которых адрес назначения принадлежит второй подсети, то шлюз, согласно таблицы маршрутизации, передает эти пакеты в сеть с интерфейса vlan2.

    Пример 10.2.Объединение двух сетей на основе маршрутизаторов

    Пусть необходимо обеспечить взаимодействие сетей 192.168.1.0/24 и 192.168.2.0/24 (рис. 10.1.), соединенных интерфейсами маршрутизаторов, установленных в каждой из сетей (интерфейсы маршрутизаторов в сетях имеют адреса 192.168.1.1 и 192.168.2.1 соответственно).

    (рис 10.1) Объединение двух сетей на основе маршрутизаторов

    Для решения данной задачи ( рис. 10.1.) необходимо установить на интерфейсы, связывающие маршрутизаторы друг с другом адреса из одной произвольно выбранной подсети (192.168.3.0/24, на первый — 192.168.3.1, на второй — 192.168.3.2) и добавить статические маршруты в таблицы маршрутизаторов (для первого маршрутизатора - для сети 192.168.2.0/24 через узел 192.168.3.2, для второго — для сети 192.168.1.0/24 через узел 192.168.3.1).

    К примеру таблица маршрутизации первого маршрутизатора (при использовании Linux) будет иметь вид:

    # ip route show
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.1 
    192.168.3.0/24 dev eth1  proto kernel  scope link  src 192.168.3.1
    192.168.2.0/24 via 192.168.3.2 dev eth1

    Последний маршрут здесь является статическим, так как должен быть задан администратором системы вручную.

    Выбор IP-адреса для исходящих соединений

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

    Примечание: Во многих случаях сетевое программное обеспечение позволяет указывать исходный адрес с помощью параметров.

    Пример 10.3.Выбор исходящего IP-адреса

    Пусть система имеет два интерфейса eth0(192.168.1.1/24) и eth1(192.168.56.102/24):

    # ip addr show
    ...
    2: eth0:  <BROADCAST,MULTICAST,UP,LOWER_UP>  mtu 1500 qdisc pfifo_fast 
        state UP qlen 1000 link/ether 08:00:27:23:22:97 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
        inet6 fe80::a00:27ff:fe23:2297/64 scope link 
           valid_lft forever preferred_lft forever
    3: eth1:  <BROADCAST,MULTICAST,UP,LOWER_UP>  mtu 1500 qdisc pfifo_fast
        state UP qlen 1000 link/ether 08:00:27:fd:e5:aa brd ff:ff:ff:ff:ff:ff
        inet 192.168.56.102/24 brd 192.168.56.255 scope global eth1
        inet6 fe80::a00:27ff:fefd:e5aa/64 scope link 
           valid_lft forever preferred_lft forever

    Маршрут по умолчанию у данной системы - 192.168.56.1:

    # ip route show
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.1 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    При такой конфигурации для исходящих соединений будет использоваться интерфейс eth1 и IP-адрес 192.168.56.102 (кроме соединений с узлами сети 192.168.1.0/24 — eth0 и IP-адрес 192.168.1.1). Ниже показан дамп сетевого пакета, отправленного командой ping -c 1 192.168.3.4:

    # tcpdump -ne -i eth1 host 192.168.3.4
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
    10:18:18.924084 08:00:27:fd:e5:aa > 0a:00:27:00:00:00, ethertype IPv4 (0x0800),
       length 98: 192.168.56.102 > 192.168.3.4: ICMP echo request, id 960, seq 1, length 64

    Однако, если добавить альтернативный маршрут для сети 192.168.3.0/24 через некоторый шлюз 192.168.1.254:

    # ip route add 192.168.3.0/24 via 192.168.1.254

    то, для пакетов, предназначенных узлу 192.168.3.4, будет использоваться интерфейс eth0 и исходящий адрес 192.168.1.1 (показан дамп сетевого пакета):

    # tcpdump -ne -i eth0 host 192.168.3.4
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
    10:23:33.393706 08:00:27:23:22:97 > 00:00:00:00:00:aa, ethertype IPv4 (0x0800),
       length 98: 192.168.1.1 > 192.168.3.4: ICMP echo request, id 968, seq 1, length 64

    Пример 10.4.Задание исходящего IP-адреса

    Синтаксис команды ip route позволяет повлиять на выбор локального IP-адреса при соединении с удаленными системами. Для этого служит параметр src с указанием предпочитаемого IP-адреса (должен быть установлен на сетевом интерфейсе компьютера) для отправки пакетов на направление, определяемое в команде префиксом маршрутизации.

    Так, для указанной ниже конфигурации будет использоваться исходящий адрес 192.168.56.102 (кроме взаимодействия с узлами сети 192.168.1.0/24):

    # ip addr show eth1
    2: eth1:  <BROADCAST,MULTICAST,UP,LOWER_UP>  mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 08:00:27:fd:e5:aa brd ff:ff:ff:ff:ff:ff
        inet 192.168.56.102/24 brd 192.168.56.255 scope global eth1
        inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1:1
        inet6 fe80::a00:27ff:fefd:e5aa/64 scope link 
           valid_lft forever preferred_lft forever
    
    # ip route show 
    192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.10 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    Для того, чтобы использовать исходный адрес 192.168.1.10 для соединения с узлами сети 192.168.3.0/24 следует использовать команду:

    # ip route add 192.168.3.0/24 via 192.168.56.1 src 192.168.1.10 dev eth1:1

    Таблица маршрутизации при этом будет иметь вид:

    # ip route show
    192.168.3.0/24 via 192.168.56.1 dev eth1  src 192.168.1.10 
    192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.10 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    Маршрутизация на основе правил и таблиц

    Классические алгоритмы маршрутизации используют только адрес получателя в качестве аргумента при принятии решения какому шлюзу передавать пакет ( маршрутизация по назначению, destination-routing ). Однако в некоторых случаях необходимо использовать другие параметры сетевого пакета: адрес источника, вид и порт транспортного протокола и т. д. ( маршрутизация на основе политик, policy-routing ) . Маршрутизация на основе политик может использоваться при необходимости отправлять пакеты с разных IP-адресов, для отправки пакетов через разные интерфейсы для различных TCP-портов, балансировки нагрузки между различными Интернет-каналами и т. д. Маршрутизация по источнику (source-based routing)вариант маршрутизации на основе политик, использующий адрес отправителя для принятия решения о маршрутизации.

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

    Для управления списком правил используется команда ip rule. Принцип работы ip rule схож с другими командами ip. Применимы операции просмотра существующих правил ( list ), добавления нового правила ( add ), удаления правила ( del ). Далее в команде необходимо указать селектор выбора пакетов (на основе адреса\сети отправителя\получателя, TOS — типа обслуживания, внутренней маркировки пакетов и т. д.), а затем — действие, которое необходимо выполнить в случае, если пакет соответствует селектору, в частности, перенаправление в указанную таблицу маршрутизации (см. страницу руководства по команде ip ).

    По умолчанию в системе Linux присутствуют следующие таблицы маршрутизации:

    # ip rule show
    0:  from all lookup local 
    32766:  from all lookup main 
    32767:  from all lookup default

    В данном случае любой пакет ( from all ) последовательно будет проходить все таблицы ( local, main, default ) до первого совпадения какой-либо записи.

    Таблица local содержит записи локального характера (маршрутизация "внутри" компьютера, широковещательные IP-адреса сегментов, в состав которых входит компьютер и т. д.). Данная таблица формируется автоматически и обычно не требует "ручного" редактирования. Пример таблицы local:

    # ip route show table local

    broadcast 192.168.1.0 dev eth1  proto kernel  scope link  src 192.168.1.10 
    broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
    local 192.168.56.102 dev eth1  proto kernel  scope host  src 192.168.56.102 
    broadcast 192.168.56.0 dev eth1  proto kernel  scope link  src 192.168.56.102 
    broadcast 192.168.1.255 dev eth1  proto kernel  scope link  src 192.168.1.10 
    local 192.168.1.10 dev eth1  proto kernel  scope host  src 192.168.1.10 
    broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
    broadcast 192.168.56.255 dev eth1  proto kernel  scope link  src 192.168.56.102 
    local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
    local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1

    Таблица main включает основные записи о маршрутизации, с нею работают утилита route и команда ip route без указания таблицы ( ip route show выводит содержимое таблицы main ). Пример таблицы main:

    # ip route show table main
    192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.10 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    Таблица default обычно пустая.

    Описание существующих в системе таблиц маршрутизации содержится в файле /etc/iproute2/rt_tables:

    # cat /etc/iproute2/rt_tables
    255  local
    254  main
    253  default
    0  unspec

    Для переопределения политики маршрутизации можно создавать дополнительные таблицы маршрутизации и правила отправки пакетов в данные таблицы (пример 10.5).

    Пример 10.5.Добавление альтернативного маршрута для узла-источника на шлюзе.

    Пусть шлюз локальной сети 192.168.1.0/24 имеет два сетевых интерфейса c IP-адресами 192.168.1.1/24 и 192.168.56.102/24 соответственно, маршрут по умолчанию — 192.168.56.1. Необходимо, чтобы шлюз отправлял трафик узла 192.168.1.10 по альтернативному маршруту 192.168.56.2.

    Для решения данной задачи , во-первых, добавим в файл /etc/iproute2/rt_tables описание дополнительной таблицы маршрутизации (номер и имя таблицы выбираются произвольно, в данном случае 200 и altroute ):

    # echo 200 altroute  >>  /etc/iproute2/rt_tables

    Во-вторых, добавим правило направления исходящих пакетов узла 192.168.1.10 в таблицу altroute:

    # ip rule add from 192.168.1.10 lookup altroute

    Список правил после выполнения данной команды:

    # ip rule show
    0:  from all lookup local 
    32765:  from 192.168.1.10 lookup altroute 
    32766:  from all lookup main 
    32767:  from all lookup default

    В третьих, нужно в таблицу altroute добавить соответствующий маршрут:

    # ip route add default via 192.168.56.2 dev eth1 table altroute
    # ip route flush cache

    Содержимое таблицы altroute:

    # ip route show table altroute
    default via 192.168.56.2 dev eth1

    В результате на шлюзе исходящие пакеты узла 192.168.1.10 соответствующим правилом будут отправляться в таблицу altroute, в которой как маршрут по умолчанию, указан узел 192.168.56.2. В тоже время исходящие пакеты других узлов сети 192.168.1.0/24 будут маршрутизироваться в соответствии с маршрутами, указанными в таблице main.

    Ключевые термины

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

    Маршрутизация по назначению (destination-routing) — классический подход к маршрутизации, при котором используется адрес назначения в качестве аргумента при принятии решения какому шлюзу передавать пакет.

    Маршрутизация на основе политик (policy-routing) — маршрутизация на основе различных параметров: адреса источника, вид и порт транспортного протокола и т. д.

    Маршрутизация по источнику (source-based routing) — вариант маршрутизации на основе политик, использующий адрес отправителя для принятия решения о маршрутизации.

    Краткие итоги

  • Сетевая подсистема Linux может обрабатывать как пакеты локального узла (по умолчанию), так и пакеты, не принадлежащие данному узлу (режим маршрутизатора). Обычно маршрутизатор имеет два и более физических сетевых интерфейсов или хотя бы два и более IP-адресов из разных сетей. Необходимая для режима маршрутизатора функция пересылки пакетов (forwarding) требует дополнительной активации в настройках ядра Linux.
  • Выбор локального адреса для исходящих соединений в большинстве случаев системой осуществляется автоматически, исходя из имеющихся IP-адресов и таблицы маршрутизации. Синтаксис команды ip route позволяет повлиять на выбор локального IP-адреса при соединении с удаленными системами. Для этого служит параметр src с указанием предпочитаемого IP-адреса (должен быть установлен на сетевом интерфейсе компьютера) для отправки пакетов на направление, определяемое в команде префиксом маршрутизации. Кроме того, сетевое программное обеспечение обычно имеет настройки, позволяющие выбирать IP-адрес для исходящих подключений.
  • Управление расширенными функциями маршрутизации в Linux осуществляется путем манипуляций дополнительными таблицами маршрутизации и правилами, определяющими порядок прохождения пакетов через эти таблицы. Для управления списком правил используется команда ip rule.
  • Упражнения

    В среде VirtualBox реализовать стенд для изучения маршрутизации, состоящий из двух виртуальных машин: основной ВМ и дополнительной ВМ.

    Основная ВМ предназначена для реализации функции маршрутизации пакетов удаленных сетей. Непосредственно к ней подключены сети: 192.168.0.0/24, 192.168.1.0/24 и 192.168.2.0/24 ("физические" интерфейсы: eth1 с IP-адресом 192.168.0.1, eth2 c IP-адресом 192.168.1.1, eth3 c IP-адресом 192.168.2.1). Последние два интерфейса используются для связи с удаленными сетями (шлюз по умолчанию — 192.168.1.2, альтернативный маршрут — 192.168.2.2).

    Примечание: Системы 192.168.1.2 и 192.168.2.2 не реализованы, имитация их присутствия осуществлена путем добавления в основную ВМ статических arp-записей для адресов 192.168.1.2 и 192.168.2.2 (при наличии статической записи система не использует протокол arp и сразу отправляет фреймы на указанный MAC-адрес).

    Дополнительная ВМ предназначена для тестирования настроек маршрутизатора и межсетевого экрана путем отсылки тестовых IP-пакетов. Сеть 192.168.0.0/24 объединяет виртуальные машины (для дополнительной ВМ — IP-адрес 192.168.0.2 на интерфейсе eth1, в качестве шлюза по умолчанию - 192.168.0.1).

    Все сетевые адаптеры включены во внутреннюю сеть VirtualBox, которая работает в режиме концентратора.

    Примечание: Так как при подключению к концентратору фреймы получают все устройства в сети, то при анализе трафика следует использовать команду tcpdump c указанием интерфейса мониторинга (-i) и не включая "беспорядочный" режим (-p):
    # tcpdump -nep -i eth2
    Примечание: На практике включение несколько сетевых адаптеров системы в один сегмент физического или канального уровня используется для решения специальных задач: балансировки сетевой нагрузки, обеспечения отказоустойчивости и т.д. Для маршрутизации нескольких IP-подсетей, расположенных в одном широковещательном домене, достаточно одного сетевого адаптера и системной поддержки логических сетевых интерфейсов.

    1.Установить основной IP-адрес (192.168.0.2 /24) и шлюз по умолчанию (192.168.0.1) на дополнительной ВМ:

    # ip addr add dev eth1 local 192.168.0.2 /24 broadcast 192.168.0.255 
    # ip link set eth1 up 
    # ip route add default via 192.168.0.1

    2.Установить в основной ВМ:

    а)На интерфейс eth1 IP-адрес 192.168.0.1 /24

    б)На интерфейс eth2 IP-адрес 192.168.1.1 /24

    в)На интерфейс eth3 IP-адрес 192.168.2.1 /24

    г)В качестве шлюза по умолчанию IP-адрес: 192.168.1.2

    д)Внести статические записи в ARP-таблицу относительно адресов 192.168.1.2 и 192.168.2.2 (для их эмуляции):

    # ip neighb  add 192.168.1.2 lladdr 00:00:00:00:00:AA dev eth2
    # ip neighb  add 192.168.2.2 lladdr 00:00:00:00:00:BB dev eth3

    е)Включить в ядре ОС функцию маршрутизации:

    # echo 1 > /proc/sys/net/ipv4/ip_forward

    3.Проверить прохождения пакетов от узла 192.168.0.2 по маршруту по умолчанию:

    а)В основной ВМ настроить прослушивание трафика на интерфейсе eth2, идущего на MAC-адрес узла 192.168.1.2:

    # tcpdump -nep -i eth2

    б)В дополнительной ВМ осуществить отправку тестовых ICMP-пакетов гипотетическому узлу 192.168.90.10 с IP-адреса 192.168.0.2:

    # ping 192.168.90.10

    в)Если все манипуляции проделаны правильно, то в дополнительной ВМ будет отображаться сообщение о недоступности узла 192.168.90.10, а в основной ВМ в TCPDump будут отображаться исходящие фреймы на узел 00:00:00:00:00:AA, содержащие пакеты с исходящим IP-адресом 192.168.90.10.

    4.Установить статический маршрут до сети 192.168.100.0 /24 через альтернативный шлюз 192.168.2.2:

    а) В основной ВМ:

    # ip route add to 192.168.100.0/24 via 192.168.2.2

    б)Запуская TCPDump на интерфейсах eth1 и eth2 основной ВМ и используя команду ping в дополнительной ВМ убедиться, что трафик на сеть 192.168.100.0 /24 идет на интерфейс 192.168.2.2, а весь остальной трафик - на 192.168.1.2.

    5.В основной ВМ установить маршрут до узла 192.168.101.11 через альтернативный шлюз 192.168.2.2.

    6.В основной ВМ установить для пакетов узла 192.168.0.5 маршрут по умолчанию через альтернативный шлюз 192.168.2.2 (пример 10.5). В дополнительной ВМ установить дополнительный адрес 192.168.0.5 и проверить работоспособность установленного маршрута.

    Страницы:

    Содержание

  • Включение функции пересылки проходящих пакетов.
  • Выбор IP-адреса для исходящих соединений.
  • Маршрутизация на основе правил и таблиц.
  • Включение функции пересылки проходящих пакетов

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

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

    По умолчанию сетевая подсистема Linux обрабатывает пакеты, предназначенные данному узлу или созданные данным узлом; функция обработки пакетов, в которых не указан IP-адрес данной станции как источник или приемник (forwarding, пересылка пакетов ) отключена. Для включения функции пересылки проходящих пакетов необходимо установить в 1 значение, записанное в файле ip_forward псевдофайловой системы proc:

    # echo 1 > /proc/sys/net/ipv4/ip_forward

    Данная настройка будет действовать до перезагрузки компьютера. Для восстановления конфигурации нужно после перезагрузки выполнять указанную команду (указать ее в файле /etc/rc.local ) или лучше установить в файле /etc/sysctl.conf следующий параметр:

    net.ipv4.ip_forward=1

    Пример 10.1.Объединение виртуальных локальных сетей с помощью маршрутизатора на основе Linux.

    Для того, чтобы в примере 5.6. "Постоянные сетевые конфигурации" подсети 192.168.1.0/24 и 192.168.2.0/24 могли взаимодействовать друг с другом через указанный в примере компьютер Linux (выступает в качестве шлюза для данных подсетей) необходимо:

  • на данном компьютере включить функцию пересылки пакетов одним из описанных выше способов;
  • на всех компьютерах первой подсети указать в качестве шлюза для второй подсети адрес 192.168.1.4 (разумеется, также можно указать данный адрес как шлюз по умолчанию), а для компьютеров второй подсети - шлюз для первой подсети 192.168.2.4.
  • Таблица маршрутизации шлюза:

    # ip route show
    192.168.2.0/24 dev vlan2  proto kernel  scope link  src 192.168.2.4 
    192.168.1.0/24 dev vlan1  proto kernel  scope link  src 192.168.1.4

    Эти записи добавляются в таблицу маршрутизации шлюза автоматически (например, если на интерфейсе vlan1 установлен IP-адрес 192.168.1.4/24, то система полагает, что сеть 192.168.1.0/24 непосредственно подключена к данному интерфейсу). Таким образом, если на интерфейс vlan1 шлюза приходят сетевые пакеты, в которых адрес назначения принадлежит второй подсети, то шлюз, согласно таблицы маршрутизации, передает эти пакеты в сеть с интерфейса vlan2.

    Пример 10.2.Объединение двух сетей на основе маршрутизаторов

    Пусть необходимо обеспечить взаимодействие сетей 192.168.1.0/24 и 192.168.2.0/24 (рис. 10.1.), соединенных интерфейсами маршрутизаторов, установленных в каждой из сетей (интерфейсы маршрутизаторов в сетях имеют адреса 192.168.1.1 и 192.168.2.1 соответственно).

    (рис 10.1) Объединение двух сетей на основе маршрутизаторов

    Для решения данной задачи ( рис. 10.1.) необходимо установить на интерфейсы, связывающие маршрутизаторы друг с другом адреса из одной произвольно выбранной подсети (192.168.3.0/24, на первый — 192.168.3.1, на второй — 192.168.3.2) и добавить статические маршруты в таблицы маршрутизаторов (для первого маршрутизатора - для сети 192.168.2.0/24 через узел 192.168.3.2, для второго — для сети 192.168.1.0/24 через узел 192.168.3.1).

    К примеру таблица маршрутизации первого маршрутизатора (при использовании Linux) будет иметь вид:

    # ip route show
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.1 
    192.168.3.0/24 dev eth1  proto kernel  scope link  src 192.168.3.1
    192.168.2.0/24 via 192.168.3.2 dev eth1

    Последний маршрут здесь является статическим, так как должен быть задан администратором системы вручную.

    Выбор IP-адреса для исходящих соединений

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

    Примечание: Во многих случаях сетевое программное обеспечение позволяет указывать исходный адрес с помощью параметров.

    Пример 10.3.Выбор исходящего IP-адреса

    Пусть система имеет два интерфейса eth0(192.168.1.1/24) и eth1(192.168.56.102/24):

    # ip addr show
    ...
    2: eth0:  <BROADCAST,MULTICAST,UP,LOWER_UP>  mtu 1500 qdisc pfifo_fast 
        state UP qlen 1000 link/ether 08:00:27:23:22:97 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
        inet6 fe80::a00:27ff:fe23:2297/64 scope link 
           valid_lft forever preferred_lft forever
    3: eth1:  <BROADCAST,MULTICAST,UP,LOWER_UP>  mtu 1500 qdisc pfifo_fast
        state UP qlen 1000 link/ether 08:00:27:fd:e5:aa brd ff:ff:ff:ff:ff:ff
        inet 192.168.56.102/24 brd 192.168.56.255 scope global eth1
        inet6 fe80::a00:27ff:fefd:e5aa/64 scope link 
           valid_lft forever preferred_lft forever

    Маршрут по умолчанию у данной системы - 192.168.56.1:

    # ip route show
    192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.1 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    При такой конфигурации для исходящих соединений будет использоваться интерфейс eth1 и IP-адрес 192.168.56.102 (кроме соединений с узлами сети 192.168.1.0/24 — eth0 и IP-адрес 192.168.1.1). Ниже показан дамп сетевого пакета, отправленного командой ping -c 1 192.168.3.4:

    # tcpdump -ne -i eth1 host 192.168.3.4
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
    10:18:18.924084 08:00:27:fd:e5:aa > 0a:00:27:00:00:00, ethertype IPv4 (0x0800),
       length 98: 192.168.56.102 > 192.168.3.4: ICMP echo request, id 960, seq 1, length 64

    Однако, если добавить альтернативный маршрут для сети 192.168.3.0/24 через некоторый шлюз 192.168.1.254:

    # ip route add 192.168.3.0/24 via 192.168.1.254

    то, для пакетов, предназначенных узлу 192.168.3.4, будет использоваться интерфейс eth0 и исходящий адрес 192.168.1.1 (показан дамп сетевого пакета):

    # tcpdump -ne -i eth0 host 192.168.3.4
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
    10:23:33.393706 08:00:27:23:22:97 > 00:00:00:00:00:aa, ethertype IPv4 (0x0800),
       length 98: 192.168.1.1 > 192.168.3.4: ICMP echo request, id 968, seq 1, length 64

    Пример 10.4.Задание исходящего IP-адреса

    Синтаксис команды ip route позволяет повлиять на выбор локального IP-адреса при соединении с удаленными системами. Для этого служит параметр src с указанием предпочитаемого IP-адреса (должен быть установлен на сетевом интерфейсе компьютера) для отправки пакетов на направление, определяемое в команде префиксом маршрутизации.

    Так, для указанной ниже конфигурации будет использоваться исходящий адрес 192.168.56.102 (кроме взаимодействия с узлами сети 192.168.1.0/24):

    # ip addr show eth1
    2: eth1:  <BROADCAST,MULTICAST,UP,LOWER_UP>  mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 08:00:27:fd:e5:aa brd ff:ff:ff:ff:ff:ff
        inet 192.168.56.102/24 brd 192.168.56.255 scope global eth1
        inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1:1
        inet6 fe80::a00:27ff:fefd:e5aa/64 scope link 
           valid_lft forever preferred_lft forever
    
    # ip route show 
    192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.10 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    Для того, чтобы использовать исходный адрес 192.168.1.10 для соединения с узлами сети 192.168.3.0/24 следует использовать команду:

    # ip route add 192.168.3.0/24 via 192.168.56.1 src 192.168.1.10 dev eth1:1

    Таблица маршрутизации при этом будет иметь вид:

    # ip route show
    192.168.3.0/24 via 192.168.56.1 dev eth1  src 192.168.1.10 
    192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.10 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    Маршрутизация на основе правил и таблиц

    Классические алгоритмы маршрутизации используют только адрес получателя в качестве аргумента при принятии решения какому шлюзу передавать пакет ( маршрутизация по назначению, destination-routing ). Однако в некоторых случаях необходимо использовать другие параметры сетевого пакета: адрес источника, вид и порт транспортного протокола и т. д. ( маршрутизация на основе политик, policy-routing ) . Маршрутизация на основе политик может использоваться при необходимости отправлять пакеты с разных IP-адресов, для отправки пакетов через разные интерфейсы для различных TCP-портов, балансировки нагрузки между различными Интернет-каналами и т. д. Маршрутизация по источнику (source-based routing)вариант маршрутизации на основе политик, использующий адрес отправителя для принятия решения о маршрутизации.

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

    Для управления списком правил используется команда ip rule. Принцип работы ip rule схож с другими командами ip. Применимы операции просмотра существующих правил ( list ), добавления нового правила ( add ), удаления правила ( del ). Далее в команде необходимо указать селектор выбора пакетов (на основе адреса\сети отправителя\получателя, TOS — типа обслуживания, внутренней маркировки пакетов и т. д.), а затем — действие, которое необходимо выполнить в случае, если пакет соответствует селектору, в частности, перенаправление в указанную таблицу маршрутизации (см. страницу руководства по команде ip ).

    По умолчанию в системе Linux присутствуют следующие таблицы маршрутизации:

    # ip rule show
    0:  from all lookup local 
    32766:  from all lookup main 
    32767:  from all lookup default

    В данном случае любой пакет ( from all ) последовательно будет проходить все таблицы ( local, main, default ) до первого совпадения какой-либо записи.

    Таблица local содержит записи локального характера (маршрутизация "внутри" компьютера, широковещательные IP-адреса сегментов, в состав которых входит компьютер и т. д.). Данная таблица формируется автоматически и обычно не требует "ручного" редактирования. Пример таблицы local:

    # ip route show table local

    broadcast 192.168.1.0 dev eth1  proto kernel  scope link  src 192.168.1.10 
    broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
    local 192.168.56.102 dev eth1  proto kernel  scope host  src 192.168.56.102 
    broadcast 192.168.56.0 dev eth1  proto kernel  scope link  src 192.168.56.102 
    broadcast 192.168.1.255 dev eth1  proto kernel  scope link  src 192.168.1.10 
    local 192.168.1.10 dev eth1  proto kernel  scope host  src 192.168.1.10 
    broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
    broadcast 192.168.56.255 dev eth1  proto kernel  scope link  src 192.168.56.102 
    local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
    local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1

    Таблица main включает основные записи о маршрутизации, с нею работают утилита route и команда ip route без указания таблицы ( ip route show выводит содержимое таблицы main ). Пример таблицы main:

    # ip route show table main
    192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.10 
    192.168.56.0/24 dev eth1  proto kernel  scope link  src 192.168.56.102 
    default via 192.168.56.1 dev eth1

    Таблица default обычно пустая.

    Описание существующих в системе таблиц маршрутизации содержится в файле /etc/iproute2/rt_tables:

    # cat /etc/iproute2/rt_tables
    255  local
    254  main
    253  default
    0  unspec

    Для переопределения политики маршрутизации можно создавать дополнительные таблицы маршрутизации и правила отправки пакетов в данные таблицы (пример 10.5).

    Пример 10.5.Добавление альтернативного маршрута для узла-источника на шлюзе.

    Пусть шлюз локальной сети 192.168.1.0/24 имеет два сетевых интерфейса c IP-адресами 192.168.1.1/24 и 192.168.56.102/24 соответственно, маршрут по умолчанию — 192.168.56.1. Необходимо, чтобы шлюз отправлял трафик узла 192.168.1.10 по альтернативному маршруту 192.168.56.2.

    Для решения данной задачи , во-первых, добавим в файл /etc/iproute2/rt_tables описание дополнительной таблицы маршрутизации (номер и имя таблицы выбираются произвольно, в данном случае 200 и altroute ):

    # echo 200 altroute  >>  /etc/iproute2/rt_tables

    Во-вторых, добавим правило направления исходящих пакетов узла 192.168.1.10 в таблицу altroute:

    # ip rule add from 192.168.1.10 lookup altroute

    Список правил после выполнения данной команды:

    # ip rule show
    0:  from all lookup local 
    32765:  from 192.168.1.10 lookup altroute 
    32766:  from all lookup main 
    32767:  from all lookup default

    В третьих, нужно в таблицу altroute добавить соответствующий маршрут:

    # ip route add default via 192.168.56.2 dev eth1 table altroute
    # ip route flush cache

    Содержимое таблицы altroute:

    # ip route show table altroute
    default via 192.168.56.2 dev eth1

    В результате на шлюзе исходящие пакеты узла 192.168.1.10 соответствующим правилом будут отправляться в таблицу altroute, в которой как маршрут по умолчанию, указан узел 192.168.56.2. В тоже время исходящие пакеты других узлов сети 192.168.1.0/24 будут маршрутизироваться в соответствии с маршрутами, указанными в таблице main.

    Ключевые термины

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

    Маршрутизация по назначению (destination-routing) — классический подход к маршрутизации, при котором используется адрес назначения в качестве аргумента при принятии решения какому шлюзу передавать пакет.

    Маршрутизация на основе политик (policy-routing) — маршрутизация на основе различных параметров: адреса источника, вид и порт транспортного протокола и т. д.

    Маршрутизация по источнику (source-based routing) — вариант маршрутизации на основе политик, использующий адрес отправителя для принятия решения о маршрутизации.

    Краткие итоги

  • Сетевая подсистема Linux может обрабатывать как пакеты локального узла (по умолчанию), так и пакеты, не принадлежащие данному узлу (режим маршрутизатора). Обычно маршрутизатор имеет два и более физических сетевых интерфейсов или хотя бы два и более IP-адресов из разных сетей. Необходимая для режима маршрутизатора функция пересылки пакетов (forwarding) требует дополнительной активации в настройках ядра Linux.
  • Выбор локального адреса для исходящих соединений в большинстве случаев системой осуществляется автоматически, исходя из имеющихся IP-адресов и таблицы маршрутизации. Синтаксис команды ip route позволяет повлиять на выбор локального IP-адреса при соединении с удаленными системами. Для этого служит параметр src с указанием предпочитаемого IP-адреса (должен быть установлен на сетевом интерфейсе компьютера) для отправки пакетов на направление, определяемое в команде префиксом маршрутизации. Кроме того, сетевое программное обеспечение обычно имеет настройки, позволяющие выбирать IP-адрес для исходящих подключений.
  • Управление расширенными функциями маршрутизации в Linux осуществляется путем манипуляций дополнительными таблицами маршрутизации и правилами, определяющими порядок прохождения пакетов через эти таблицы. Для управления списком правил используется команда ip rule.
  • Упражнения

    В среде VirtualBox реализовать стенд для изучения маршрутизации, состоящий из двух виртуальных машин: основной ВМ и дополнительной ВМ.

    Основная ВМ предназначена для реализации функции маршрутизации пакетов удаленных сетей. Непосредственно к ней подключены сети: 192.168.0.0/24, 192.168.1.0/24 и 192.168.2.0/24 ("физические" интерфейсы: eth1 с IP-адресом 192.168.0.1, eth2 c IP-адресом 192.168.1.1, eth3 c IP-адресом 192.168.2.1). Последние два интерфейса используются для связи с удаленными сетями (шлюз по умолчанию — 192.168.1.2, альтернативный маршрут — 192.168.2.2).

    Примечание: Системы 192.168.1.2 и 192.168.2.2 не реализованы, имитация их присутствия осуществлена путем добавления в основную ВМ статических arp-записей для адресов 192.168.1.2 и 192.168.2.2 (при наличии статической записи система не использует протокол arp и сразу отправляет фреймы на указанный MAC-адрес).

    Дополнительная ВМ предназначена для тестирования настроек маршрутизатора и межсетевого экрана путем отсылки тестовых IP-пакетов. Сеть 192.168.0.0/24 объединяет виртуальные машины (для дополнительной ВМ — IP-адрес 192.168.0.2 на интерфейсе eth1, в качестве шлюза по умолчанию - 192.168.0.1).

    Все сетевые адаптеры включены во внутреннюю сеть VirtualBox, которая работает в режиме концентратора.

    Примечание: Так как при подключению к концентратору фреймы получают все устройства в сети, то при анализе трафика следует использовать команду tcpdump c указанием интерфейса мониторинга (-i) и не включая "беспорядочный" режим (-p):
    # tcpdump -nep -i eth2
    Примечание: На практике включение несколько сетевых адаптеров системы в один сегмент физического или канального уровня используется для решения специальных задач: балансировки сетевой нагрузки, обеспечения отказоустойчивости и т.д. Для маршрутизации нескольких IP-подсетей, расположенных в одном широковещательном домене, достаточно одного сетевого адаптера и системной поддержки логических сетевых интерфейсов.

    1.Установить основной IP-адрес (192.168.0.2 /24) и шлюз по умолчанию (192.168.0.1) на дополнительной ВМ:

    # ip addr add dev eth1 local 192.168.0.2 /24 broadcast 192.168.0.255 
    # ip link set eth1 up 
    # ip route add default via 192.168.0.1

    2.Установить в основной ВМ:

    а)На интерфейс eth1 IP-адрес 192.168.0.1 /24

    б)На интерфейс eth2 IP-адрес 192.168.1.1 /24

    в)На интерфейс eth3 IP-адрес 192.168.2.1 /24

    г)В качестве шлюза по умолчанию IP-адрес: 192.168.1.2

    д)Внести статические записи в ARP-таблицу относительно адресов 192.168.1.2 и 192.168.2.2 (для их эмуляции):

    # ip neighb  add 192.168.1.2 lladdr 00:00:00:00:00:AA dev eth2
    # ip neighb  add 192.168.2.2 lladdr 00:00:00:00:00:BB dev eth3

    е)Включить в ядре ОС функцию маршрутизации:

    # echo 1 > /proc/sys/net/ipv4/ip_forward

    3.Проверить прохождения пакетов от узла 192.168.0.2 по маршруту по умолчанию:

    а)В основной ВМ настроить прослушивание трафика на интерфейсе eth2, идущего на MAC-адрес узла 192.168.1.2:

    # tcpdump -nep -i eth2

    б)В дополнительной ВМ осуществить отправку тестовых ICMP-пакетов гипотетическому узлу 192.168.90.10 с IP-адреса 192.168.0.2:

    # ping 192.168.90.10

    в)Если все манипуляции проделаны правильно, то в дополнительной ВМ будет отображаться сообщение о недоступности узла 192.168.90.10, а в основной ВМ в TCPDump будут отображаться исходящие фреймы на узел 00:00:00:00:00:AA, содержащие пакеты с исходящим IP-адресом 192.168.90.10.

    4.Установить статический маршрут до сети 192.168.100.0 /24 через альтернативный шлюз 192.168.2.2:

    а) В основной ВМ:

    # ip route add to 192.168.100.0/24 via 192.168.2.2

    б)Запуская TCPDump на интерфейсах eth1 и eth2 основной ВМ и используя команду ping в дополнительной ВМ убедиться, что трафик на сеть 192.168.100.0 /24 идет на интерфейс 192.168.2.2, а весь остальной трафик - на 192.168.1.2.

    5.В основной ВМ установить маршрут до узла 192.168.101.11 через альтернативный шлюз 192.168.2.2.

    6.В основной ВМ установить для пакетов узла 192.168.0.5 маршрут по умолчанию через альтернативный шлюз 192.168.2.2 (пример 10.5). В дополнительной ВМ установить дополнительный адрес 192.168.0.5 и проверить работоспособность установленного маршрута.

    Вернуться к учебному плану