Маршрутизация на основе политик. Часть первая
Так будет выглядеть роутинг при использовании на интерфейсе enp0s3 ip-адреса 192.168.110.50 с маской подсети 255.255.255.0 и шлюзом по умолчанию 192.168.110.1 :
# ip route show default via 192.168.110.1 dev enp0s3 192.168.110.0/24 dev enp0s3 proto kernel scope link src 192.168.110.50
Вторая запись означает:
- пакеты в подсеть 192.168.110.0/24 уходят через интерфейс enp0s3
- proto kernel — маршрут был добавлен ядром при назначении интерфейсу ip-адреса
- scope link — запись действительна только для интерфейса enp0s3
- src 192.168.110.50 — задает ip-адрес отправителя пакетов для этого правила
Первая запись означает, что пакеты на любые хосты, не попадающие в подсеть 192.168.110.0/24 будут уходить в шлюз 192.168.110.1 через интерфейс enp0s3 . Шлюз, в свою очередь, меняет ip-адрес отправителя, если используется NAT, либо просто отправляет пакет дальше.
Маршрутизация на основе политик
Существуют два механизма маршрутизации: классический destination-routing (на основе адреса назначения) и сравнительно новый policy-routing (на основе политик). Маршрутизация на основе политик применяется в случае наличия нескольких сетевых интерфейсов и необходимости отправлять определенные пакеты через определенный интерфейс. Маршрут пакета определяется не только на основе адреса назначения — есть возможность анализа практически любых полей пакета.
В основе маршрутизации с использованием политик лежат четыре понятия:
- Адрес ( address ) определяет ip-адрес места назначения пакета
- Маршрут ( route ) задает путь пакета, как в традиционной маршрутизации
- Таблица маршрутизации ( routing table ) состоит из набора нескольких маршрутов
- Правила ( rule ) позволяют отбирать нужные пакеты и направлять по заданному маршруту
Таблицы маршрутизации
Изначально предопределены таблицы мартшрутизации local , main и default :
- В таблицу local ядро заносит записи для локальных ip-адресов (чтобы трафик на эти ip-адреса оставался локальным и не пытался уходить во внешнюю сеть), а также для бродкастов.
- Таблица main является основной и именно она используется, если в команде ip route не указано какую таблицу использовать (в самом начале мы видели именно таблицу main ).
- Таблица default изначально пуста.
Давайте посмотрим на содержимое таблицы local :
# ip route show table local broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 broadcast 192.168.110.0 dev enp0s3 proto kernel scope link src 192.168.110.50 local 192.168.110.50 dev enp0s3 proto kernel scope host src 192.168.110.50 broadcast 192.168.110.255 dev enp0s3 proto kernel scope link src 192.168.110.50
Выше мы уже сталкивались с типом записи default , но здесь мы видим еще local и broadcast :
- broadcast — для этой записи пакеты будут отправлены как широковещательное сообщение
- local — для этой записи пакеты будут отправлены локально, без выхода во внешнюю сеть
Кроме того, типы записи могут быть unicast , unreachable , blackhole , prohibit и так далее:
- unicast — обычный маршрут: исходящий интерфейс + адрес следующего хопа до пункта назначения
- unreachable — пакет выбрасывается и посылается ICMP сообщение «host unreachable»
- blackhole — пакет просто выбрасывается без возвращения какого-либо сообщения
- prohibit — пакет выбрасывается и посылается ICMP сообщение «administratively prohibited»
Что такое scope link мы уже знаем, но здесь еще встречается scope host :
- scope host — эта запись действительна только для этого хоста
- scope link — эта запись действительна только для этого интерфейса
Для просмотра содержимого всех таблиц в качестве имени таблицы следует указывать all , unspec или ноль. Все таблицы на самом деле имеют цифровые идентификаторы от 1 до 255, их символьные имена задаются в файле /etc/iproute2/rt_tables и используются лишь для удобства.
# ip route show table unspec .
# cat /etc/iproute2/rt_tables 255 local 254 main 253 default 0 unspec
Таблица unspec — это псевдо-таблица, которая содержит в себе правила всех таблиц маршрутизации системы. Именно поэтому у нее номер ноль, который не входит в диапазон с 1 по 255.
Правила маршрутизации
Как же ядро выбирает, в какую таблицу отправлять пакеты? Мы уже знаем — для этого есть правила:
# ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
Число в начале строки — идентификатор правила, from all — условие, означает пакеты с любых адресов, lookup указывает, в какую таблицу направлять пакет. Если пакет подпадает под несколько правил, то он проходит их все по порядку возрастания идентификатора. Конечно, если пакет подпадет под какую-либо запись маршрутизации, то последующие записи маршрутизации и последующие правила он уже проходить не будет.
- from — отправитель пакета.
- to — получатель пакета.
- iif — имя интерфейса, на который пришел пакет.
- oif — имя интерфейса, с которого уходит пакет. Это условие действует только для пакетов, исходящих из локальных сокетов, привязанных к конкретному интерфейсу.
- tos — значение поля TOS ip-пакета.
- fwmark — проверка значения FWMARK пакета. При помощи правил iptables можно отфильтровать пакеты по огромному количеству признаков и установить определенные значения FWMARK . А затем эти значения учитывать при роутинге.
Условия можно комбинировать, например from 192.168.1.0/24 to 10.0.0.0/8 , а также можно использовать префикc not , который указывает, что пакет не должен соответствовать условию, чтобы подпадать под это правило.
- Маршрутизация на основе политик. Часть четвертая
- Маршрутизация на основе политик. Часть третья
- Маршрутизация на основе политик. Часть вторая
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Категории блога
Облако тегов
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (118)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (165)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (68)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (28)
- Ключ (28)
- Команда (84)
- Компонент (60)
- Конфигурация (63)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (140)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (101)
- Сервер (75)
- Событие (27)
- Теория (106)
- Установка (66)
- Файл (51)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
Маршрутизация в Linux
Выбор локального адреса для исходящих соединений в большинстве случаев системой осуществляется автоматически, исходя из имеющихся IP-адресов и таблицы маршрутизации (пример 10.3).
Примечание: Во многих случаях сетевое программное обеспечение позволяет указывать исходный адрес с помощью параметров.
Пример 10.3.Выбор исходящего IP-адреса
Пусть система имеет два интерфейса eth0(192.168.1.1/24) и eth1(192.168.56.102/24):
# ip addr show . 2: eth0: 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: 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: 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 ) [ 45 ] . Маршрутизация на основе политик может использоваться при необходимости отправлять пакеты с разных IP-адресов, для отправки пакетов через разные интерфейсы для различных TCP-портов, балансировки нагрузки между различными Интернет-каналами и т. д. Маршрутизация по источнику (source-based routing) — вариант маршрутизации на основе политик, использующий адрес отправителя для принятия решения о маршрутизации.
Управление расширенными функциями маршрутизации в Linux осуществляется путем манипуляции множеством таблиц маршрутизации (ранее в изложении материала предполагалось, что таблица маршрутизации одна) и правилами использования этого множества (rules) [ 27 ] . Правила определяют порядок прохождения пакетов через таблицы. Если в данной таблице пакет соответствует направлению, указанному в какой-либо записи таблицы, то последующие возможные записи и таблицы игнорируются. Поэтому приоритет (номер) правила имеет важное значение .
Для управления списком правил используется команда 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).
Роутинг и policy-routing в Linux при помощи iproute2
Речь в статье пойдет о роутинге сетевых пакетов в Linux. А конкретно – о типе роутинга под названием policy-routing (роутинг на основании политик). Этот тип роутинга позволяет маршрутизировать пакеты на основании ряда достаточно гибких правил, в отличие от классического механизма маршрутизации destination-routing (роутинг на основании адреса назначения). Policy-routing применяется в случае наличия нескольких сетевых интерфейсов и необходимости отправлять определенные пакеты на определенный интерфейс, причем пакеты определяются не по адресу назначения или не только по адресу назначения. Например, policy-routing может использоваться для: балансировки трафика между несколькими внешними каналами (аплинками), обеспечения доступа к серверу в случае нескольких аплинков, при необходимости отправлять пакеты с разных внутренних адресов через разные внешние интерфейсы, даже для отправки пакетов на разные TCP-порты через разные интерфейсы и т.д.
Для управления сетевыми интерфейсами, маршрутизацией и шейпированием в Linux служит пакет утилит iproute2.
Этот набор утилит лишь задает настройки, реально вся работа выполняется ядром Linux. Для поддержки ядром policy-routing оно должно быть собрано с включенными опциями IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) и IP: policy routing (CONFIG_IP_MULTIPLE_TABLES), находящимися в разделе Networking support -> Networking options -> TCP/IP networking.
ip route
Для настройки роутинга служит команда ip route. Выполненная без параметров, она покажет список текущих правил маршрутизации (не все правила, об этом чуть позже):
# ip route 192.168.12.0/24 dev eth0 proto kernel scope link src 192.168.12.101 default via 192.168.12.1 dev eth0
Так будет выглядеть роутинг при использовании на интерфейсе eth0 IP-адреса 192.168.12.101 с маской подсети 255.255.255.0 и шлюзом по умолчанию 192.168.12.1.
Мы видим, что трафик на подсеть 192.168.12.0/24 уходит через интерфейс eth0. proto kernel означает, что роутинг был задан ядром автоматически при задании IP интерфейса. scope link означает, что эта запись является действительной только для этого интерфейса (eth0). src 192.168.12.101 задает IP-адрес отправителя для пакетов, попадающих под это правило роутинга.
Трафик на любые другие хосты, не попадающие в подсеть 192.168.12.0/24 будет уходить на шлюз 192.168.12.1 через интерфейс eth0 ( default via 192.168.12.1 dev eth0 ). Кстати, при отправке пакетов на шлюз, IP-адрес назначения не изменяется, просто в Ethernet-фрейме в качестве MAC-адреса получателя будет указан MAC-адрес шлюза (часто даже специалисты со стажем путаются в этом моменте). Шлюз в свою очередь меняет IP-адрес отправителя, если используется NAT, либо просто отправляет пакет дальше. В данном случае используются приватный адрес (192.168.12.101), так что шлюз скорее всего делает NAT.
А теперь залезем в роутинг поглубже. На самом деле, таблиц маршрутизации несколько, а также можно создавать свои таблицы маршрутизации. Изначально предопределены таблицы local, main и default. В таблицу local ядро заносит записи для локальных IP адресов (чтобы трафик на эти IP-адреса оставался локальным и не пытался уходить во внешнюю сеть), а также для бродкастов. Таблица main является основной и именно она используется, если в команде не указано какую таблицу использовать (т.е. выше мы видели именно таблицу main). Таблица default изначально пуста. Давайте бегло взглянем на содержимое таблицы local:
# ip route show table local broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 broadcast 192.168.12.255 dev eth0 proto kernel scope link src 192.168.12.101 broadcast 192.168.12.0 dev eth0 proto kernel scope link src 192.168.12.101 local 192.168.12.101 dev eth0 proto kernel scope host src 192.168.12.101 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 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
broadcast и local определяют типы записей (выше мы рассматривали тип default ). Тип broadcast означает, что пакеты соответствующие этой записи будут отправлены как broadcast-пакеты, в соответствии с настройками интерфейса. local – пакеты будут отправлены локально. scope host указывает, что эта запись действительная только для этого хоста.
Для просмотра содержимого конкретной таблицы используется команда ip route show table TABLE_NAME . Для просмотра содержимого всех таблиц в качестве TABLE_NAME следует указывать all , unspec или 0 . Все таблицы на самом деле имеют цифровые идентификаторы, их символьные имена задаются в файле /etc/iproute2/rt_tables и используются лишь для удобства.
ip rule
Как же ядро выбирает, в какую таблицу отправлять пакеты? Все логично – для этого есть правила. В нашем случае:
# ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
- from – мы уже рассматривали выше, это проверка отправителя пакета.
- to – получатель пакета.
- iif – имя интерфейса, на который пришел пакет.
- oif – имя интерфейса, с которого уходит пакет. Это условие действует только для пакетов, исходящих из локальных сокетов, привязанных к конкретному интерфейсу.
- tos – значение поля TOS IP-пакета.
- fwmark – проверка значения FWMARK пакета. Это условие дает потрясающую гибкость правил. При помощи правил iptables можно отфильтровать пакеты по огромному количеству признаков и установить определенные значения FWMARK. А затем эти значения учитывать при роутинге.
Простой пример
Теперь рассмотрим простой пример. У нас есть некий шлюз, на него приходят пакеты с IP 192.168.1.20. Пакеты с этого IP нужно отправлять на шлюз 10.1.0.1. Чтобы это реализовать делаем следующее:
Создаем таблицу с единственным правилом:
# ip route add default via 10.1.0.1 table 120
Создаем правило, отправляющее нужные пакеты в нужную таблицу:
# ip rule add from 192.168.1.20 table 120
Как видите, все просто.
Доступность сервера через несколько аплинков

Теперь более реалистичный пример. Имеется два аплинка до двух провайдеров, необходимо обеспечить доступность сервера с обоих каналов:
В качестве маршрута по умолчанию используется один из провайдеров, не важно какой. При этом веб-сервер будет доступен только через сеть этого провайдера. Запросы через сеть другого провайдера приходить будут, но ответные пакеты будут уходить на шлюз по умолчанию и ничего из этого не выйдет.
Решается это весьма просто:
Определяем таблицы:
# ip route add default via 11.22.33.1 table 101 # ip route add default via 55.66.77.1 table 102
Определяем правила:
# ip rule add from 11.22.33.44 table 101 # ip rule add from 55.66.77.88 table 102
Думаю теперь уже объяснять смысл этих строк не надо. Аналогичным образом можно сделать доступность сервера по более чем двум аплинкам.
Балансировка трафика между аплинками
Делается одной элегантной командой:
# ip route replace default scope global \ nexthop via 11.22.33.1 dev eth0 weight 1 \ nexthop via 55.66.77.1 dev eth1 weight 1
Эта запись заменит существующий default-роутинг в таблице main. При этом маршрут будет выбираться в зависимости от веса шлюза ( weight ). Например, при указании весов 7 и 3, через первый шлюз будет уходить 70% соединений, а через второй – 30%. Есть один момент, который при этом надо учитывать: ядро кэширует маршруты, и маршрут для какого-либо хоста через определенный шлюз будет висеть в таблице еще некоторое время после последнего обращения к этой записи. А маршрут до часто используемых хостов может не успевать сбрасываться и будет все время обновляться в кэше, оставаясь на одном и том же шлюзе. Если это проблема, то можно иногда очищать кэш вручную командой ip route flush cache .
Использование маркировки пакетов при помощи iptables
Допустим нам нужно, чтобы пакеты на 80 порт уходили только через 11.22.33.1. Для этого делаем следующее:
# iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2 # ip route add default via 11.22.33.1 dev eth0 table 102 # ip rule add fwmark 0x2/0x2 lookup 102
Первой командой маркируем все пакеты, идущие на 80 порт. Второй командой создаем таблицу маршрутизации. Третьей командой заворачиваем все пакеты с указанной маркировкой в нужную таблицу.
Опять же все просто. Рассмотрим также использование модуля iptables CONNMARK. Он позволяет отслеживать и маркировать все пакеты, относящиеся к определенному соединению. Например, можно маркировать пакеты по определенному признаку еще в цепочке INPUT, а затем автоматически маркировать пакеты, относящиеся к этим соединениям и в цепочке OUTPUT. Используется он так:
# iptables -t mangle -A INPUT -i eth0 -j CONNMARK --set-mark 0x2 # iptables -t mangle -A INPUT -i eth1 -j CONNMARK --set-mark 0x4 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
Пакеты, приходящие с eth0 маркируются 2, а с eth1 – 4 (строки 1 и 2). Правило на третьей строке проверяет принадлежность пакета к тому или иному соединению и восстанавливает маркировки (которые были заданы для входящих) для исходящих пакетов.
Надеюсь изложенный материал поможет вам оценить всю гибкость роутинга в Linux. Спасибо за внимание 🙂
Статическая маршрутизация
Маршрут — это правило, устанавливаемое в ядре, чтобы определить, какой физический сетевой интерфейс или какой шлюз использовать, чтобы достичь определённой сети (или отдельного компьютера). Существует множество типов маршрутизируемых протоколов; данная статья описывает маршрутизацию протокола IP в ядре Linux.
Хотя маршруты IP хранятся в ядре, их можно модифицировать с помощью пользовательских инструментов, как это описано в следующих примерах.
- 1 Отображение маршрутов
- 2 Добавление статического маршрута
- 3 Добавление постоянного статического маршрута
- 4 Смотрите также
- 5 Внешние ресурсы
Отображение маршрутов
Показать таблицу маршрутизации с помощью iproute2:
user $ ip route
default via 192.168.1.1 dev wlan1 metric 1 192.168.50.0/24 dev lan proto kernel scope link src 192.168.50.1 127.0.0.0/8 via 127.0.0.1 dev lo 192.168.1.0/24 dev wlan1 proto kernel scope link src 192.168.1.1
Или показать таблицу маршрутизации с использованием sys-apps/net-tools:
user $ netstat -rn
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.50.0 0.0.0.0 255.255.255.0 U 0 0 0 lan 192.168.1.0 0.0.0.0 255.255.255.0 U 2000 0 0 wlan1 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 192.168.1.1 0.0.0.0 UG 2000 0 0 wlan1
Добавление статического маршрута
Для добавления статического маршрута необходимо знать адрес IP, маску подсети (CIDR) и шлюз.
В этом примере мы прокладываем маршрут к сети 10.10.10.0 с сетевой маской 255.255.255.0 через шлюз 192.168.1.50 . Для команд из sys-apps/iproute2 ( ip ) требуется использование синтаксиса подсетей в стиле CIDR. Следующий пример команды добавляет маршрут 10.10.10.0/24 :
root # ip route add 10.10.10.0/24 via 192.168.1.50
Показать таблицу маршрутизации с помощью команды ip route :
user $ ip route
default via 192.168.1.1 dev wlan1 metric 1 10.10.10.0/24 dev wlan1 via 192.168.1.50 src 10.10.10.1 192.168.50.0/24 dev lan proto kernel scope link src 192.168.50.1 127.0.0.0/8 via 127.0.0.1 dev lo 192.168.1.0/24 dev wlan1 proto kernel scope link src 192.168.1.1
В старых системах вместо использованного в примере ip , возможно, единственно доступными командами могут быть netstat или route (из пакета sys-apps/net-tools).
С помощью команды route статический маршрут добавляется следующим образом:
root # route add -net 10.10.10.0 netmask 255.255.255.0 gw 192.168.1.50
Показать таблицу маршрутизации с помощью netstat (sys-apps/net-tools):
user $ netstat -rn
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.10.10.0 192.168.1.50 255.255.255.0 UG 0 0 0 wlan1 192.168.50.0 0.0.0.0 255.255.255.0 U 0 0 0 lan 192.168.1.0 0.0.0.0 255.255.255.0 U 2000 0 0 wlan1 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 192.168.1.1 0.0.0.0 UG 2000 0 0 wlan1
Таблица маршрутизации отсортирована от наиболее конкретных маршрутов к наиболее общим. Так она прочитывается в процессе маршрутизации. Совпадение с наибольшим префиксом означает самую маленькую сеть, или сеть с самой длинной сетевой маской, или самый конкретный маршрут, например 255.255.255.255 находится на первой позиции в таблице маршрутизации
Добавление постоянного статического маршрута
Пользователям netifrc (стандартный инструмент управления сетью в OpenRC) для добавления постоянного статического маршрута нужно открыть /etc/conf.d/net в любимом текстовом редакторе и изменить его соответствующим образом.
Посмотрите свою текущую таблицу маршрутизации для справки.
ФАЙЛ /etc/conf.d/net
routes_wlan1="10.10.10.0/24 via 192.168.1.50 default via 192.168.1.1"
Если в качестве сетевого менеджера используется dhcpcd, статический маршрут вместо этого должен быть записан в /etc/dhcpcd.conf .
Оба указанные выше конструкции означают:
- IP-пакеты, предназначенные для сети 10.10.10.0/24 , будут отправлены в 192.168.1.50 .
- IP-пакеты, предназначенные для всех остальных сетей 0.0.0.0/0 , будут отправлены в 192.168.1.1 .
Заметка
0.0.0.0/0 означает все другие сети без префикса (маски подсети), то есть маршрут по умолчанию.
Маршрут по умолчанию 0.0.0.0/0 будет использован, если:
- Узел не имеет физического или логического интерфейса IP в целевом сегменте сети.
- Узел вынужден отправлять IP-пакеты за пределы своего сегмента IP-сети, и в таблице маршрутизации явно не указан маршрут к целевой сети IP.
Смотрите также
- iproute2 — a tool developed to unify network interface configuration, routing, and tunneling for Linux systems.
- Network management — describes possibilities for managing the network stack.
Внешние ресурсы
- Совпадение с наибольшим префиксом (Википедия)
- Gentoo Bug 5409326