Для настройки мы будем использовать возможности iptables и утилиты ip из пакета, который как правило называется iproute2. А для решения поставленной задачи пакеты мы будем маршрутизировать на основе "policy routing" (т.е. маршрутизация на основе политик), а не "destination routing" (маршрутизация на основе адреса получателя).
Итак, приступим. Для начала определимся с переменными:
#!/bin/bash
IF1=eth1
IF2=eth2
IF - это сетевые интерфейсы, которые смотрят в интернет, через наших провайдеров
IP1=10.10.10.10
IP2=20.20.20.20
IP - это наши внешние IP-адреса, которые нам выдали провайдеры
P1=10.10.10.1
P2=20.20.20.1
P - это шлюзы по умолчанию у наших провайдеров
Policy routing позволяет выполнять маршрутизацию на основе адреса источника поэтому перечислим сервера которые будут учавствовать:
SRV11=192.168.0.11
SRV12=192.168.0.12
Здесь SRV11 и SRV12 - это два айпишника одного и тогоже сервера (это важно!), это позволяет одному серверу обрабатывать входящие соединения с двух провайдеров. Конечно же, существуют и другие варианты реализовать эту возможность, но я буду использовать именно айпишники, мне кажется для начала так будет проше.
Ну а теперь самое интересное - пишем правило для маршрутизации.
Первое что мы должны сделать это добавить свои таблицы маршрутизации, для этого необходимо отредактировать файл /etc/iproute2/rt_tables, например так:
#echo "101 T1" >> /etc/iproute2/rt_tables
#echo "102 T2" >> /etc/iproute2/rt_tables
Заполняем первую таблицу:
ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
Тоесть мы добавляем маршруты, в которых указываем что попасть в подсеть первого провайдера можно через первый интерфейс. Во второй строчке мы добавляем шлюз по умолчанию.
Тоже самое и во второй:
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2
Затем разберемся с основной таблицей, которая называется "main". Ее мы видим, когда набираем ip route:
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
ip route add default via $P1 metric 10
Первые две строчки аналогичны предыдущим записям, только опущено "table main". В третьей строчке задается маршрут по умолчанию с указанием метрики.
На этом с маршрутизацией разобрались, чтобы посмотреть что у нас находится в таблице маршрутизации можно выполнить команду "ip route show table <имя таблицы>". Теперь приступим к правилам. Как раз по правилам и будет приниматься решения какой пакет по какой таблице будет маршрутизироваться.
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2
Здесь мы указали, что если адрес источника равен первому внешнему адресу, тогда маршрутизация выполняется по таблице T1. Аналогично вторая запись.
И наконец самое интересное:
Используя iptables мы можем маркировать интересующие нас пакеты и маршрутизировать их на основе этих меток. Собственно здесь мы добавили два правила: для пакетов, имеющих метку 10, использовать таблицу T1, для пакетов с меткой 20 - T2. Сейчас возможно не очень понятно для чего это может потребоваться, но из правил iptables все станет ясно. Для просмотра правил выполняем "ip rule", при маршрутизации они проверяются по порядку.
ip rule add from $SRV11 fwmark 10 table T1
ip rule add from $SRV12 fwmark 20 table T2
Ну вот половина работы сделана осталось написать правила для iptables, об этом мы поговорим во второй части.
p.s. Написано, чтобы понять самому и рассказать другим.©
8 комментариев:
Все равно, осталось не понятно, зачем это нужно. какая задача решается таком образом.
Как я понял, всё равно приходится руками устанавливать маршруты - через какого провайдера пропустить трафик.
Ну в любом случае что-то приходится настраивать руками. Понятней станет во второй части, там я объясню как все будет работать
Никак не могу понять откуда $P1_NET и $P2_NET ? где они прописываются...
в $Px_NET провайдерские подсети
я был бы очень признателен за любой пример
Например так:
P1_NET=95.86.152.122/30
ip route add $P1_NET dev $IF1 src $IP1
благадарю
В переменных по провайдерским сетям у Вас указано P1, а не P1_NET. В чем прикол?
Отправить комментарий