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

    Здесь я хочу рассказать о настройке шлюза на 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. Написано, чтобы понять самому и рассказать другим.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 38

      +1
      полезно
        0
        Вторая чать должна быть интересней. ждем )
        Хотя в свете вышедшей альфы nftables хотелось-бы его в действии посмотреть, а не iptables (Но все равно интересно. Проблема частая, а вопросов по ней на форумах не уменьшается)
        0
        Прикольно еще было бы настроить роутинг так, чтобы пакеты уходили на нужный канал с учетом пиринговых сетей провайдера.
          +1
          предельно просто: роуты на пиринговые подсети в основную таблицу.
          0
          прекрасно, только вот новичку не очень будет понятно зачем это все… может стоит кратенько описать применение данной схемы?
            0
            Ну а вдруг тебе захочется создать что то типо прокси сервера соединяющий 2-вух провайдеров?
              +3
              Челябинские интернеты настолько суровы, что юзерам приходится использовать несколько провайдеров.
                0
                И не только челябинским ;-)
                  +1
                  Не, настолько суровы роутят магистрали через юзеров =)
                    0
                    Кстати именно так оно и есть… ибо не один из них не отличается стабильностью.
                  0
                  Зачем разбито на несколько частей? Первая часть, как я понимаю, заканчивается ни на чём.
                    0
                    Здесь я рассказываю про маршрутизацию, во второй статье будет про iptables.
                      0
                      о iptables будет интереснее почитать
                    +3
                    так было же несколько дней назад. только более подробно.
                      –1
                      Да я долго писал первую часть, меня обогнали.
                        0
                        Если конкретно, то вот. По-моему, там даже более простое решение, хотя может и не позволяющее дополнительных «наворотов» вроде маршрутизации по типу протокола.
                          0
                          В обоих статьях используется один и тот же принцип для объединения каналов, только в моей все скопом, не так подробно написано зачем нужна та или иная строка, зато даны готовые рабочие скрипты, которые делают свою работу.

                          Кстати маршрутизация по типу протокола — тоже очень интересно будет почитать, ждем следующей части.
                        0
                        Спасибо ) Буду ждать второй части :-)
                          0
                          попробую под шумок приложиться и я с scarych.ru :-)
                            +1
                            черт, я идиот, не туда пишу ((
                            это был коммент в топик выше…
                            0
                            по подобной схеме в соседнем офисе админы сделали сеть, где интернет черпают из eth и gprs
                              0
                              Я сделал проще — 3 виртуальных машины, у каждой по одному каналу — а хост система определялет, через какой шлюз отправить определенные пакеты… каждый из виртуальных серверов — проверяет доступность интернета через свой канал и переключает на работающий другой в случае неполадки… главный плюс — в случае увеличения количества провайдеров — просто клонируется машина и все. также сквид распределяет нагрузку через паренты, которые в гостевых системах стоят…
                                +1
                                Сервера в гамаке? :-)
                                  0
                                  не понял. Стоит обычный P3 1000 что-ли, с гигом оперативы, операционка и на хосте, и на гостях — opensuse, гипервизор xen.
                                    0
                                    Просто мне данное решение кажется слегка извращенным, а про гамак — это была отсылка к анекдоту про «секс в гамаке, стоя на лыжах».
                                  0
                                  Имхо, изврещение хотя решени ооочень гибкое :)
                                  0
                                  Делала когда-то. Повесила все это дело на ssi, записала в несколько скриптов необходимые данные, и меняются они просто при заходе в админку. Кнопкой. Правда единственное, с чем возилась и не понимала почему не меняются таблицы… надо не забывать очищать кэш.

                                  Опять же, необходимо понимать, что нужна проверка на текущего провайдера. Иначе при смене провайдера на текущего, таблицы роутинга разбухают.
                                    0
                                    не проще ли для этих челей использовать готовую железку от tp-link?
                                      0
                                      … Делал подобную вещь под Unix'ом с помощью IPFW.
                                      Щаз попробую ваш метод)
                                        0
                                        Эх, рассказал бы мне кто-нибудь, как делать маршрутизацию по порту source.
                                        И, прежде чем кто-то скажет про --mark,… чтобы такая маршрутизация могла действовать не только для проходящих, но и для исходящих пакетов.
                                          0
                                          CONNMARK? таблица mangle/OUTPUT?
                                            0
                                            таблица mangle/OUTPUT?

                                            … которая, согласно www.citforum.ru/operating_systems/linux/iptables/#TRAVERSINGOFTABLES, будет рассматриваться аккурат после routing decision. Да и CONNMARK тоже до routing decision особо не влезет.
                                              0
                                              У меня работает. Правда, не по source-порту, а по UID, но это незначительные детали.

                                              Да и кстати, в man iptables серым по чёрному написано:
                                              mangle:
                                              This table is used for specialized packet alteration. Until kernel 2.4.17 it had two built-in chains: [...] OUTPUT (for altering locally-generated packets before routing). [...]
                                                +1
                                                P.S. вообще, там еще есть reroute, согласно другой (более детальной) картинке.
                                                  0
                                                  Картинка клёвая.
                                              0
                                              Во второй статье это и описано habrahabr.ru/blogs/linux/55132/
                                              0
                                              В конце статьи необходимо дать ссылку на вторую часть!
                                                0
                                                Да логично, добавил.

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое