Pull to refresh

Используем 2+ провайдера (первая часть)

Reading time3 min
Views53K
Здесь я хочу рассказать о настройке шлюза на Linux'e, для использования 2-х (и более) провайдеров интернета.
Для настройки мы будем использовать возможности 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. Аналогично вторая запись.
И наконец самое интересное:
ip rule add from $SRV11 fwmark 10 table T1
ip rule add from $SRV12 fwmark 20 table T2
Используя iptables мы можем маркировать интересующие нас пакеты и маршрутизировать их на основе этих меток. Собственно здесь мы добавили два правила: для пакетов, имеющих метку 10, использовать таблицу T1, для пакетов с меткой 20 — T2. Сейчас возможно не очень понятно для чего это может потребоваться, но из правил iptables все станет ясно. Для просмотра правил выполняем «ip rule», при маршрутизации они проверяются по порядку.
Ну вот половина работы сделана осталось написать правила для iptables, об этом мы поговорим во второй части.

Вторая часть.
оригинал статьи в моем блоге Используем 2+ провайдера (первая часть)

p.s. Написано, чтобы понять самому и рассказать другим.
Tags:
Hubs:
Total votes 60: ↑50 and ↓10+40
Comments38

Articles