Страницы

пятница, 2 июня 2017 г.

Mikrotik. Используем нескольких операторов в режиме FailOver.

Данная конфигурация поможет в случае если шлюз оператора отвечает с высокими задержками или не отвечает совсем, но при этом трафик по каналу ходит без проблем.
Стандартные средства RouterOS позволяют добавить только один IP адрес для проверки с использованием wathcdog. В приведенном скрипте тестируются 3 адреса, адреса могут принадлежать оператору или просто существовать в сети Интернет.

Данная статья не претендует на оригинальность, частично конфигурация взята из сети Интернет и доработана с учетом того что порт в сторону оператора может не упасть, а связь будет отсутствовать (например проблема с vlan).
Конфигурация и работа скрипта проверялась на MikroTik RouterOS 6.35.4

Содержание : 

1. Готовим конфигурацию.
2. Готовим скрипт.
3. Включаем скрипт в работу.

1. Готовим конфигурацию


Данная конфигурация позволит получить доступ к устройству из сети Интернет на адреса выданные оператором.
В примере используется приватная адресация.

Определим интерфейсы :
ether1 - сеть оператора 1
ether3 - сеть оператора 2
ether2 - смотрит в LAN

Оба оператора предоставляют статические IP адреса:
Оператор 1
IP 10.67.0.51 
Маска 255.255.255.0
Шлюз 10.67.0.51

Оператор 2
IP 10.196.0.51 
Маска 255.255.255.0
Шлюз 10.196.0.1

Адресация LAN 192.168.88.0/24 (конфигурация из коробки)



Конфигурируем интерфейсы:


Удаляем порт 3 из бриджа:

interface bridge port print
interface bridge port remove  2

Конфигурируем IP адреса: 

ip address add address=10.67.0.51/24 interface=ether1 network=10.67.0.0
ip address add address=10.196.1.51/24 interface=ether3 network=10.196.1.0

Настраиваем firewall для того чтобы ответ уходил с того же адреса на который прилетел пакет:

ip firewall mangle add action=mark-connection chain=input in-interface=ether1 new-connection-mark=ISP1
ip firewall mangle add action=mark-routing chain=output connection-mark=ISP1 new-routing-mark=ISP1_out passthrough=no
ip firewall mangle add action=mark-connection chain=input in-interface=ether3 new-connection-mark=ISP2
ip firewall mangle add action=mark-routing chain=output connection-mark=ISP2 new-routing-mark=ISP2_out passthrough=no


Добавляем маршруты для операторов (важно наличие comment):

ip route add comment=ISP2GW distance=2 gateway=10.196.1.1
ip route add comment=ISP1GW distance=1 gateway=10.67.0.1

Добавляем маршруты и правила для корректной отработки скрипта:

ip route add comment=ISP1CHECK distance=1 gateway=10.67.0.1 routing-mark=ISP1_out
ip route add comment=ISP2CHECK distance=2 gateway=10.196.1.1 routing-mark=ISP2_out
ip route rule add src-address=10.196.1.51/32 table=ISP2_out
ip route rule add src-address=10.67.0.51/32 table=ISP1_out


Изменяем правило NAT

ip firewall nat remove 0
ip firewall nat add action=masquerade chain=srcnat comment="masquerade" src-address=192.168.88.0/24


На этом всё, настройка завершена. Теперь управление Mikrotik доступно по обоим адресам и основным каналом выбран ISP1

Готовим скрипт.


В Winbox переходим System > Script



В появившемся окне нажимаем "+"


Появится окно :


В этом окне в поле Name вписываем название скрипта.
В поле Source копируем сам скрипт . После чего нажимаем OK.

Скрипт :

В скрипте необходимо изменить значения IPDST1 , IPDST2 , IPDST3 - это адреса для проверки.

# ISP check script
#

# Change ander this line
:local IPaddISP1 10.67.0.51
:local IPaddISP2 10.196.1.51
:local IPDST1 8.8.8.8
:local IPDST2 8.8.4.4
:local IPDST3 172.16.0.1
# Stop change after this line

:local PingTarget1 $IPDST1
:local PingTarget2 $IPDST2
:local PingTarget3 $IPDST3
:local PingTarget4 $IPDST1
:local PingTarget5 $IPDST2
:local PingTarget6 $IPDST3
:local PingCount 2

# Check ISP1
:local ISP1 false;
:local PingResult1 [/ping $PingTarget1 count=$PingCount src-address=$IPaddISP1]
:local PingResult2 [/ping $PingTarget2 count=$PingCount src-address=$IPaddISP1]
:local PingResult3 [/ping $PingTarget3 count=$PingCount src-address=$IPaddISP1]
:set ISP1 (($PingResult1 + $PingResult2 + $PingResult3) >= (2 * $PingCount))

# Check ISP2
:local ISP2 false;
:local PingResult4 [/ping $PingTarget4 count=$PingCount src-address=$IPaddISP2]
:local PingResult5 [/ping $PingTarget5 count=$PingCount src-address=$IPaddISP2]
:local PingResult6 [/ping $PingTarget6 count=$PingCount src-address=$IPaddISP2]
:set ISP2 (($PingResult4 + $PingResult5 + $PingResult6) >= (2 * $PingCount))

:put "ISP1=$ISP1"
:put "ISP2=$ISP2"

if (!$ISP1) do={
/log error "ISP1 internet connection error"
}

if (!$ISP2) do={
/log error "ISP2 internet connection error"
}

:local ISP1GWDistance [/ip route get [find comment="ISP1GW"] distance]
:local ISP2GWDistance [/ip route get [find comment="ISP2GW"] distance]
:put "ISP1GWDistance=$ISP1GWDistance"
:put "ISP2GWDistance=$ISP2GWDistance"

#SetUp gateways
if ($ISP1 && ($ISP1GWDistance >= $ISP2GWDistance)) do={
/ip route set [find comment="ISP1GW"] distance=1
/ip route set [find comment="ISP2GW"] distance=2
/log info "Switch to ISP1 internet connection"
/ip firewall connection tracking set enabled=no
:delay 1s
/ip firewall connection tracking set enabled=yes
}

if (!$ISP1 && $ISP2 && ($ISP1GWDistance <= $ISP2GWDistance)) do={
/ip route set [find comment="ISP1GW"] distance=2
/ip route set [find comment="ISP2GW"] distance=1
/log warning "Switch to ISP2 internet connection"
/ip firewall connection tracking set enabled=no
:delay 1s
/ip firewall connection tracking set enabled=yes
}


Включаем скрипт в работу:


Переходим System > Scheduler


В появившемся окне заполняем поля как на скриншоте:


Итог.

Скрипт будет проверять работу основного канала 1 раз в 1 минуту.
В случае проблемы на основном канале скрипт - переключит на резервный канал и отпишется в логе.
В случае восстановления основного канала - переключит обратно и отпишется в логе. 



Комментариев нет:

Отправить комментарий