URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 90878
[ Назад ]

Исходное сообщение
"Racoon/IPSec - отказоустойчивость."

Отправлено Nerian , 04-Фев-11 12:40 
Добрый день!

На одной стороне стоит ZyWALL 35, с двумя внешними интерфейсами от разных провайдеров. В общем Ipsec настроен так - что удалённая сторона (к примеру Linux роутер), может на любой из двух внешних IP ZyWALL создать подключение IpSec.

Но как сделать чтобы было поднято два одновременно канала?


Содержание

Сообщения в этом обсуждении
"Racoon/IPSec - отказоустойчивость."
Отправлено Nerian , 04-Фев-11 15:48 
> Добрый день!
> На одной стороне стоит ZyWALL 35, с двумя внешними интерфейсами от разных
> провайдеров. В общем Ipsec настроен так - что удалённая сторона (к
> примеру Linux роутер), может на любой из двух внешних IP ZyWALL
> создать подключение IpSec.
> Но как сделать чтобы было поднято два одновременно канала?

Не стал заморачиваться. По крону каждые 30 секунд проверяю.

#!/bin/sh

# TODO: ADD FORCE OPTION FOR REPLACE

IPSEC_GW1="XX.XX.XX.XX"
IPSEC_GW2="XX.XX.XX.XX"
IPSEC_NUM="ipsec3"
REMOTE_IP="192.168.XX.XX"

FLAG_RS=0

IPSEC_CFG=/etc/sysconfig/network-scripts/ifcfg-${IPSEC_NUM}

ping -c 3 -s 100 ${IPSEC_GW1} >/dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "** PRIMARY GATEWAY ${IPSEC_GW1} is DOWN"
    ping -c 3 -s 100 ${IPSEC_GW2} >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "** BACKUP GATEWAY ${IPSEC_GW2} is DOWN!"
        echo "** ALL GATEWAY IS DOWN! QUIT"
    else
        echo "** BACKUP GATEWAY ${IPSEC_GW2} is UP!"
        echo "** SWITCHING TO BACKUP GATEWAY"
        sed -i "s/^DST=${IPSEC_GW1}$/DST=${IPSEC_GW2}/g" ${IPSEC_CFG}
        FLAG_RS=1
        echo "** DONE"
    fi
else
    echo "** PRIMARY GATEWAY ${IPSEC_GW1} is UP"
    grep "^DST=${IPSEC_GW1}$" ${IPSEC_CFG}
    if [ $? -ne 0 ]; then
        echo "** SWITCHING TO PRIMARY GATEWAY"
        sed -i "s/^DST=${IPSEC_GW2}$/DST=${IPSEC_GW1}/g" ${IPSEC_CFG}
        FLAG_RS=1
        echo "** DONE"
    else
        echo "** ALLREADY IN PRIMARY GATEWAY! QUIT"
    fi
fi

if [ $FLAG_RS -eq 0 ]; then
    echo "** PING REMOTE IP ${REMOTE_IP}..."
    ping -c 3 -s 100 ${REMOTE_IP} >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "** SET RESET FLAG PING REMOTE ADDRESS"
        FLAG_RS=1;
    fi
fi

if [ $FLAG_RS -eq 1 ]; then
        echo "** RESET SESSION"
        ifdown ${IPSEC_NUM}
        ifup ${IPSEC_NUM}
else
        echo "** NO RESET REQUIRED"
fi


"Racoon/IPSec - отказоустойчивость."
Отправлено Nerian , 04-Фев-11 16:34 
Более быстрый и полный скрипт (-W 1 для пинга), выполнение в самом худшем случае до 10 секунд:


#!/bin/sh

# TODO: ADD FORCE OPTION FOR REPLACE

IPSEC_GW1="XX.XX.XX.XX"
IPSEC_GW2="XX.XX.XX.XX"
IPSEC_NUM="ipsec0"
REMOTE_IP="192.168.XX.XX"

FLAG_RS=0

IPSEC_CFG=/etc/sysconfig/network-scripts/ifcfg-${IPSEC_NUM}

ping -c 3 -s 100 -W 1 ${IPSEC_GW1} >/dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "** PRIMARY GATEWAY ${IPSEC_GW1} is DOWN"
    ping -c 3 -s 100 -W 1 ${IPSEC_GW2} >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "** BACKUP GATEWAY ${IPSEC_GW2} is DOWN!"
        echo "** ALL GATEWAY IS DOWN! QUIT"
    else
        echo "** BACKUP GATEWAY ${IPSEC_GW2} is UP!"
        grep "^DST=${IPSEC_GW2}$" ${IPSEC_CFG}
        if [ $? -ne 0 ]; then
            echo "** SWITCHING TO BACKUP GATEWAY"
            sed -i "s/^DST=${IPSEC_GW1}$/DST=${IPSEC_GW2}/g" ${IPSEC_CFG}
            FLAG_RS=1
            echo "** DONE"
        else
            echo "** ALLREADY IN BACKUP GATEWAY! QUIT"
        fi
    fi
else
    echo "** PRIMARY GATEWAY ${IPSEC_GW1} is UP"
    grep "^DST=${IPSEC_GW1}$" ${IPSEC_CFG}
    if [ $? -ne 0 ]; then
        echo "** SWITCHING TO PRIMARY GATEWAY"
        sed -i "s/^DST=${IPSEC_GW2}$/DST=${IPSEC_GW1}/g" ${IPSEC_CFG}
        FLAG_RS=1
        echo "** DONE"
    else
        echo "** ALLREADY IN PRIMARY GATEWAY! QUIT"
    fi
fi

if [ $FLAG_RS -eq 0 ]; then
    echo "** PING REMOTE IP ${REMOTE_IP}..."
    ping -c 3 -s 100 -W 1 ${REMOTE_IP} >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "** SET RESET FLAG PING REMOTE ADDRESS"
        FLAG_RS=1;
    fi
fi

if [ $FLAG_RS -eq 1 ]; then
        echo "** RESET SESSION"
        ifdown ${IPSEC_NUM}
        ifup ${IPSEC_NUM}
else
        echo "** NO RESET REQUIRED"
fi


"Racoon/IPSec - отказоустойчивость."
Отправлено McLeod095 , 07-Фев-11 15:05 
> Добрый день!
> На одной стороне стоит ZyWALL 35, с двумя внешними интерфейсами от разных
> провайдеров. В общем Ipsec настроен так - что удалённая сторона (к
> примеру Linux роутер), может на любой из двух внешних IP ZyWALL
> создать подключение IpSec.
> Но как сделать чтобы было поднято два одновременно канала?

Уважаемый! А может Вы все таки перестанете отвечать самому себе и попытаетесь внятно задать вопрос!
Сам по себе ipsec может хоть 100 подключений одновременно держать, да и от ipsec это не зависит.



"Racoon/IPSec - отказоустойчивость."
Отправлено Nerian , 07-Фев-11 15:26 
>> Добрый день!
>> На одной стороне стоит ZyWALL 35, с двумя внешними интерфейсами от разных
>> провайдеров. В общем Ipsec настроен так - что удалённая сторона (к
>> примеру Linux роутер), может на любой из двух внешних IP ZyWALL
>> создать подключение IpSec.
>> Но как сделать чтобы было поднято два одновременно канала?
> Уважаемый! А может Вы все таки перестанете отвечать самому себе и попытаетесь
> внятно задать вопрос!
> Сам по себе ipsec может хоть 100 подключений одновременно держать, да и
> от ipsec это не зависит.

Если внятно.
На одной стороне ZyWALL35 с двумя провайдерами. Для простоты назовем их как ZW35-ISP1 и ZW35-ISP2. Во внутренней сети за ZyWALL35 есть определённый ип. Пусть будет 192.168.102.200.

На удалённой стороне, компьютер, под управлением Linux за NAT. То есть по сути имеет только один внутренний IP, пусть он будет 192.168.1.100.

Задача следующая:
обеспечить отказоустойчивую связь через IPSec с Linux компьютера 192.168.1.100, на 192.168.102.200 стоящий за ZyWALL35.

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

Для поднятия тунеля, создал алиас на стороне линукса для интерфейса на котором ип 192.168.1.100, и прописал его как 192.168.106.200.

Итого:

192.168.106.200[any] 192.168.102.200[any] any
        in prio def ipsec
        esp/tunnel/XX.XX.XX.XX-192.168.1.100/require
        created: Feb  6 09:42:06 2011  lastused: Feb  7 15:18:15 2011
        lifetime: 0(s) validtime: 0(s)
        spid=137328 seq=27 pid=6071
        refcnt=2
192.168.102.200[any] 192.168.106.200[any] any
        out prio def ipsec
        esp/tunnel/192.168.1.100-XX.XX.XX.XX/require
        created: Feb  6 09:42:06 2011  lastused: Feb  7 15:18:15 2011
        lifetime: 0(s) validtime: 0(s)
        spid=137321 seq=21 pid=6071
        refcnt=20
192.168.106.200[any] 192.168.102.200[any] any
        fwd prio def ipsec
        esp/tunnel/XX.XX.XX.XX-192.168.1.100/require
        created: Feb  6 09:42:06 2011  lastused:
        lifetime: 0(s) validtime: 0(s)
        spid=137338 seq=15 pid=6071
        refcnt=1

route:
192.168.106.200 192.168.102.200 255.255.255.255 UGH   0      0        0 eth0

Где: XX.XX.XX.XX - ип адресс ZW35-ISP1

------

Собственно интересно, будут ли работать одновременно два маршрута, и как задать метрику в этом случае.

Вроде как всё. Более внятно рассказать не могу.


"Racoon/IPSec - отказоустойчивость."
Отправлено McLeod095 , 17-Фев-11 15:49 
Ничего непонятно, но все таки.
Как я понял есть шлюз с двумя провайдерами.
Этот шлюз обеспечивает доступ сети в которой он является шлюзом к какому то ресурсу или к другой сети.

Конечно информации все таки мало и та которая есть она довольно размыта.
Что бы сделал я.
Поверх ipsec настроил бы OSPF и уже с помощью OSPF рулил бы маршрутами.
Не надо городить никаких скриптов и мало головной боли.