Policy based routing in linux

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

Linux предоставляет большой набор функций для маршрутизации и инструменты для ее настройки. Ядро 2.6.x поддерживает:

  • Простую статическую маршрутизацию.
  • Equal Cost Multi Path маршруты (маршруты до одной сети с одинаковым весом, которые выбираются с равной вероятностью).
  • Blackhole-маршруты.
  • Множественные таблицы маршрутизации.
  • Policy Based Routing

[править] Команды

Для управления маршрутизацией применяются следующие команды: route, netstat, ip (последняя из пакета iproute2, возможно его придется установить).

Просмотреть таблицу можно следующими способами:

route -n (устаревшее) netstat -rn ip route show cat /proc/net/route

При этом следует учитывать, что доступ ко всем возможностям дает только ip. Используя route вы не только не сможете настроить «продвинутые» функции вроде политик маршрутизации, но и не увидите их существование в выводе команды просмотра, если они уже настроены в системе. Поэтому следует по возможности использовать ip.

Модификация таблицы маршрутизации:

[править] Использование route

Добавление маршрута через шлюз: route add -net 192.168.0.0/16 gw 10.0.0.1 Добавление маршрута через интерфейс: route add -net 192.168.0.0/16 dev eth1 Маршрут до отдельного хоста: route add -host 192.168.0.1 gw 172.16.0.1 Удаление маршрута: route del . 

[править] Использование ip

Синтаксис ip по структуре напоминает синтаксис Cisco IOS. Любые опции могут быть сокращены до потери двусмысленности, например «ip ro ad» вместо «ip route add».

Добавление маршрута через шлюз: ip route add 172.16.10.0/24 via 192.168.1.1 Добавление маршрута через интерфейс: ip route add 172.16.10.0/24 dev eth0 Маршрут с метрикой: ip route add 172.16.10.0/24 dev eth0 metric 100 

Командой вида ip route add blackhole 10.56.50.0/27 можно добавить «зануленный» маршрут (аналог «ip route . null0» в Cisco). Пакеты в сеть с таким маршрутом будут удалены с причиной «No route to host». Может быть полезно для подавление DoS-атаки с хоста или иных подобных случаев.

[править] Действия с маршрутами

Кроме add также поддерживаются и другие действия:

  • del — удалить маршрут.
  • replace — заменить маршрут другим.
  • change — изменить параметры маршрута.

[править] Equal Cost Multi Path

Если добавить два маршрута до одной и той же сети с одинаковой метрикой, ядро начнет распределять нагрузку между ними путем выбора того или другого с равной вероятностью. Работает и для более чем двух маршрутов. Предупреждение: это может вызвать проблемы со входящими соединениями, потому что иногда ответ может пойти по другому маршруту, чем пришел запрос. Будьте осторожны.

ip route add default dev eth0 ip route add default dev eth1

[править] IPv6

Настройка маршрутизации IPv6 почти идентична настройке для IPv4.

ip route add ::/0 via 2001:db8:dead:beef::1/64

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

Читайте также:  Use linux without gui

[править] Просмотр маршрутов до определенной сети

На маршрутизаторах с длинной таблицей может быть неудобно просматривать вывод «ip route show» в поисках нужного маршрута. В этом случае можно использовать команду вида:

которая выведет маршруты только до указанной сети.

[править] Пересылка пакетов между интерфейсами

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

За этот параметр для IPv4 отвечает переменная net.ipv4.ip_forward (1 = «разрешить», 0 = «запретить»).

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

Для IPv6 используйте net.ipv6.conf.all.forwarding

cat /proc/sys/net/ipv6/conf/all/forwarding echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

Чтобы настройки сохранились после перезагрузки, пропишите значения net.ipv4.ip_forward и net.ipv6.conf.all.forwarding в /etc/sysctl.conf.

[править] Конфигурационные файлы

Настройки статической маршрутизации находятся в различных файлах, в зависимости от дистрибутива.

  • Debian GNU/Linux: /etc/network/interfaces
  • RHEL/CentOS/Scientifix: etc/sysconfig/network-scripts/route-
  • Gentoo: /etc/conf.d/net

(добавьте свои дистрибутивы, пожалуйста)

[править] Policy routing

ip route add default via 10.0.1.2 ip rule add from 192.168.1.1 lookup 3 ip route add default via 10.0.3.4 table 3

Для хоста 192.168.1.1 используется особенная таблица маршрутизации (table 3), не такая как для всех остальных хостов. В ней указан единственный маршрут — маршрут по умолчанию.

Все будут ходить через шлюз 10.0.1.2, а 192.168.1.1 — через 10.0.3.4.

[править] Демоны динамической маршрутизации

[править] Дополнительная информация

[править] Примечания

Основные понятия
Сетевой интерфейс | IP | IP-адрес | Маска подсети | Широковещательный адрес | Маршрут | IPv6
Маршрутизация | Форвардинг | Таблица маршрутизации | Шлюз по умолчанию
Маршрутизация в Linux | Маршрутизация в FreeBSD | Маршрутизация в Cisco

Источник

Маршрутизация на основе политик. Часть первая

Так будет выглядеть роутинг при использовании на интерфейсе 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 , который указывает, что пакет не должен соответствовать условию, чтобы подпадать под это правило.

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 (99)
  • CMS (139)
  • CSS (50)
  • Frontend (75)
  • HTML (66)
  • JavaScript (150)
  • Laravel (72)
  • Linux (146)
  • MySQL (76)
  • PHP (125)
  • React.js (66)
  • SSH (27)
  • Ubuntu (68)
  • Web-разработка (509)
  • WordPress (73)
  • Yii2 (69)
  • БазаДанных (95)
  • Битрикс (66)
  • Блог (29)
  • Верстка (43)
  • ИнтернетМагаз… (84)
  • КаталогТоваров (87)
  • Класс (30)
  • Клиент (27)
  • Ключ (28)
  • Команда (68)
  • Компонент (60)
  • Конфигурация (62)
  • Корзина (32)
  • ЛокальнаяСеть (28)
  • Модуль (34)
  • Навигация (31)
  • Настройка (140)
  • ПанельУправле… (29)
  • Плагин (33)
  • Пользователь (26)
  • Практика (99)
  • Сервер (74)
  • Событие (27)
  • Теория (105)
  • Установка (66)
  • Файл (47)
  • Форма (58)
  • Фреймворк (192)
  • Функция (36)
  • ШаблонСайта (68)

Источник

Оцените статью
Adblock
detector