Настройка маршрутизации по двум провайдерам

    Вчера столкнулся с небольшой проблемой — на машине с Win2k3 установлены 2 сетевых карты, 2 провайдера. Проблема оказалась следующая: подсети пересекаются (точнее — совпадают). Было решено использовать за основной шлюз 1го провайдера, а по внутрисетевым ресурсам гулять — через 2го. И всё бы ничего, но машина должна обслуживать входящие соединения с обоих интерфейсов. Но, благодаря статическим маршрутам, ответы на запросы из подсети 10.0.0.0/8, пришедшей со стороны первого провайдера уходили через канал второго провайдера, что было, мягко говоря, не тем, что нужно. Как решить эту проблему под линухом — я знал (и тоже поведаю в этой заметке). Немного погуглив был найден вариант решения (в msdn'e наткнулись на управления приоритетами соединений). Коллега (WAJIM, привет) подумал — и нашёл 2й вариант. Потом немного (совсем немного) подумал я — и по аналогии появился 2й вариант решения для линуха :)
    Итого, под катом вас ожидает 4 варианта решения задачи маршрутизации по 2м провайдерам — 2 под виндовс и 2 под линукс.

    Дано:
    • 2 физических фаервола, по совместительству являющихся шлюзами (192.168.1.10 и 192.168.2.10)
    • 2 сетевых интерфейса (lan1 — 192.168.1.101 и lan2 — 192.168.2.101)
    • желание заставить это добро работать так, как нужно нам

    Чтож… приступимс.
    • Windows
      • Управление приоритетом сетевых подключений:
        Необходимо создать 3 маршрута:
        route -p add 0.0.0.0 mask 0.0.0.0 192.168.1.10 metric 1
        route -p add 10.0.0.0 mask 255.0.0.0 192.168.1.10 metric 1
        route -p add 10.0.0.0 mask 255.0.0.0 192.168.2.10 metric 1

        Далее идём в Сетевые подключения -> Дополнительно -> Дополнительные параметры, перемещаем lan2 вверх, чтобы это соединение оказалось выше lan1. Готово.
      • Приоритет в таблице маршрутизации:
        Опять же — создаём 3 маршрута. Только изменим метрики
        route -p add 0.0.0.0 mask 0.0.0.0 192.168.1.10 metric 1
        route -p add 10.0.0.0 mask 255.0.0.0 192.168.1.10 metric 2
        route -p add 10.0.0.0 mask 255.0.0.0 192.168.2.10 metric 1

        И никаких танцев с приоритетом интерфейсов. Считаю этот метод оптимальным.
        UPD: метрика интерфеса, приоритет которого выше (см. предыдущий пункт) не должна быть наименьшей.
    • Linux
      • Приоритет в таблице маршрутизации:
        Тут почти тоже самое, что и в предыдущем пункте (только синтаксис чуток различается)
        route add default gw 192.168.1.10 metric 0
        route add -net 10.0.0.0/8 gw 192.168.1.10 metric 1
        route add -net 10.0.0.0/8 gw 192.168.2.10 metric 0

      • iproute2:
        Собственно, для этого решения необходимо наличие установленного пакета iproute2. В дебиане — apt-get install iproute.
        В этом случае нам понадобится 2 маршрута
        route add default gw 192.168.1.10 metric 0
        route add -net 10.0.0.0/8 gw 192.168.2.10 metric 0

        Создадим 2 таблицы маршрутизации:
        echo '10 lan1' >> /etc/iproute2/rt_tables
        echo '11 lan2' >> /etc/iproute2/rt_tables

        Добавляем в эти таблицы правила маршрутизации:
        ip route add default via 192.168.1.10 table lan1
        ip rule add from 192.168.1.101 table lan1
        ip route add 127.0.0.0/8 dev lo table lan1

        ip route add default via 192.168.2.10 table lan2
        ip rule add from 192.168.2.101 table lan2
        ip route add 127.0.0.0/8 dev lo table lan2

        Последние правила — для того, чтобы пакеты с локального интерфейса не терялись.

      Так же не стоит забывать, что линукс при перезагрузки очищает таблицы и правила маршрутизации, потому рекомендую создать хитрый скрипт в папке /etc/network/if-up.d. У меня там лежит скрипт такого содержания:
      #!/bin/sh -e

      case "$IFACE" in
        eth1)
         ip route add default via 192.168.1.10 table lan1
         ip rule add from 192.168.1.101 table lan1
         ip route add 127.0.0.0/8 dev lo table lan1
        ;;
        eth2)
         route del default gw 192.168.2.101
         route add -net 10.0.0.0/8 gw 192.168.2.10 1
         ip route add default via 192.168.2.10 table lan2
         ip rule add from 192.168.2.101 table lan2
         ip route add 127.0.0.0/8 dev lo table lan2
        ;;
      esac

      UPD: поправил косяки в указании метрики.

    Выбор за вами. Скажу лишь что было решено остановиться на вторых вариантах для обоих систем (изменение метрики на windows и iproute2 на debian).
    Кому интересна тема маршрутизации в линуксе — рекомендую почитать вот эту вещь lartc.org/howto
    Надеюсь, кому‐ нибудь эта информация окажется полезной.

    И ещё раз, коллеги — с праздником :)

    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 33
    • +5
      Отличная статья!
      • 0
        Сделал то же самое, купив роутер с двумя WAN-портами.
        • +1
          просто так дешевле :)
          это домашняя машина.
        • 0
          а как быть, если есть главное сетевое подключение, вторичное сетевое подключение и подключение по PPPoE, которое идет через вторичное?
          • 0
            какие подсети через какое соединение должны ходить?
            • 0
              шлюз 1, главный 192.168.1.1
              шлюз 2 172.22.71.1 . PPPoE должен через него подключаться.
              Искал в настройках этого PPPoE через какое сетевое подключаться - не нашел.
              • 0
                ххы... route и PPPoE на разных же уровнях работают... посовещались с товарищем, единственное что пришло в голову - поднимать 1е соединение только после установки PPPoE.
                домой доберусь - ещё подумаю.
                • 0
                  сетевые подключения -> дополнительно -> дополнительные параметры
                  какое соединение выше стоит? если 192.168.* - передвинь его в самый низ и попробуй зацепить PPPoE.
                  • 0
                    окей, попробую. Пока что PPPoE временно не работает.
              • +1
                Чуть больше скриптоа. Очень полезная статья.
              • 0
                Не совсем понял, почему остановились на втором варианте под Debian. Он, очевидно, сложнее.

                С Днем сисадмина! ;)
                • 0
                  Ответ очень прост. Пол года назад, когда у меня на дебиане появился 2й провайдер - я до 1го варианта не додумался. А сейчас, когда уже месяцев 5 всё работает стабильно и без нареканий - менять не хочется :)
                  Да и, по моим данным, iproute2 - довольно гибкая вещь. Так что, можно сказать, вариант был выбран с целью на светлое будущее, когда этот функционал может понадобиться. // нашёл оправдание :)
                  • 0
                    Routing and Remote Access Services в Windows даже рядом не стоят с гибкостью iproute2/iptables, причем бесплатно,
                    у Microsoft на этот счет есть, тоже коммерческий, ISA Server.
                    • 0
                      ISA Server не занимается рутингом, это firewall, пусть и с разными дополнительными возможностями.
                      • 0
                        ну не совсем так, на сервере с установленным ISA Server служба Routing and Remote Access работает по-другому и эти службы (служба исы Microsoft Firewall и RRAS ставятся ведь зачем-то в зависимость)
                        • 0
                          Ага. Вот так и вижу: стоит себе служба Routing and Remote Access, никого не трогает, а тут глядь - появилась служба Microsoft Firewall, RRAS мгновенно воспаряет духом от такого факта и ка-а-а-а-ак начнет работать по-другому! :)
                          В зависимость они ставятся по очень простой причине: ISA содержит конфигуратор для VPN соединений, а RRAS их реализует. Соответственно не лишне бы его запускать, когда стартуется ISA. Синхронизацией конфигов ISA->RRAS занимается служба "Microsoft ISA Server Control".
                • 0
                  >подсети пересекаются (точнее — перекрывают друг друга)
                  И чем же это точнее? :)
                  • 0
                    исправил на "совпадают" :)
                  • –3
                    Вообще, с описанной задачей встречается каждый второй пользователь домовых сетей. Что бы и интернет был подключен (VPN) и что бы к внутренним ресурсам был доступ. Решение тривиальное, для тех кого слово TCP/IP не просто строчка в списке свойств сетевой карты. Под windows работает наверно аж с 95 года, заслуг linux я тут не вижу (как и не вижу linux на десктопах клиентов домовых сетей)

                    В любом случае, поздравляю вас с этим приятным для вас открытием!

                    и с Днем Сисадмина.
                    • +1
                      Здесь отличие в том, что автор не только прописал скажем
                      route add 0.0.0.0 mask 0.0.0.0 192.168.0.1
                      route add 10.0.0.0 mask 255.0.0.0 10.1.1.1

                      а еще и узнал о приоритизации гейтвеев, ведущих в одну и ту же сеть.
                      • –2
                        Искренне рад за автора.
                      • +1
                        linux на десктопах клиентов домовых сетей?
                        А как же я? На десктопе линух, плюс еще пара друзей. тоже only linux.
                      • 0
                        Большое спасибо за статью! Как раз понадобилось что-то такое!
                        • 0
                          А вот этот маршрут наверное и не нужен:
                          route -p add 10.0.0.0 mask 255.0.0.0 192.168.1.10 metric 2

                          Вы же прописали гейт для подсети 10.0.0.0 mask 255.0.0.0:
                          route -p add 10.0.0.0 mask 255.0.0.0 192.168.2.10 metric 1

                          через гейт с метрикой 2 пойдет только в том случае, если гейт 1 будет недоступен.
                          • 0
                            дык если указать только один маршрут - на второй интерфейс с этих же адресов не будет возможности присоединиться к хосту
                          • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            iproute2 золотаю вещь! с iptables (MARK) ведь ешё можно и трафиг в зависимости от портов (разных приложений) разруливать по разным каналам....
                            ну и всё это чудо сделал наш земляк Алексей Кузнецов...да и чуть про шейпинг незабыл....cbq, htb iproute2 тоже используют
                            • 0
                              у меня дома всё гораздо хитрее сделано.
                              2 интернета: PPPoE + АДСЛ.
                              + На адсл бесплатный сайт и фтп.
                              + домашняя локалка
                              + городская локалка
                              + с этой городской локалки ко мне цепляются пользователи.

                              единственное что надо бы сделать - слить два канала в один с балансировкой нагрузки. Под линуксом как сделать знаю, под виндой не очень. Сейчас работает банальная вещь - разные группы пользователей сидят по разным каналам и если отваливается один из каналов происходит переключение на другой.
                              • +1
                                спасибо за статью — просто и только
                                • 0
                                  Завел на сервер Centos 6.5 два провайдера, один через роутер, второго напрямую
                                  Вначале мудрил со сложными скриптами маркировки пакетов, но мне просто нужно было чтобы веб-сервер был доступен с двух провайдеров
                                  Нашел потом вашу статейку, оказалось все просто.
                                  Сделал по аналогии, единственное со стартовым скриптом не вышло
                                  Добавил просто bash скрипт без всяких условий, только правила маршрутизации.
                                  Сохранил в избранном
                                  • 0
                                    Спустя 5.5 лет. Неплохо :)

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