- База знаний wiki
- Содержание
- source based routing
- Задача:
- Решение:
- Policy Based Routing
- Source Based Routing
- Пример Source Based Routing
- Смысл выполненных действий
- Основные команды для отладки:
- Конфигурационные файлы:
- Роутинг и policy-routing в Linux при помощи iproute2
- ip route
- ip rule
- Простой пример
- Доступность сервера через несколько аплинков
- Балансировка трафика между аплинками
- Использование маркировки пакетов при помощи iptables
- How to do source-based IP Routing in Linux
- Source based routing linux
База знаний wiki
Продукты
Статьи
Содержание
source based routing
Применимость: Linux, FreeBSD, Windows, Выделенный сервер, VDS-KVM, VDS-XEN
Слова для поиска: маршрутизация по источнику
Задача:
Например на вашем сервере два отдельных интерфейса с двумя адресами из разных подсетей.
Шлюз по умолчанию (default gateway) в системе предусмотрен один. Доступен этот шлюз только для одной из подсетей и только по одному интерфейсу.
В случае обрыва связи между этим интерфейсном и шлюзом ваш сервер может стать недоступным.
Эта проблема может не касаться серверов которые подключены к маршрутизаторам с поддержкой VRRP.
Решение:
Policy Based Routing
Policy Based Routing — механизм реализации пересылки (forwarding)/ маршрутизации(routing) пакетов данных, основанный на политике из набора правил, определенной администраторами сети.
Policy Based Routing позволяет использовать множество альтернативных таблиц маршрутизации используемых по условию связанному со значением одного из полей IP ракета или маркеру который назначен iptables.
Source Based Routing
Один из вариантов Policy Based Routing — Source Based Routing.
При реализации этой политики маршрутизатор выбирает дальнейший путь следования пакетов данных по полю «адрес источника».
В нашем примере можно будет использовать альтернативную таблицу маршрутизацию для того, чтобы пакеты из резервного интерфейса использовали другую таблицу маршрутизации где шлюз по умолчанию расположен по другому адресу из подсети соответствующей адресу на этом интерфейсе.
Таким образом на нашем сервере будут работать два канала без зависимости от исправности другого канала.
Пример Source Based Routing
Например у вас есть второй интерфейс в сети 77.72.130.0/24
Я опишу два варианта для Centos и Debian
1. Установить пакет iproute
В некоторых дистрибутивах пакет может называться iproute2
2. Создать идентификатор для альтернативной таблицы маршрутизации
Номер 300 выбран произвольно, главное, чтобы он не совпадал с другими номерами таблиц маршрутизации, имя net130 также дается произвольно.
Таблица будет доступна после перезагрузки системы и к ней можно будет обращаться по имени net130
3. Добавить параметры в таблицу маршрутизации net130
4. Создать и активировать политику маршрутизации пакетов из сети 77.72.130.0/24
Смысл выполненных действий
Важно правильно понять смысл — изначально в системе была только одна таблица маршрутизации — main
Вы добавили еще одну — net130, а команда
добавляет шлюз по умолчанию в таблицу net130 Теперь в системе два шлюза по умолчанию, а куда идти пакетам?
Нужно выполнить команду добавления правила чтобы пакеты из сети 77.72.130.0 использовали не main, а net130
То есть в системе будет два шлюза по умолчанию и выбор производится по признаку источника пакетов
Основные команды для отладки:
Просмотреть все таблицы
Посмотреть таблицу net130
Конфигурационные файлы:
Примерно так должен выглядеть файл /etc/iproute2/rt_tables
Его форма одинакова для всех систем. А вот конфигурационные файлы для интерфейсов разные.
Источник
Роутинг и 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. Выполненная без параметров, она покажет список текущих правил маршрутизации (не все правила, об этом чуть позже):
Так будет выглядеть роутинг при использовании на интерфейсе 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:
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
Как же ядро выбирает, в какую таблицу отправлять пакеты? Все логично – для этого есть правила. В нашем случае:
Число в начале строки – идентификатор правила, 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 , который указывает, что пакет не должен соответствовать условию, чтобы подпадать под это правило.
Итак, мы разобрались что такое таблицы маршрутизации и правила маршрутизации. А создание собственных таблиц и правил маршрутизации это и есть policy-routing, он же PBR (policy based routing). Кстати SBR (source based routing) или source-routing в Linux является частным случаем policy-routing, это использование условия from в правиле маршрутизации.
Простой пример
Теперь рассмотрим простой пример. У нас есть некий шлюз, на него приходят пакеты с IP 192.168.1.20. Пакеты с этого IP нужно отправлять на шлюз 10.1.0.1. Чтобы это реализовать делаем следующее:
Создаем таблицу с единственным правилом:
Создаем правило, отправляющее нужные пакеты в нужную таблицу:
Как видите, все просто.
Доступность сервера через несколько аплинков
Теперь более реалистичный пример. Имеется два аплинка до двух провайдеров, необходимо обеспечить доступность сервера с обоих каналов:
В качестве маршрута по умолчанию используется один из провайдеров, не важно какой. При этом веб-сервер будет доступен только через сеть этого провайдера. Запросы через сеть другого провайдера приходить будут, но ответные пакеты будут уходить на шлюз по умолчанию и ничего из этого не выйдет.
Решается это весьма просто:
Определяем таблицы:
Думаю теперь уже объяснять смысл этих строк не надо. Аналогичным образом можно сделать доступность сервера по более чем двум аплинкам.
Балансировка трафика между аплинками
Делается одной элегантной командой:
Эта запись заменит существующий default-роутинг в таблице main. При этом маршрут будет выбираться в зависимости от веса шлюза ( weight ). Например, при указании весов 7 и 3, через первый шлюз будет уходить 70% соединений, а через второй – 30%. Есть один момент, который при этом надо учитывать: ядро кэширует маршруты, и маршрут для какого-либо хоста через определенный шлюз будет висеть в таблице еще некоторое время после последнего обращения к этой записи. А маршрут до часто используемых хостов может не успевать сбрасываться и будет все время обновляться в кэше, оставаясь на одном и том же шлюзе. Если это проблема, то можно иногда очищать кэш вручную командой ip route flush cache .
Использование маркировки пакетов при помощи iptables
Допустим нам нужно, чтобы пакеты на 80 порт уходили только через 11.22.33.1. Для этого делаем следующее:
Первой командой маркируем все пакеты, идущие на 80 порт. Второй командой создаем таблицу маршрутизации. Третьей командой заворачиваем все пакеты с указанной маркировкой в нужную таблицу.
Опять же все просто. Рассмотрим также использование модуля iptables CONNMARK. Он позволяет отслеживать и маркировать все пакеты, относящиеся к определенному соединению. Например, можно маркировать пакеты по определенному признаку еще в цепочке INPUT, а затем автоматически маркировать пакеты, относящиеся к этим соединениям и в цепочке OUTPUT. Используется он так:
Пакеты, приходящие с eth0 маркируются 2, а с eth1 – 4 (строки 1 и 2). Правило на третьей строке проверяет принадлежность пакета к тому или иному соединению и восстанавливает маркировки (которые были заданы для входящих) для исходящих пакетов.
Надеюсь изложенный материал поможет вам оценить всю гибкость роутинга в Linux. Спасибо за внимание 🙂
Источник
How to do source-based IP Routing in Linux
Our company has two upstreams for internet access. Assume that the upstreams are ISP1 and ISP2. The router is using Linux running BGP (Quagga) for dynamic routing between the two upstreams. See the image below for the sample of source-based IP routing topology.
By default the uplink traffic is going through ISP1 for both Cust A and Cust B networks. I would like to set the traffic coming from network 123.45.67.0/24 is going through ISP2. I have set the local preference to make it going to ISP2 but it seems it doesn’t work in Quagga. In Cisco it works well.
To solve this issue, in Linux we can use iproute2 to set source-based IP routing. Here is the step-by-step:
1. Add a custom policy routing table in /etc/iproute2/rt_tables file
So the /etc/iproute2/rt_tables file is like below:
2. Create an IP policy rule for all traffics coming from 123.45.67.0/24
3. Add an ip route to populate the routing table.
According to the image above, the ISP2 IP address 34.56.78.1 is reachable via eth1, so we need to add route as below:
Verify the uplink traffics from 123.45.67.0/24 using ‘traceroute’.
4. To make it active on boot, add the ip rule and ip route above in /etc/rc.local file as below:
Hopefully this post helps you understanding on how to configure source-based IP routing in Linux
Источник
Source based routing linux
Let’s take a real example once again, I have 2 (actually 3, about time I returned them) cable modems, connected to a Linux NAT (‘masquerading’) router. People living here pay me to use the Internet. Suppose one of my house mates only visits hotmail and wants to pay less. This is fine with me, but they’ll end up using the low-end cable modem.
The ‘fast’ cable modem is known as 212.64.94.251 and is a PPP link to 212.64.94.1. The ‘slow’ cable modem is known by various ip addresses, 212.64.78.148 in this example and is a link to 195.96.98.253.
The local table:
[ahu@home ahu]$ ip route list table local broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1 broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1 local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251 broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148 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
Lots of obvious things, but things that need to be specified somewhere. Well, here they are. The default table is empty.
Let’s view the ‘main’ table:
[ahu@home ahu]$ ip route list table main 195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0
We now generate a new rule which we call ‘John’, for our hypothetical house mate. Although we can work with pure numbers, it’s far easier if we add our tables to /etc/iproute2/rt_tables.
# echo 200 John >> /etc/iproute2/rt_tables # ip rule add from 10.0.0.10 table John # ip rule ls 0: from all lookup local 32765: from 10.0.0.10 lookup John 32766: from all lookup main 32767: from all lookup default
Now all that is left is to generate John’s table, and flush the route cache:
# ip route add default via 195.96.98.253 dev ppp2 table John # ip route flush cache
And we are done. It is left as an exercise for the reader to implement this in ip-up.
Источник