четверг, 22 марта 2012 г.

ospf как лучший способ связать 4 провайдеров в один стабильный канал


Возникла такая небольшая задачка.

Итоговые данные:
Склад работает в терминальном режиме с базой, расположенной в офисе.
На складе подключено 2 провайдера. Один беспроводной с серым ip, второй проводной по vpn. Всего 3 интерфейса.
В офисе, страшно сказать, 3 провайдера. Беспроводной с серым и белым ip, и 2 проводных, из которых первый pptp, второй ppoe. Итого 5 интерфейсов.
"Небольшая" задачка состоит в том, чтобы при любой ситуации склад продолжал работать.
Решение первое: скрипты - громоздко, слишком много событий придется отслеживать (для впн - соединен, сброшен, залип, кончились деньги, для обычных - есть коннект, нет, кончились деньги).
Второе решение: что-то там с bgp - ужас и только. Причем не из-за геморности настройки, а согласования с кучей провов.

Как обычно, порывшись основательно в Инернет, было обнаружено более красивое (с моей точки зрения) решение - протокол маршрутизации ospf.

Начинаем


Рисуем схему подключений (на всякий случай скрыл все адреса):
Офис:
Провайдер 1 дает реальный и серый ip, соответственно, по одному каналу есть интернет, по второму только доступ ко второй точке, расположенной на складе.
Провайдер 2 подключает по vpn pptp, соответственно два адреса, серый - доступен провайдерам, членам krs-ix, реальный ip доступен всем.
Провайдер 4 подключает по ppoe, дает реальный ip доступный всем, но не входит в krs-ix.
Склад:
Провайдер 1 дает серый ip для связи с офисом.
Провайдер 3 подключает по vpn pptp. Состоит в krs-ix. Получается 2 серых ip, реального нет.

Итого 6 каналов (слева офис, а так же относительная скорость канала):
p1_lo-p1_lo (медленно)
p1_ip-p3_ip (медленно)
p2_lo-p3_lo (быстро)
p2_lo-p3_ip (быстро)
p2_ip-p3_ip (быстро)
p4_ip-p3_ip (средне)
где ip - реальный, lo - серый, все каналы работают (протестировано электро... пингом и tracert'ом)
Объясню почему так много - иногда у провайдера заканчиваются деньги, и происходит такая штука - интернета по vpn подключению нет, но в пределах krs-ix по серым адресам все работает. Причем без ограничения скорости.
Еще одно замечание - у провайдера 1 самый стабильный канал, еще не разу не рвался, но оооочень медленный (256 кб/с).

Теперь, по хорошему, необходимо связать эти адреса в туннели, для секурности и вообще ospf без этого не заработал). вариантов не много. ipsec, pptp, openvpn.
ipsec отпал из-за некоторых нехороших провов, которые его не маршрутизируют.
pptp отпал просто потому, что microsoft, доп.настройки, лишняя нагрузка на оборудование, возможные проблемы с провайдерами
Остался openvpn, с ним и будем работать.

Расписываем туннели (адрес привязки, порт, внутренний адрес, и с другого конца туннеля внутренний адрес, порт, адрес привязки) :
addr_p1_1 1195 10.10.1.1 10.10.1.2 1195 addr_p1_2
addr_p1_2 1196 10.10.2.1 10.10.2.2 1196 addr_p3_2
addr_p2_1 1197 10.10.3.1 10.10.3.2 1197 addr_p3_1
addr_p2_1 1198 10.10.4.1 10.10.4.2 1198 addr_p3_2
addr_p2_2 1199 10.10.5.1 10.10.5.2 1199 addr_p3_2
addr_p4_1 1200 10.10.6.1 10.10.6.2 1200 addr_p3_2

Устанавливаем с обоих сторон пакет openvpn, и рисуем наши первые два конфига.
Со стороны офиса: cat /etc/openvpn/tun_p1_lo-p1_lo.conf

local addr_p1_1
port 1195
dev tun1
ifconfig 10.10.1.1 10.10.1.2
secret tunel-all.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key

Со стороны склада: cat /etc/openvpn/tun_p1_lo-p1_lo.conf

remote addr_p1_1 1195
local addr_p1_2
lport 1195
dev tun1
ifconfig 10.10.1.2 10.10.1.1
secret tunel-all.key
keepalive 10 60
ping-timer-rem
persist-tun
persist-key

Видно из конфигов, что используется статический ключ, который необходимо сгенерировать заранее.
Продолжаем описывать остальные туннели, что вы сделаете с легкостью, исходя из примеров.
Запускаем openvpn, проверяем, что все интерфейсы tun поднялись, проверяем что туннели поднялись и пинги проходят. Продолжаем наше путешествие.
За ospf в линукс отвечает пакет quagga. Ставим его и начинаем настраивать.
Конфиг zebrы офиса:

cat /etc/quagga/zebra.conf
hostname днс-имя-шлюза-в-офисе
password zebra
enable password zebra
!
!interface
!
interface lo
description loop
interface tun1
description tun1
interface tun2
description tun2
interface tun3
description tun3
interface tun4
description tun4
interface tun5
description tun5
interface tun6
description tun6
!
log file /var/log/quagga/zebra.log

Конфиг zebrы склада:


cat /etc/quagga/zebra.conf
hostname днс-имя-шлюза-на-складе
password zebra
enable password zebra
!
!interface
!
interface lo
description loop
interface tun1
description tun1
interface tun2
description tun2
interface tun3
description tun3
interface tun4
description tun4
interface tun5
description tun5
interface tun6
description tun6
!
log file /var/log/quagga/zebra.log

Зебра есть, теперь сам ospf
В офисе:
cat /etc/quagga/ospfd.conf
hostname днс-имя-шлюза-в-офисе
password zebra 
enable password superzebra 
log file /var/log/quagga/ospfd.log 
interface lo 
interface tun1 
ip ospf network point-to-point 
ip ospf cost 10 
interface tun2 
ip ospf network point-to-point 
ip ospf cost 10 
!
interface tun3
ip ospf network point-to-point
ip ospf cost 10
!
interface tun4
ip ospf network point-to-point
ip ospf cost 10
!
interface tun5
ip ospf network point-to-point
ip ospf cost 10
!
interface tun6
ip ospf network point-to-point
ip ospf cost 5
!
router ospf 
ospf router-id 192.168.101.1 
network 10.10.1.0/24 area 0.0.0.0 
network 10.10.2.0/24 area 0.0.0.0
network 10.10.3.0/24 area 0.0.0.0
network 10.10.4.0/24 area 0.0.0.0
network 10.10.5.0/24 area 0.0.0.0
network 10.10.6.0/24 area 0.0.0.0
network 192.168.101.0/24 area 0.0.0.0 
area 0.0.0.0 range 192.168.101.0/24 cost 10 
line vty 

И на складе:
cat /etc/quagga/ospfd.conf
hostname днс-имя-шлюза-на-складе
password zebra 
enable password superzebra 
log file /var/log/quagga/ospfd.log 
interface lo 
interface tun1 
ip ospf network point-to-point 
ip ospf cost 10 
interface tun2 
ip ospf network point-to-point 
ip ospf cost 10 
!
interface tun3
ip ospf network point-to-point
ip ospf cost 10
!
interface tun4
ip ospf network point-to-point
ip ospf cost 10
!
interface tun5
ip ospf network point-to-point
ip ospf cost 10
!
interface tun6
ip ospf network point-to-point
ip ospf cost 5
!
router ospf 
ospf router-id 192.168.3.1 
network 10.10.1.0/24 area 0.0.0.0 
network 10.10.2.0/24 area 0.0.0.0
network 10.10.3.0/24 area 0.0.0.0
network 10.10.4.0/24 area 0.0.0.0
network 10.10.5.0/24 area 0.0.0.0
network 10.10.6.0/24 area 0.0.0.0 
network 192.168.3.0/24 area 0.0.0.0 
area 0.0.0.0 range 192.168.3.0/24 cost 10 
line vty 

Немного пояснений:
192.168.101.Х - локалка в офисе
192.168.3.Х - локалка на складе
Чем ниже параметр cost, тем предпочтительней интерфейс.

Рестартуем оба шлюза (на всякий) и проверяем работу ospf. С любой машины офиса видна любая машина склада. И наоборот. Поздравления и авации.
Запускаем пинг и рвем соединение по текущему туннелю (из лога zebra), лучше физически отсоединить кабель  провайдера.  Пинги замирают на доли секунды и спокойно продолжают бегать, не потеряв бойцов в пути. 

Радостно идем пить чай и принимать поздравления, и в лучшем случае премии от благодарного руководства.

2 комментария:

  1. Добрый день!

    Схемка подключения куда-то пропала.
    Не могли бы вы обновить содержимое статьи?
    Спасибо!

    ОтветитьУдалить
    Ответы
    1. Добрый!
      Я схему не рисовал, словами описал. Если непонятно, спрашивайте.

      Удалить