Mikrotik - Multi WAN Failover

Üdv!

Van jelenleg 2 internetkapcsolatom (60/10Mbit/s, illetve 2/1Mbit/s).
Rendelkezem egy MikroTik Routerboard 750UP routerrel.

Szeretném úgy konfigurálni a MikroTiket, hogy:
általánosságban a 60 megás netről menjen minden,
de ha
kiesik a 60 megás net, akkor a 2 megásról menjen minden.

Olvastam a MikroTik wiki-t, de nem világos, hogy a routeoknál milyen Gateway-t kell megadni.

Köszi.
Donatus

Hozzászólások

Milyen netekrol van szo? Nem mindegy, hogy pppoe vagy UPC fele ethernet bridging orulet.

hat ha mindketto ilyen akkor kicsit bonyolult lesz, mert a "jolvagyok" es a kapok dhcpvel normalis ipcimet/gw-t/dns-t nem ugyanaz.

Itt van egy scriptecske amirol irtam itt: http://hup.hu/node/114793 csak azota mutalodott egy keveset:


:global gw1;
:global gw2;
:global gw1ping 0;
:global gw2ping 0;
:global gw1outint "UPC - port 5";
:global gw2outint "pppoe-out1";
:global gw1dns "213.46.246.53,213.46.246.54";
:global gw2dns "84.2.44.1,84.2.46.1";
:global gw1dns1 "213.46.246.53/32";
:global gw1dns2 "213.46.246.54/32";
:global gw2dns1 "84.2.44.1/32";
:global gw2dns2 "84.2.46.1/32";
:global target 8.8.8.8;
:global failover;
:global failback;
:global lastfailoverpingcount;
:global gw1ruleid [ ip firewall mangle find comment=$gw1outint];
:global gw2ruleid [ ip firewall mangle find comment=$gw2outint];
:global gw1routeid [ ip route find comment=$gw1outint];
:global gw2routeid [ ip route find comment=$gw2outint];
:global gw1rulestate [ip firewall mangle get $gw1ruleid disabled];
:global gw2rulestate [ip firewall mangle get $gw2ruleid disabled];
:foreach i in  [ ip route find dst-address=0.0.0.0/0 ] do={
   :local gw [toip [ip route get $i gateway]];
   :local routingmark [ip route get $i routing-mark];
   if ([:typeof $gw] != "nothing" and [len $routingmark] = 0 ) do={
      if ([ip route get $i gateway-status]~"via  $gw1outint") do={
                :global gw1 $gw;
                :global gw1id $i;
                :global gw1ping [:tonum [/ping address=$target interface=$gw1outint count=5 interval 1s]];
                if (([typeof $gw1ping] = "nothing") or ($gw1ping<5)) do={
                      :set failback 30;
                      if ([typeof $failover] ="nothing") do={
                           :set failover 1;
                      } else={;
                           :set failover ($failover +1);
                      };
                } else={;
                      if ($gw1ping=5) do={
                           :set failover 0;
                           if (([:typeof $failback]!="nothing") and ($failback >0) ) do={
                                :set failback ($failback -1);
                           }
                      };
                };
        } else={;
                if ([ip route get $i gateway-status]~"via  $gw2outint") do={
                         :global gw2 $gw;
                         :global gw2id $i;
                };
        };

   };
};

if ( [len $gw1routeid] = 0 ) do={
   ip route add dst-address=0.0.0.0/0 gateway=$gw1 comment=$gw1outint routing-mark=via_upc distance=100;
   ip route add dst-address=$gw1dns1 gateway=$gw1;
   ip route add dst-address=$gw1dns2 gateway=$gw1;
   :log info "$gw1outint pbr route didn't exist has been added";
} else={;
  if ([ip route get $gw1routeid gateway] != $gw1 and\ 
      [ip route get $gw1routeid comment] != $gw1outint and\
      [ip route get $gw1routeid routing-mark] !=via_ipc and\
      [ip route get $gw1routeid distance] != 100) do={
      ip route set $gw1routeid dst-address=0.0.0.0/0 gateway=$gw1 comment=$gw1outint routing-mark=via_upc distance=100;
      ip route set [ip route find dst-address=$gw1dns1] gateway=$gw1;
      ip route set [ip route find dst-address=$gw1dns2] gateway=$gw1;
  }
};
if ( [len $gw2routeid] = 0 ) do={
   ip route add dst-address=0.0.0.0/0 gateway=$gw2 comment=$gw2outint routing-mark=via_thome distance=100;
   ip route add dst-address=$gw2dns1 gateway=$gw2;
   ip route add dst-address=$gw2dns2 gateway=$gw2;
   :log info "$gw2outint pbr route didn't exist has been added";
} else={;
  if ([ip route get $gw2routeid gateway] != $gw2 and\ 
      [ip route get $gw2routeid comment] != $gw2outint and\
      [ip route get $gw2routeid routing-mark] !=via_thome and\
      [ip route get $gw2routeid distance] != 100) do={
      ip route set $gw2routeid dst-address=0.0.0.0/0 gateway=$gw2 comment=$gw2outint routing-mark=via_thome distance=100;
      ip route set [ip route find dst-address=$gw2dns1] gateway=$gw2;
      ip route set [ip route find dst-address=$gw2dns2] gateway=$gw2;
  }
};
if ($failover > 2) do={
   if (! $gw1rulestate ) do={
        ip firewall mangle set $gw1ruleid disabled=yes;
        ip firewall mangle set $gw2ruleid disabled=no;
        ip dns set servers=$gw2dns;
        :log info "$gw2outint is active";
        /tool e-mail send to=********@******.***** subject="FAILOVER to $gw2outint" body="FAILOVER to $gw2outint"
        :set failback 30;
        :set lastfailoverpingcount $gw1ping;
   };
} else={;
   if ( $gw1rulestate and $failback=0) do={

        ip firewall mangle set $gw2ruleid disabled=yes;
        ip firewall mangle set $gw1ruleid disabled=no;
        ip dns set servers=$gw1dns;
        :log info "$gw1outint is active";
        /tool e-mail send to=********@******.***** subject="FAILOVER to $gw1outint" body="FAILOVER to $gw1outint"
   }
}

Azt hiszem, hogy a blogban irtam rola reszletesen, hogy hogyan mukodik. Ha modositani akarod, hogy neked menjen nem sok mindent kell modositani. Eloszor is kellenek a valtozok:


:global gw1outint "UPC - port 5"; #interface name to gw1
:global gw2outint "pppoe-out1"; #interface name tp gw2
:global gw1dns "213.46.246.53,213.46.246.54"; #dns a gw-hez
:global gw2dns "84.2.44.1,84.2.46.1"; #dns a gw2-hoz
:global gw1dns1 "213.46.246.53/32"; #gw1dns-bol kovetkezik
:global gw1dns2 "213.46.246.54/32"; #gw1dns-bol kovetkezik
:global gw2dns1 "84.2.44.1/32"; #gw2dns-bol kovetkezik
:global gw2dns2 "84.2.46.1/32"; #gw2dns-bol kovetkezik
:global target 8.8.8.8; # a cel amit ha meg tudsz pingetni egy interfaceen kifele akkor elkonyvelheted az interfacet elonek.

Ezek a valtozok amiket hasznalni kell. Ha minden igaz ezeket modositod es a tobbi meg oldodik. Valamint a schedulerben be kell allitani, hogy mondjuk 10mp-kent fusson le.

pppoe primarynel joval egyszerubb a dolog. A mobilnetet nem tudom, hogy hogy kell felkonfigolni es hogy always on vagy dial-no-demand modeban is jo-e. A pppoe-nel egyszerubb talan a dolog, mert ott van egy keepalive szeruseg szoval a default elmegy ha a pppoe interface meghal, szoval ott lehet, hogy eleg ha atallitod a def route admin distanceet.

Hat, szerintem a mikrotik wikin levo megoldas picit egyszerubb:


/ip route add gateway=192.168.1.1 check-gateway=ping
/ip route add gateway=192.168.2.1 distance=2

Ird at a gateway-eket a kapcsolatok gateway-einek megfeleloen, es a masodlagos kapcsolatnal kell a distance=2
Nyilvan ez azt is feltetelezi, hogy nincs masik default gateway a fentieken kivul (tehat a dhcp/pppoe kliensnel ne vegye at a szolgaltatotol kapottat)

A problema az, hogy a gateway amit csekkol a mikrotik az az amit dhcp-vel behirdet az upstream router. A UPC modellben ez lesz az 192.168.1.100 ami a modem, ami altalaban valaszolni fog de az _internet_ meg nem fog menni tole. Nem biztos, hogy ez a failure case ervenyes az itt emlitett netnel de UPCnel a def. gw. ping check nem ad valaszt arra, hogy el-e a kapcsolat.

Hat ezt rosszul tudod. Nekem otthon UPC-m van, es nalam a default gw 85msec-re van a router labatol, nem gondolod komolyan, hogy ez egy kozvetlenul bekotott eszkoznel (ami raadasul gigabites) realis...

root@kraken:~# traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 38 byte packets
1 86.101.251.254 85.254 ms 17.811 ms 30.862 ms
2 89.135.214.158 8.011 ms 8.097 ms 9.321 ms
3 72.14.217.146 18.941 ms 10.321 ms 9.467 ms
4 209.85.243.121 16.694 ms 17.529 ms 9.929 ms
5 72.14.234.11 25.890 ms 25.409 ms 23.967 ms
6 209.85.254.118 23.099 ms 23.625 ms 209.85.254.112 23.648 ms
7 * * *
8 8.8.8.8 25.832 ms 24.107 ms 23.903 ms
root@kraken:~#

Namost, fenti peldaval elve ha beallitod gateway checkre a 86.101.251.254, az soha nem fog valaszolni, ha a kabelmodem 192.168.0.x-es cimet ad upstream hianyaban.

Szerk: nem azt a gatewayt nezi, amit dhcp-n kap!!! Ezt irtam fent.

Nekem is UPCm van. Ha elmegy az US/DS lampa akkor 192.168.100.101-es ipt kapok. Ha van US/DS akkor en is globalt kapok ofcourse.

Szoval mi alapjan allitod be, es mikor valtod a def. gw-t?

Valamint a default-route dhcptol mikrotiknel ha jol tudom 0 distanceel jon. Tehat a distance 2-t soha nem fogja hasznalni.

Leirom harmadjara is: figyelmen kivul hagyod a dhcp-n kapott default route-ot. Egyszer elinditod, hogy fel tudd irni egy papirra, utana pedig kikapcsolod es beallitod kezzel, ezutan pedig azt figyeled. Nekem evek ota ugyanaz, es masoknal se nagyon valtozik. Nyilvan ahol a default gateway is valtozik, nem csak az IP cim, ott ez nem fog mukodni.

Igen, komolyan. Dinamikus IP != dinamikus gateway. De megint ismetlem magam, ahogyan az elozo hozzaszolasban is leirtam (bar nem ertem miert, ugy latom a hosszabb szovegek ertelmezese nem az erosseged), ahol valtozik a gateway, ott nem fog mukodni. De eddig akarhany helyen neztem (igen, dinamikus IP-nel), nem valtozott. Az en sajat IP-m is dinamikus, se a gateway, sem az IP cim nem valtozott mar evek ota.


mikrotik.kalebsys.com] > ip route print detail where dst-address=1.1.1.1/32       
Flags: X - disabled, A - active, D - dynamic, 
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, 
B - blackhole, U - unreachable, P - prohibit 
 4   S  dst-address=1.1.1.1/32 gateway=86.101.219.254 
        gateway-status=86.101.219.254 unreachable check-gateway=ping distance=1 scope=30 
        target-scope=10 
[admin@mikrotik.kalebsys.com] > ping 86.101.219.254
HOST                                     SIZE TTL TIME  STATUS                             
86.101.219.254                             56  61 15ms 
86.101.219.254                             56  61 15ms 

Mit csinalok rosszul?

Rosszul irod be a dst-address-t es nem aktiv a route sem. Probald igy:


/ip route print detail where dst-address=0.0.0.0/0

Erre ki kell hoznia mindkettot (a fenti parancs az en mikrotikemen semmilyen valaszt nem produkal).


[admin@fw] > ip route print detail where dst-address=0.0.0.0/0
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit
0 A S ;;; UPC default route
dst-address=0.0.0.0/0 pref-src=78.139.yy.xx gateway=78.139.yy.vv gateway-status=78.139.yy.vv reachable via UPC check-gateway=ping distance=1 scope=30 target-scope=10

1 S ;;; ADSL default route
dst-address=0.0.0.0/0 pref-src=31.46.yy.xx gateway=84.2.ww.uu gateway-status=84.2.ww.uu unreachable check-gateway=ping distance=2 scope=30 target-scope=10
[admin@fw] >

Edit: beleestem a sajat csapdamba, az ADSL szolgaltato gateway-t valtott :-) ezert unreachable a masodik esetben, most frissitettem, hogy jo legyen. Sajnos ADSL-nel neha szokott valtozni, kabelnel nem.

Akkor szerintem az van, hogy nem aktiv a route (nem latom a flageknel, csak az S-t). Egyebkent 1.1.1.1/32-re az en mikrotikem semmit sem adott vissza, ettol fuggetlenul vidaman mukodik rajta az internet.
Ahhoz, hogy ez a megoldas mukodjon, le kell venned a default gateway-t mindegyik wan-rol (kulonben tobb default gw lenne), es csak a kezzel beallitott, statikus gatewayek maradhatnak (ami ugyanaz, mint amit kap, csak a check-gateway-jel es a distance-szal kiegeszitve).
Ettol fuggetlenul a route tablaban ott lesznek azok a bejegyzesek, amik a default gw-ek eleresehez kellenek, de az ugye csak annyi, hogy melyik eszkozon keresztul keresse azt a gw-t.

Igen, de akkor be kell allitani, hogy amit kap default route-ot, az alapbol 2-es distance-szal legyen, ebben meg nem vagyok biztos, hogy be lehet allitani. Este megnezem, hogy ad-e erre lehetoseget a pppoe-client-nel.

Edit: nem lehet, helyette routing filter-rel lehet megcsinalni, hogy ne 1-es distance-szal legyen, de ez tobb idot igenyel annal az 5 percnel, amit raszantam, ugyhogy majd este :-)