Начальная ситуация такая: есть 8 офисов в разных частях страны, надо их свести в единую сеть так, чтобы доступность каждого офиса была максимальной при любых катаклизмах. В качестве роутеров во всех офисах стоят Mikrotik. На основной площадке — CCR CCR1036-12G, на остальных — 1100 AHx2
Во избежание проблем с интернетом было протянуто по 2 канала от разных провайдеров, питание тоже зарезервировали и пришли к вопросу “а какую сеть-то строить?”. Как видно из названия статьи, в итоге решили строить FullMesh.
Эта схема полностью удовлетворяет требованиям руководства — при выходе из строя любого интернет-канала или даже любого офиса сеть остается связной. Остался только вопрос с маршрутизацией. Из вариантов был всеобщий бридж с RSTP, OSPF и статические маршруты. Естественно я в итоге выбрал OSPF — меньше проблем, чем на статике и меньше нагрузки для маршрутизаторов, чем при RSTP.
Сама настройка и готовый конфиг под катом.
Соединять маршрутизаторы решил с помощью EoIP туннелей, по 2 на каждую пару — с основного провайдера на основной и с резервного на резервный. Конфигурацию опишу для одной пары, так как остальные настраиваются идентично.
На первом маршрутизаторе создаем 2 туннеля:
/interface eoip
ladd keepalive=1s,3 local-address=xxx.xxx.xxx.xxx name=FIRST remote-address=yyy.yyy.yyy.yyy tunnel-id=1
add keepalive=1s,3 local-address=zzz.zzz.zzz.zzz name=FIRST_BAK remote-address=www.www.www.www tunnel-id=2
Поднимаем туннели со второй стороны:
/interface eoip
ladd keepalive=1s,3 local-address=yyy.yyy.yyy.yyy name=FIRST remote-address=xxx.xxx.xxx.xxx tunnel-id=1
add keepalive=1s,3 local-address=www.www.www.www name=FIRST_BAK remote-address=zzz.zzz.zzz.zzz tunnel-id=2
Настраиваем OSPF, маршрутами будем обмениваться через зону backbone.
На первом маршрутизаторе:
/routing ospf area
add area-id=192.168.0.1 name=FIRST
/routing ospf interface
add cost=10 dead-interval=5s hello-interval=1s interface=FIRST
network-type=point-to-point use-bfd=yes
add cost=10 dead-interval=5s hello-interval=1s interface=FIRST_BAK
network-type=point-to-point use-bfd=yes
/routing ospf network
add area=FIRST network=192.168.0.0/24
add area=backbone network=10.0.0.0/22
На втором маршрутизаторе:
/routing ospf area
add area-id=192.168.1.1 name=SECOND
/routing ospf interface
add cost=10 dead-interval=5s hello-interval=1s interface=FIRST
network-type=point-to-point use-bfd=yes
add cost=10 dead-interval=5s hello-interval=1s interface=FIRST_BAK
network-type=point-to-point use-bfd=yes
/routing ospf network
add area=SECOND network=192.168.1.0/24
add area=backbone network=10.0.0.0/22
И наконец добавляем адреса для созданных туннелей:
На первом маршрутизаторе:
ip address add address=10.0.1.1/30 interface=FIRST network=10.0.1.0
ip address add address=10.0.1.5/30 interface=FIRST_BAK network=10.0.1.4
На втором маршрутизаторе:
ip address add address=10.0.1.2/30 interface=FIRST network=10.0.1.0
ip address add address=10.0.1.6/30 interface=FIRST_BAK network=10.0.1.4
Получаем 2 маршрутизатора, которые обмениваются маршрутами на свои зоны по OSPF. Повторяем данную процедуру для всех пар маршрутизаторов.
В итоге получаем вот такую FullMesh сеть (заранее прошу прощения за качество схемы — не нашел чем адекватно рисовать схему сети на Linux, потому использовал онлайн рисовалку Gliffy):
Все маршрутизаторы входят в общую backbone area с id 0.0.0.0 + каждый из них является пограничным для своей собственной зоны с ID равным локальному IP маршрутизатора.
Сразу после того, как маршрутизаторы обнаруживают друг друга, они обмениваются известными им маршрутами, и на основании стоимости линка выбирают лучшие. В данной конфигурации лучшим маршрутом всегда будет самый прямой (точнее 2 прямых маршрута — основной и резервный), в случае отказа которого трафик, идущий через отказавший маршрут будет доставлен через все маршрутизаторы, оставшиеся доступными.
Таким образом нас перестали пугать технические работы у провайдера, а также периодические проблемы с проходимостью GRE пакетов по определенным направлениям — для полной связности сети достаточно функционирования менее чем половины существующих туннелей. Ну, а бонусом мы получили балансировку трафика между туннелями — так как стоимости у основных и резервных туннелей одинаковые, OSPF автоматически отправляет трафик в оба туннеля, балансируя нагрузку между ними примерно поровну.
Если у вас возникнут вопросы или предложения по оптимизации данной конфигурации — добро пожаловать в комментарии.
Как и обещал, готовый конфиг одного из маршрутизаторов (все имена и IP изменены по соглашению со службой безопасности):
# aug/23/2015 19:15:28 by RouterOS 6.30.2
# software id = 4RCZ-RTPX
#
/interface ethernet
set [ find default-name=ether10 ] mac-address=4C:5E:0C:5A:64:22 name=
ISP2
set [ find default-name=ether1 ] mac-address=4C:5E:0C:5A:64:19
set [ find default-name=ether2 ] mac-address=4C:5E:0C:5A:64:1A master-port=
ether1
set [ find default-name=ether3 ] mac-address=4C:5E:0C:5A:64:1B master-port=
ether1
set [ find default-name=ether4 ] mac-address=4C:5E:0C:5A:64:1C master-port=
ether1
set [ find default-name=ether5 ] mac-address=4C:5E:0C:5A:64:1D master-port=
ether1
set [ find default-name=ether6 ] mac-address=4C:5E:0C:5A:64:1E
set [ find default-name=ether7 ] mac-address=4C:5E:0C:5A:64:1F
set [ find default-name=ether8 ] mac-address=4C:5E:0C:5A:64:20
set [ find default-name=ISP1 ] mac-address=4C:5E:0C:5A:64:21 name=ISP1
set [ find default-name=ether11 ] mac-address=4C:5E:0C:5A:64:23
set [ find default-name=ether12 ] mac-address=4C:5E:0C:5A:64:24
set [ find default-name=ether13 ] mac-address=4C:5E:0C:5A:64:25
/interface eoip
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:74:DC:6B:70:C1
name=FIRST remote-address=xxx.xxx.xxx.xxx tunnel-id=1
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:74:DC:6B:70:C1
name=FIRST_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=2
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:B8:B3:AB:DB:17
name=SECOND remote-address=xxx.xxx.xxx.xxx tunnel-id=3
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:3B:12:E5:7E:BC
name=SECOND_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=4
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:3B:12:E5:7E:BC
name=THIRD remote-address=xxx.xxx.xxx.xxx tunnel-id=5
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:B8:B3:AB:DB:17
name=THIRD_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=6
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:B8:B3:AB:DB:17
name=FOURTH remote-address=xxx.xxx.xxx.xxx tunnel-id=7
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:3B:12:E5:7E:BC
name=FOURTH_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=8
add keepalive=1s,3 local-address=xxx.xx.xxx.xxx mac-address=02:3B:12:E5:7E:BC
name=FIFTH remote-address=xxx.xxx.xxx.xxx tunnel-id=9
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:B8:B3:AB:DB:17
name=FIFTH_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=10
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:B8:B3:AB:DB:17
name=SIX remote-address=xxx.xxx.xxx.xxx tunnel-id=11
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:3B:12:E5:7E:BC
name=SIX_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=12
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:B8:B3:AB:DB:17
name=SEVENTH remote-address=xxx.xxx.xxx.xxx tunnel-id=13
add keepalive=1s,3 local-address=xxx.xxx.xxx.xxx mac-address=02:3B:12:E5:7E:BC
name=SEVENTH_BAK remote-address=xxx.xxx.xxx.xxx tunnel-id=14
/routing ospf area
add area-id=192.168.0.1 name=LOCAL
/snmp community
set [ find default=yes ] addresses=192.168.0.0/16
/system logging action
set 0 memory-lines=100
set 1 disk-lines-per-file=100
/tool user-manager customer
set admin access=
own-routers,own-users,own-profiles,own-limits,config-payment-gw
/user group
set read policy="read,test,winbox,sniff,sensitive,!local,!telnet,!ssh,!ftp,!re
boot,!write,!policy,!password,!web,!api"
/ip firewall connection tracking
set generic-timeout=1m tcp-close-timeout=5s tcp-close-wait-timeout=5s
tcp-established-timeout=1m tcp-fin-wait-timeout=5s tcp-last-ack-timeout=
5s tcp-time-wait-timeout=5s udp-stream-timeout=1m
/ip address
add address=192.168.0.1/24 interface=ether1 network=192.168.0.0
add address=xxx.xxx.xxx.xxx/xx interface=ISP2 network=xxx.xxx.xxx.xxx
add address=xxx.xxx.xxx.xxx/xx interface=ISP1 network=xxx.xxx.xxx.xxx
add address=10.0.1.18/30 interface=FIRST_BAK network=10.0.1.16
add address=10.0.1.46/30 interface=SECOND network=10.0.1.44
add address=10.0.1.50/30 interface=SECOND_BAK network=10.0.1.48
add address=10.0.1.73/30 interface=THIRD network=10.0.1.72
add address=10.0.1.77/30 interface=THIRD_BAK network=10.0.1.76
add address=10.0.1.86/30 interface=FOURTH network=10.0.1.84
add address=10.0.1.90/30 interface=FOURTH_BAK network=10.0.1.88
add address=10.0.1.94/30 interface=FIFTH network=10.0.1.92
add address=10.0.1.98/30 interface=FIFTH_BAK network=10.0.1.96
add address=10.0.1.102/30 interface=FIRST network=10.0.1.100
add address=10.0.1.217/30 interface=SIX network=10.0.1.216
add address=10.0.1.221/30 interface=SIX_BAK network=10.0.1.220
add address=10.0.1.225/30 interface=SEVENTH network=10.0.1.224
add address=10.0.1.229/30 interface=SEVENTH_BAK network=10.0.1.228
/ip dns
set servers=8.8.4.4
/ip firewall filter
add action=drop chain=input comment="Drop Invalid" connection-state=invalid
add action=drop chain=forward connection-state=invalid
add chain=input comment=Established connection-state=established
add chain=input comment=Tunnels protocol=gre
add chain=input comment=WinBox dst-port=8291 protocol=tcp
add chain=input comment=NTP dst-port=123 protocol=udp
add chain=input comment="From Local" src-address=192.168.0.0/16
add chain=input comment=Ping protocol=icmp
add action=drop chain=input comment="DONT MOVE - DROP" in-interface=
ISP2
add action=drop chain=input comment="DONT MOVE - DROP" in-interface=
ISP1
/ip firewall mangle
add action=change-mss chain=forward new-mss=clamp-to-pmtu protocol=tcp
tcp-flags=syn tcp-mss=1460-65535
/ip firewall nat
add action=masquerade chain=srcnat out-interface=
ISP2
add action=masquerade chain=srcnat out-interface=ISP1
/ip firewall service-port
set ftp disabled=yes
set tftp disabled=yes
set irc disabled=yes
set h323 disabled=yes
set sip disabled=yes
set pptp disabled=yes
/ip route
add check-gateway=ping distance=1 gateway=8.8.8.8
add distance=2 gateway=10.10.20.1
add check-gateway=ping distance=1 dst-address=8.8.8.8/32 gateway=10.10.10.1 scope=10
/ip service
set telnet disabled=yes
set ftp disabled=yes
set www disabled=yes
set ssh disabled=yes
set api disabled=yes
/routing ospf interface
add interface=FIRST network-type=point-to-point
add interface=FIRST_BAK network-type=point-to-point
add interface=SECOND network-type=point-to-point
add interface=SECOND_BAK network-type=point-to-point
add interface=THIRD network-type=point-to-point
add interface=THIRD_BAK network-type=point-to-point
add interface=FOURTH network-type=point-to-point
add interface=FOURTH_BAK network-type=point-to-point
add interface=FIFTH network-type=point-to-point
add interface=FIFTH_BAK network-type=point-to-point
add interface=SIX network-type=point-to-point
add interface=SIX_BAK network-type=point-to-point
add interface=SEVENTH network-type=point-to-point
add interface=SEVENTH_BAK network-type=point-to-point
add interface=ether1 network-type=broadcast passive=yes
/routing ospf network
add area=backbone network=10.0.0.0/22
add area=FIRST network=192.168.0.0/24
/system clock
set time-zone-autodetect=no time-zone-name=Europe/Kiev
/system identity
set name=MikroTik
/system resource irq rps
set ether1 disabled=yes
set ether2 disabled=yes
set ether3 disabled=yes
set ether4 disabled=yes
set ether5 disabled=yes
set ether6 disabled=yes
set ether7 disabled=yes
set ether8 disabled=yes
set ISP1 disabled=yes
set ISP2 disabled=yes
set ether11 disabled=yes
/system scheduler
add interval=6h name=schedule1 on-event=BackupToMail policy=
ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=
oct/28/2014 start-time=01:00:00
add interval=6h name=schedule2 on-event=BackupToFTP policy=
ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=
oct/28/2014 start-time=01:00:00
/system script
add name=BackupToMail owner=root policy=
ftp,reboot,read,write,policy,test,password,sniff,sensitive source="{r
n:log info "Starting Backup Script...";r
n:local sysname [/system identity get name];r
n:local sysver [/system package get system version];r
n:log info "Flushing DNS cache...";r
n/ip dns cache flush;r
n:delay 2;r
n:log info "Deleting last Backups...";r
n:foreach i in=[/file find] do={:if ([:typeof [:find [/file get $i name]
_\r
n"$sysname-backup-"]]!="nil") do={/file remove $i}};r
n:delay 2;r
n:local smtpserv [:resolve "smtp.gmail.com"];r
n:local Eaccount "xxxxxx@gmail.com";r
n:local TOaccount "xxxxxx@gmail.com";r
n:local pass "xxxxxx";r
n:local backupfile ("$sysname-backup-" . \r
n[:pick [/system clock get date] 7 11] . [:pick [/system \r
nclock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".backup
");r
n:log info "Creating new Full Backup file...";r
n/system backup save name=$backupfile;r
n:delay 2;r
n:log info "Sending Full Backup file via E-mail...";r
n/tool e-mail send from="<$Eaccount>" to=$TOaccount server=$smtpserv
_\r
nport=587 user=$Eaccount password=$pass tls=yes file=$backupfile \r
nsubject=("$sysname Full Backup (" . [/system clock get date] . ")")
_\r
nbody=("$sysname full Backup file see in attachment.\nRouterOS version
: \r
n$sysver\nTime and Date stamp: " . [/system clock get time] . " " .
\r
n[/system clock get date]);r
n:delay 5;r
n:local exportfile ("$sysname-backup-" . \r
n[:pick [/system clock get date] 7 11] . [:pick [/system \r
nclock get date] 0 3] . [:pick [/system clock get date] 4 6] . ".rsc");
r
n:log info "Creating new Setup Script file...";r
n/export file=$exportfile;r
n:delay 2;r
n:log info "Sending Setup Script file via E-mail...";r
n/tool e-mail send from="<$Eaccount>" to=$TOaccount server=$smtpserv
_\r
nport=587 user=$Eaccount password=$pass tls=yes file=$exportfile \r
nsubject=("$sysname Setup Script Backup (" . [/system clock get date]
. \r
n")") body=("$sysname Setup Script file see in attachment.\nRouterOS
_\r
nversion: $sysver\nTime and Date stamp: " . [/system clock get time] .
_" \r
n" . [/system clock get date]);r
n:delay 5;r
n:log info "All System Backups emailed successfully.\nBackuping complet
ed.";r
n}"
add name=BackupToFTP owner=antony policy=
ftp,reboot,read,write,policy,test,password,sniff,sensitive source="# Set l
ocal variables. Change the value in "" to reflect your environment.r
nr
n:local hostname [/system identity get name];r
n:local password "xxxxxx"r
n:local username "xxxxxx"r
n:local ftpserver "xxx.xxx.xxx.xxx"r
nr
n# Set Filename variables. Do not change this unless you want to edit the
_format of the filename.r
nr
n:local time [/system clock get time];r
n:local date ([:pick [/system clock get date] 0 3] \r
n. [:pick [/system clock get date] 4 6] \r
n. [:pick [/system clock get date] 7 11]);r
n:local filename "$hostname-$date-$time";r
nr
n# Create backup file and export the config.r
nr
nexport compact file="$filename"r
n/system backup save name="$filename"r
nr
n:log info "Backup Created Successfully"r
nr
n# Upload config file to FTP server.r
nr
n/tool fetch address=$ftpserver src-path="$filename.rsc" \r
nuser=$username mode=ftp password=$password \r
ndst-path="$filename.rsc" upload=yesr
nr
n# Upload backup file to FTP server.r
nr
n/tool fetch address=$ftpserver src-path="$filename.backup" \r
nuser=$username mode=ftp password=$password \r
ndst-path="$filename.backup" upload=yesr
nr
n:log info "Backup Uploaded Successfully"r
nr
n# Delete created backup files once they have been uploadedr
n# so they don't accumulate and fill up storage space on the router.r
nr
n/file remove "$filename.rsc"r
n/file remove "$filename.backup"r
nr
n:log info "Local Backup Files Deleted Successfully""
/system watchdog
set automatic-supout=no watchdog-timer=no
/tool e-mail
set address=64.233.161.109 from=<mikrotik> password=xxxxxx port=587
user=xxxxxx@gmail.com
Автор: Kliba