0,0
рейтинг
25 июля 2008 в 13:48

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

Вчера столкнулся с небольшой проблемой — на машине с 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
Надеюсь, кому‐ нибудь эта информация окажется полезной.

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

Андрей 'virus' Янцен @zvirusz
карма
68,4
рейтинг 0,0
Backend developer
Реклама помогает поддерживать и развивать наши сервисы

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

Самое читаемое Администрирование

Комментарии (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 лет. Неплохо :)

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