4.2. Маршрутизация в случае нескольких подключений к провайдерам.

Общий вид конфигурации с двумя подключениями локальной сети (или даже одного компьютера) к Internet.

                                                                 ________
+------------+ /
| | |
+-------------+ Provider 1 +-------
__ | | | /
___/ \_ +------+-------+ +------------+ |
_/ \__ | if1 | /
/ \ | | |
| Local network -----+ Linux router | | Internet
\_ __/ | | |
\__ __/ | if2 | \
\___/ +------+-------+ +------------+ |
| | | \
+-------------+ Provider 2 +-------
| | |
+------------+ \________

На этом этапе обычно возникает два вопроса.

4.2.1. Двойной канал

Первое – как маршрутизировать пакеты, ответные к пакетам, приходящим, например, от Провайдера1,  к тому же провайдеру.

Прежде всего, оговорим некоторые обозначения. Пусть $IF1 (if1 на картинке)первый интерфейс, $IF2 – второй. $IP1 IP-адрес интерфейса $IF1, $IP2 – соответственно,  $IF2.  Далее, $P1 IP-адрес шлюза на стороне Провайдера 1, $P2 – Провайдера2. И, наконец, $P1_NET –сеть, содержащая $P1, и $P1_NET - то же для $P2.

Создаются две дополнительные таблицы маршрутизации, T1 и 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. Вполне разумно маршрутизировать пакеты к ближайшему соседу через интерфейс, к которому он подключен. Заметьте, что аргумент "src" определяет, какой в точности исходящий IP-адрес выбран.

	ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
Далее, ваши предпочтения для маршрута по умолчанию:
	    ip route add default via $P1
Теперь устанавливаем таблицы маршрутизации. Здесь определяется, какой пользоваться таблицей в каждом случае. Т.е. конкретному адресу источника жестко сопоставляется выходной интерфейс.
	    ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

Этот набор команд гарантирует, что все ответы на трафик, входящий через определенный интерфейс, уйдут через тот же интерфейс.  

Все это –настройка в общих чертах. Она будет действовать для всех процессов, выполняющихся непосредственно на маршрутизаторе, а также для локальной сети с маскарадингом. При отсутствии маскарадинга возможны два случая – в вашей сети задествовано IP-пространство от обоих провайдеров, или часть адресов одного провайдера маскарадится в адресное пространство второго. В обоих случаях потребуется указать правила, выбирающие маршрут наружу через одного из провайдеров на основе IP-адреса компьютера в локальной сети.

4.2.2. Распределение загрузки каналов.

Второй вопрос – как распределять трафик, идущий через двух провайдеров. Это несложно, если  двойной доступ настроен, как показано выше.

Вместо указания маршрута по умолчанию через одного из двух провайдеров, нужно указать маршрут по умолчанию как многовариантный. В исходном (немодифицированном) ядре это приведет к распределению выбранных маршрутов между двумя провайдерами. Это делается следующим образом (пример основан на материале из предыдущего раздела):

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1

Это приведет к поочередному выбору маршрутов через обоих провайдеров. Параметр weight можно изменять для увеличения доли маршрутов через какого-либо из провайдеров.

Имейте в виду, что распределение не будет абсолютно точным, так как оно основано на маршрутах, а маршруты кэшируются в ядре. Таким образом, маршруты к часто используемым сайтам будут идти всегда (т.е. все время, пока маршрут остается в кэше ядра – прим. пер.) через одного и того же провайдера.

Далее, если вы в самом деле хотите сделать все, что описано здесь, вам может быть полезно ознакомиться с патчами Джулиана Анастасова: http://www.linuxvirtualserver.org/~julian/#routes . Эти патчи делают многие операции более удобными.