Работа с двумя провайдерами интернет одновременно

2 isp LinuxПодключил я себе дома помимо стандартного ADSL канала еще один канал интернет через витую пару. За ADSL канал абонентская плата для меня незначительна, поэтому решил оставить этот канал как запасной. Воткнул оба канала интернет в свой сервер-роутер на антресоле (для этого пришлось перевести ADSL роутер в режим bridge) и стал думать как сделать, чтобы оба канала работали одновременно.
Все нижеприведенные конфиги подходят для ОС Linux.
Мысль была такая,

  • Пустить мой основной рабочий комп через новый интернет канал (этот комп больше всего потребляет трафика)
  • Сам сервер-роутер (обновления ОС) и все остальные мобильные WiFi устройства пустить через ADSL канал.


Схема сети

Схема сети

Из-за того, что мне надо было, чтобы два "внешних" IP адреса оказались на сетевых картах сервер-роутера, WiFi ADSL роутер пришлось значительно переконфигурировать. ADSL роутер был переведен в режим bridge и стал точкой доступа для мобильных устройств и моего основного компа. На всех устройствах моей сети основным шлюзом стоит сервер-роутер. Но это у меня такая структура сети, если у вас 2 обычные Lan провайдера никаких подготовительных действий с ADSL роутерем делать не надо.

Настройка заключается в том, чтобы роутить мой компьютер через один интерфейс интернета, а всех остальных клиентов, включая сам сервер-роутер через другой интерфейс и в этом нам поможет программа iproute и iptables.

В конфиг /etc/iproute2/rt_tables добавляем идентификаторы наших двух провайдеров. Я добавил в файл 2 строки


100      adsl
101      futures

Числа и названия идентификаторов можно задавать произвольные, но потом в скрипте роутинга надо обязательно ссылаться на эти же названия.

Пример скрипта роутинга, который ставим в автозагрузку компьютера


#!/bin/sh

#########adsl
#наш ip первого провайдера
IP1=91.122.15.xx
#интерфейс нашего сервер-роутера к которому подключен этот провайдер
IF1=eth3
#шлюз провайдера
P1=91.122.0.1
#сеть провайдера
P1_NET=91.122.0.0/24

#futures telecom.
#Данные аналогично провайдера adsl
IP2=217.15.19.xx
IF2=eth2
P2=217.15.19.1
P2_NET=217.15.19.0/24

#очистка и удаление таблиц adsl и futures
ip route flush table adsl
ip route flush table futures
ip rule delete table adsl
ip rule delete table futures

#создаем таблицы и метки для роутинга пакетов и задаем метки провайдерам
ip rule add from $IP1 table adsl
ip rule add from $IP2 table futures
#1 метка - adsl провайдер
ip rule add fwmark 1 table adsl
#2 метка - провайдер futures
ip rule add fwmark 2 table futures

#создаем правила роутинга
ip route add $P1_NET dev $IF1 src $IP1 table adsl
ip route add default via $P1 table adsl
ip route add $P2_NET dev $IF2 src $IP2 table futures
ip route add default via $P2 table futures

#сбрасываем кэш маршрутизации
ip route flush cache

А теперь в iptables вместо правил Nat занесем эти строки


#Включаем nat
#Прописываем правила для нашего основного рабочего компьютера, его ip 192.168.0.17
#eth0 это интерфейс сервер-роутера к которому подключена наш ADSL роутер
#Все что приходит с него помечаем меткой 2 - провайдер futures
iptables -t mangle -A PREROUTING -s 192.168.0.17/32 ! -d 192.168.0.0/24 -j MARK --set-mark 2
iptables -t mangle -A INPUT -i eth0 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -m connmark --mark 2 -j MARK --set-mark 2

#Прописываем сети для оставишихся компьютеров сети 192.168.0.0, исключая ip 0.17
#эти компьютеры метим меткой 1, как и в скрипте роутинга 
#Правила писать в одну строку, что разделено знаком "\"
iptables -t mangle -A PREROUTING -m iprange --src-range \ 
   192.168.0.0-192.168.0.16 ! -d 192.168.0.0/24 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m iprange --src-range \
   192.168.0.18-192.168.0.255 ! -d 192.168.0.0/24 -j MARK --set-mark 1
iptables -t mangle -A INPUT -i eth0 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m connmark --mark 1 -j MARK --set-mark 1

iptables -t nat -A POSTROUTING -m mark --mark 1 -j MASQUERADE
iptables -t nat -A POSTROUTING -m mark --mark 2 -j MASQUERADE

Дефолтным маршрутом сервер-роутера я сделал gateway adsl провайдера. Т.е. если выходить в интернет с самого сервера, то инет пойдет через adsl соединение.
Добавляя нужные ip адреса для меток 1 или 2 в конфиг iptables можно управлять нагрузкой каналов. Для этого надо перезапускать только правила iptables. Скрипт роутинга трогать не нужно.

Статья просмотрена 27 129 раз
Запись опубликована в рубрике Firewall, iptables, Настройка ОС с метками , , . Добавьте в закладки постоянную ссылку.

20 комментариев: Работа с двумя провайдерами интернет одновременно

  1. Лелик говорит:

    Господа, продолжая вышеизложенную тему можно проще. Берется роутер Asus PX3042H с двумя WAN портами, оба канала суммируюся в процентном отношении и все. У меня ADSL-3Mbit и выделенка-6Mbit в итоге на 1 LAN порту 9Mbit.

  2. rIDEr говорит:

    Я хочу настроить аналогичную схему, но вместо “основного компьютера” свич и сетка на 8 компьютеров.
    Имеется два провайдера:
    1) Ethernet PPPoe со статическим адресом, скорость не высокая, но стабильная, плюс почтовые ящики на их сервере.
    2) Оптика-LAN, скорость более высокая (с какой надежностью не понятно), кроме того IPTV на отдельный порт LAN. То есть коробка (раздает оптику на два порта Internet и IPTV, только что узнал у провайдера :)
    задачи приблизительно такие как у автора статьи.
    Имеется железо Asus wl500GPv2 и ПС на базе СeleronD 2.6GHz-RAM1GB
    Господа, какие рекомендации будут?

  3. rIDEr говорит:

    Есть намерения в PC установить три сетевые карты(одна встроенная) и ClearOs с режимом MultiWAN (может для iPTV другой режим нужен). В две Internet(2) и IPTV, соответственно, третью соединить с одним из LAN портом ASUS. В другой соединить со Свич, в Порт WAN ASUS подключить Internet(1).
    Вопрос в том как все это настроить. Мои знания в *NIX близкие к нулю.

  4. mik говорит:

    Насчет ClearOS настроек ничего не скажу, т.к. не юзал. Я так понимаю вы выбрали эту ОС из-за веб интерфейса чтобы попроще было :)
    Чтобы настроить все это надо четко понимать логику работы что вы хотите сделать. Неважно что вы *nix не знаете, лишь бы только представляли куда какие маршруты прописать, а синтаксис как говориться освоите.
    В 1 сетевую интернет (2) – значит надо настроить поднятие PPPoe сессии на этом интерфейсе.
    Во 2 сетевую IPTV – тут надо понимать как iptv работает у провайдера. Обычно это трансляция мультикастовых пакетов, значит надо организовать эту трансляцию. Для возможность трансляции мультикаста через компьютер-роутер надо всего лишь разрешить igmp пакеты. Возможно придется поставить прогу для этого (все упирается в возможности ClearOS)
    В 3 сетевую Lan порт Asus , а уже в wan Asus интернет (2). Не очень удачное решение. Придется повозится с маршрутами в самом Asus и на сервере, чтобы все работало. Т.к. на 4 порту сервера будет свич с такой же сетью lan.
    На этом пункте я бы предложил:
    купить свич на все 8 компьютеров сети и воткнуть его в третью сетевую компа, а уже в свич воткнуть asus в роли wifi точки доступа без подключения его к интернет (2) – (это если в wifi есть необходимость).
    В 4 сетевую уже подключить интернет (2).
    Свич придется покупать 16 портовый, на 8 портов дырок не хватит..
    Ну и вопрос как это настроить так и остался :) начните с простого интернет (1) в первую сетевую, во вторую Lan свич ну и пробуйте настроить доступ в инет с компьютера подключенного к свичу, далее усложняйте пока не дойдете до нужной сложности :)

  5. rIDEr говорит:

    Про igmp пакеты слышал но еще не знаю что это такое. Один спец говорил что свичи нужны особенные?! Буду разбираться.
    ” ….Т.к. на 4 порту сервера будет свич с такой же сетью lan.” вот эту фразу не понял, какой 4 порт?
    У нас два свича на 8 и 5 портов, всего 9 или 10 портов.

    • mik говорит:

      я так понял, что будет подключен asus через lan порт, а еще фактичести также к серверу будет и свич подключен.
      4 же сетевые на сервере вы планировали? 1 встроенная + 3 pci..

  6. rIDEr говорит:

    нет мне хотелось бы ограничится 3 сетевыми (2+1 встроенная). Схема сети точно такая как у Вас на рисунке и задачи б! Почему я и заинтересовался данной темой.
    Вместо ADSL модема ASUS wl500gpv2(WAN-ethernet c PPPoE), сервер подключен двумя картами на два выхода ONT (Optical Network Terminal) -интернет(2) и IPTV, а вместо компьютера на вашей схеме свичи 10 портов. Свичи находится в другом помещении. Покупка новых switch или роутеров и перепрокладка сетей не планируется. IPTV рассматривается как бонус, т.е. хотелось, но не обязательно.

    • mik говорит:

      Ну так если почти все как у меня, то думаю проблем не должно быть если все по этой инструкции делать :)
      Вот только с выбором linux дистрибутива надо определиться. ClearOS может и хорошо для новичка, но как подсказывает опят не все можно проделать через web интерфейс, возможно придется ковыряться внутри командной строки.
      Давайте так. Начните с чего-нибудь, чтобы приступить к решению задачи. Самое простое на мой взгляд это сделать доступ в инет через провайдера без pppoe. Для новичка все может быть трудно, даже прописать ip на интерфейсе.
      Как будут появляться конкретные вопросы пишите здесь, постараюсь ответить.

  7. rIDEr говорит:

    PPPoe без проблем на ASUS (прошивка от Олега) через вебморду. До этого Kerio FW &MS на машине с двумя картами интернет и почту раздавал исправно.
    Поставил ClearoS на PC-router с 3мя картами. К одной карте Lan назначил стат. адрес 192.168.1.2 ( остальные2 DHCP) и хочу для удобства работы (15″CRT напрягает) подключится ноутбуком с Windows напрямую без свича кроссом.
    Как подключится к по веб интерфейсу сервера ClearOs?

  8. rIDEr говорит:

    Вопрос снят, получилось подключится. Это же совсем другое дело ;)
    Понадобилось в браузере указать прокси и порты как для прокси[3128] так и подключения [81]. Продолжаю движение…..

  9. rIDEr говорит:

    Сейчас схема такая, упрощенная- PC роутер на ClearOS с З-мя карточками:
    1)Ext. DHCP ( дин IP 87.x.x.x)- Internet
    2) Hot LAN 169.264.1.х (рекомендации провайдера) – IPTV
    3) LAN IP192.168.1.11 – подключен к ноуту 192.168.1.х кроссом.
    Интернет есть, подключается через прокси 192.168.1.11:3128. Вопрос: как на ноуте получить IPTV? В настройках программы можно указать только IP-ноута.

  10. rIDEr говорит:

    Программа это “плеер IPTV”
    .

  11. mik говорит:

    Поскольку вы не уточнили как работает IPTV у провайдера я опишу применительно к моему провайдеру и как это работает у меня.
    У меня провайдер раздает iptv через пакеты мультикаста. Самое простое что я нашел это поставить на компьютер программу udpxy – http://sourceforge.net/projects/udpxy/.
    Как установили программу на сервере запускаем

    udpxy -a eth1 -p 4022 -m eth2

    где eth1 – интерфейс локальной сети, у вас это тот что 192.168.1.11
    4022 – порт на сервере, так и оставляете
    eth2 – интерфейс откуда брать пакеты телевидения, у вас 169.264.1.х
    соответственно номера ethX подставьте свои номера интерфейсов.
    После запуска можно с ноута проверить как запустился сервер udpxy, наберите
    в браузере http://192.168.1.11:4022/status должно появиться типа что-то статистики сервера.
    Если все работает можно смотреть программы, но перед этим надо переделать playlist программ.. Смысл переделки playlista в том чтобы указать, что программе IPTV следует обращаться не сразу на какой-то ip вашего провайдера, а именно на ваш ip сервера 192.168.1.11. Т.е для одной программы лист будет выглядеть

    http://192.168.1.11:4022/udp/224.200.202.51:1234

    http://192.168.1.11:4022 – это ваш сервер
    224.200.202.51:1234 это уже сервер где-то в инете с самой программой
    Пробуйте если что на vlc программе, необязательно использовать программу провайдера..

  12. юрик говорит:

    лёлика ф топку по 2 причинам:
    1. Не у всех асус работает с провайдерами (а этот ваапще не работает судя по скриншотам интерфейса имхо нет настройки параметров WAN портов!!!)
    2. Люди хотят недорогой эргономичный девайс а в совокупе с данным получается аж 3 девайся – мега ненадежно.

  13. Влад говорит:

    Подскажите, если я подключаюсь через dhclient, то IP1 это где “fixed-address” в файле dhclient.leases? А P1_NET как в таких условиях определить?

    • mik говорит:

      У меня приведен случай когда ip адреса провайдеров всегда одни и теже. Если они меняются, то тут не подскажу правильный конфиг.
      Определить всё достаточно просто, надо провод провайдера к себе в компьютер воткнуть и получить адрес который выдал провайдер. В зависимости от операционной системы посмотреть нужными командами какой адрес сейчас у компьютера и маршрут по умолчанию.
      Ну с адресом все итак понятно, а P1_NET будет шлюз по умолчанию, только на конце 0/24, а первые три цифры оставить как есть.

      • Влад говорит:

        Т.к. я подключаюсь через dhclient, приходится изучать файл dhclient.leases. Первые три цифры тоже меняются, вот к примеру два подключения и данные каждый раз меняются:

        fixed-address 100.68.229.190;
        option subnet-mask 255.255.255.252;
        option dhcp-lease-time 518400;
        option routers 100.68.229.189;
        option dhcp-message-type 5;
        option dhcp-server-identifier 100.68.229.189;

        fixed-address 100.84.105.213;
        option subnet-mask 255.255.255.252;
        option dhcp-lease-time 518400;
        option routers 100.84.105.214;
        option dhcp-message-type 5;
        option dhcp-server-identifier 100.84.105.214;

        Просто слишком много данный, которые могут измениться, вот и хотелось бы обойтись более простыми способами, к примеру не использовать сеть провайдера и серый ip для меня из их сети. Если я в качестве маршрута по умолчанию указываю как “ip route add default via $GW dev wwx001e101f0000 table modem”, то у же всё работает, GW я подставляю из файла leases. Т.е. по вашей смеме мне достаточно выполнить “ip route add default via $P1 table adsl” и это “ip route add $P1_NET dev $IF1 src $IP1 table adsl” вроде как не нужно, т.к. уже работает. Просто там много переменных, хотя все они есть в файле lease. Хотя нет, в вашем случае эти маршруты разные. В общем, я к тому что так сказать применить минимально необходимое. Ещё вопрос, у меня локальная сеть (192.168.2.0/24) и конечная цель отличается от вашей, просто по вашей схеме (и другим найденным), пытаюсь адаптировать под свою задачу, смысл которой, чтоб данный маршрут использовать только для заходов на определённые сайты из локальной сети всем. А основной должен быть через PPPoE, который сейчас и работает.

  14. mik говорит:

    Понятно что у вас с адресами и почему они так меняются. Это частные адреса сети 100.64.0.0 — 100.127.255.255 (маска подсети 255.192.0.0 или /10). Т.е провайдер выдает не белый адрес, а потом делает NAT на белый. Ну и вы еще свою сеть 192.168.2.0/24 натите. Двойной NAT в этом случает будет. Это нормально работает, но пробросы портов в таком случае уже не будут работать. Просто имейте это ввиду.
    как я понял вы уже в качестве переменных все прописали в конфиг роутинга?

    А задача ваша очень просто решается, я так у себя делал, чтобы определенные сайты работали только через определенного провайдера.
    Вычисляете ip к которому надо делать определенные подключения и добавляете в конфиг iptables 2 строчки

    iptables -t mangle -A PREROUTING -s 192.168.2.0/24 ! -d xx.xx.xx.xx/32 -j MARK --set-mark 2
    iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -d xx.xx.xx.xx/32 -j MARK --set-mark 1

    соотверсвенно маркируете сами меткой 1 или 2 в зависимости от провайдера. Таким образом первая строчка запрещает сети 192.168.2.0/24 маркировать трафик на ip xx.xx.xx.xx, а вторая строчка маркирует его нужной меткой провайдера. и доступ к этому ip будет именно с нужного провайдера. Соответсвенно можно задавать разные маски адресов и маркировать не только один ip но и целый диапазон.

    Тут только один минус, в iptables нельзя задавать fqdn имена. Но вы почитайте возможно есть скрипты, которые сначала по fqdn вычисляют ip сайта и потом уже в iptables можно оперировать ip.

    Сейчас я использую как мне кажется более красивое решение. Я ушел от настройки 2 провайдеров на linux машине в сторону RouterOS. (продукция Mikrotik ) Но это не бесплатно, но и не очень дорого. Принцип логики там в двух провайдерах аналогичный, а вот сайты на которые надо ходить через определенный ip просто добавляются в одну таблицу по имени dns и сразу все работает..

    • Влад говорит:

      Ещё несколько вопросов, у вас есть такой маршрут:
      ip route add $P1_NET dev $IF1 src $IP1 table futures
      ip route add default via $P1 table futures
      Можно ли задать его так:
      ip route add default via $P1 dev $IF1 table futures
      чтоб не вычислять P1_NET? Если нет то вместо P1_NET указать 100.0.0.0/8, т.к. только 100 там постоянно.
      Ещё, одного провайдера я никак не вношу в таблицы, подразумеваю что для него будет работать default, принятый в системе, т.е. для него уже система сама выбрала маршрут типа:
      default dev ppp0 scope link
      10.91.255.254 dev ppp0 proto kernel scope link src X.X.X.X
      а только для второго провайдера (futures) применить правила и маршруты? С iptables останется только одно правило
      iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -d xx.xx.xx.xx/32 -j MARK --set-mark 1
      Или это не правильный ход?

  15. mik говорит:

    насчет такой строчки
    ip route add default via $P1 dev $IF1 table futures
    можно и так написать. Кстати вот в этой статье https://habrahabr.ru/post/100919/ хорошо написано про дефолтный маршрут. Хотя статья достаточно сложная и надо досконально разбираться..
    Но и P1_NET можно действительно написать как 100.0.0.0/8, хотя правильнее думаю будет написать 100.0.0.0/10 т.к. там все таки в маску 8 попадут и реальные адреса интернет.
    А насчет правильно или нет, я со 100% уверенностью не скажу. Вы сами пробуйте. Представьте в какой-то момент времени что ip статические выставьте все параметры и пробуйте. Если все получится значит уже думайте как задавать в динамическом варианте.
    Еще имейте ввиду про порядок правил iptables. Порядок правил тоже играет важную роль.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>