„MikroTik dinamikus WAN interfészek kezelése” változatai közötti eltérés
a (→Időzítés) |
|||
| 143. sor: | 143. sor: | ||
"/system script run chkIP" | "/system script run chkIP" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Ez | Ez esetben lehet szolgáltatás kiesés, példánkban maximum 1 óra. Ha szeretnénk pontosan időzíteni, figyelni kell a dinamikus IP cím lejárati idejét, és erre az időpontra időzíteni a következő ellenőrzést. | ||
A módszer csak DHCP-vel kapott IP címek esetén működik. PPPoE és egyéb tunnel protokolloknál nincs lejárati idő, ez esetben csak a ciklikus (manuális) időzés működik. <syntaxhighlight lang="bash"> | A módszer csak DHCP-vel kapott IP címek esetén működik. PPPoE és egyéb tunnel protokolloknál nincs lejárati idő, ez esetben csak a ciklikus (manuális) időzés működik. <syntaxhighlight lang="bash"> | ||
A lap 2020. január 10., 18:13-kori változata
Összefoglalás
A leírás MikroTik RouterOS 6.44.6 verzión készült.
Előfordulhat, hogy az interfész(ek)en dinamikus IP cím van (és nem is lehet más), de mégis szolgáltatás kell, hogy fusson rajtuk. Amikor a cím(ek) változnak, szükség van az információ automatikus frissítésére egyéb rendszerekben (például DNS rekordok vagy Address list-ek).
A következő Mikrotik RouterOS script ebben az esetben lehet hasznos.
IP váltás észlelése
A $WanIP golbális változóba helyezzük az aktuális címet és figyeljük, hogy változik e az $intName változóban megadott interface IP címe.
:global WanIP
:local intName "WAN"
if ([:len [ /ip address find interface=$intName dynamic ]] = 0) do={
:log error message="Nincs dinamikus IP cim az $intName interfeszen!"
:error message="Nincs dinamikus IP cim az $intName interfeszen!"
}
:local tempIP [ /ip address get [ /ip address find interface=$intName dynamic ] address ]
:local tempIP [:pick $tempIP 0 [:find $tempIP "/" -1 ] ]
if ( $WanIP != $tempIP ) do={
# teendők a régi IP -vel
:set WanIP $tempIP
:log info message="IP valtozas az $intName interfeszen! Uj IP: $WanIP"
# teendők az új IP -vel
}
DNS rekord frissítése
Lehetőség van egy DNS szerveren egy domain egy vagy több "A" rekordjának frissítésére.
Ha távoli eléréshez használnánk ezt a rekordot, akkor sokkal egyszerűbb a Mikrotik DDNS-ét használni:
/ip cloud set ddns-enabled=yes
/ip cloud print
ddns-enabled: yes
ddns-update-interval: none
update-time: yes
public-address: x.x.x.x
public-address-ipv6: X:X:X::X
dns-name: XXX.sn.mynetname.net
status: updated
A következő módszer inkább egyéb szolgáltatások rekordfrissítéséhez használható.A rekord frissítéshez szükség van egy kulcsra (authorization key / Transfer Signature key), amelyet a DNS szerver üzemeltetőjétől szerezhetünk be. A kulcs birtokában egy egyszerű paranccsal frissíthetjük a rekordot:
:global WanIP
:local intName "WAN"
:local DNSserver "<domain vagy IP>"
:local DNSrecord "<rekord neve, pl: mail>"
:local DNSdomain "<zóna neve, pl: domain.hu>"
:local DNSttl 3600
:local DNSkeyname "<kulcs neve>"
:local DNSkey "<kulcs érték>"
if ([:len [ /ip address find interface=$intName dynamic ]] = 0) do={
:log error message="Nincs dinamikus IP cim az $intName interfeszen!"
:error message="Nincs dinamikus IP cim az $intName interfeszen!"
}
:local tempIP [ /ip address get [ /ip address find interface=$intName dynamic ] address ]
:local tempIP [:pick $tempIP 0 [:find $tempIP "/" -1 ] ]
if ( $WanIP != $ttempIP ) do={
:set WanIP $tempIP
:log info message="IP valtozas az $intName interfeszen! Uj IP: $WanIP"
# DNS rekord frissítése
/tool dns-update dns-server=$DNSserver name=$DNSrecord zone=$DNSdomain address=$WanIP ttl=$DNSttl key-name=$DNSkeyname key=$DNSkey
}
Address list frissítése
Ha a WAN IP-vel dolgozni szeretnénk, pl. tűzfal szabályban, akkor egy "address list" -en kell tárolni és frissíteni a dinamikus címet. A következő változat ezt oldja meg.
:global WanIP
:local intName "WAN"
:local listName "WAN"
if ([:len [ /ip address find interface=$intName dynamic ]] = 0) do={
:log error message="Nincs dinamikus IP cim az $intName interfeszen!"
:error message="Nincs dinamikus IP cim az $intName interfeszen!"
}
:local tempIP [ /ip address get [ /ip address find interface=$intName dynamic ] address ]
:local tempIP [:pick $tempIP 0 [:find $tempIP "/" -1 ] ]
if ( $WanIP != $tempIP ) do={
# régi IP levétel
/ip firewall address-list remove [find list=$listName address=$WanIP]
:set WanIP $tempIP
:log info message="IP valtozas az $intName interfeszen! Uj IP: $WanIP"
# új IP felvétel
/ip firewall address-list add list=$listName address=$WanIP
}
Dinamikus IPsec peer
Az IPsec protokoll két IP cím között hoz létre titkosítást. Eszközök és protokollok képesek dinamikus című IPsec kliensek kezelésére (pl.: L2TP esetén a Mikrotik is), de natívan, illetve tunnel protokollokkal együtt a Mikrotik nem. A következő példában egy GRE/IPsec tunnel-t tesszük dinamikussá.
A két MikroTik eszköz között hozzuk létre a statikus tunnelt:
/interface gre add name=tunnel local-address=192.168.1.1 remote-address=192.168.2.2 ipsec-secret=HelloNSA allow-fast-path=no
/interface gre add name=tunnel local-address=192.168.2.2 remote-address=192.168.1.1 ipsec-secret=HelloNSA allow-fast-path=no
A beállítás létrehozza az IPsec beállításokat is alap MikroTik beállításokkal.
IP váltáskor a megszokott módon kicseréljük az IP címeket a tunnelben, ami módosítani fogja az IPsec beállításokat is. Viszont a másik MikroTik eszköznön is meg kell változtani a beállításokat, hogy az IPsec tunnel felépüljön. Ehhez a már említett MikroTik DDNS-t használjuk. Enfedélyezzük ezt mindkét eszközön a fent látható módon, ami egy perces frekvenciával frissíti a RouterOS-ek IP címét. Tehát makszimum ennyi szolgáltatás kiesés lehetséges.
A következő scriptet mindkét eszközön egy perces időközönlént futtatva dinamikus lesz a GRE/IPsec csatorna. Értelem szerűen a temprIP változonál az ellenkező MikroTik DDNS-ét kell megadni.
:global WanIP
:global remoteIP
:local intName "WAN"
:local localTun "tunnel"
:local temprIP [:resolve XXX.sn.mynetname.net]
:local tempIP [ /ip address get [ /ip address find interface=$intName dynamic ] address ]
:local tempIP [:pick $tempIP 0 [:find $tempIP "/" -1 ] ]
if ( $WanIP != $tempIP || $remoteIP != $temprIP ) do={
/interface set $localTun disabled=yes
:set WanIP $tempIP
:set remoteIP $temprIP
:log info message="IP valtozas az $localTun interfeszen! loval: $WanIP remote:$remoteIP"
/interface gre set $localTun local-address=$WanIP remote-address=$remoteIP
/interface set $localTun disabled=no
}
Időzítés
A példában feltételezzük, hogy a scriptnek "chkIP" a neve, és ugyanezen néven hozzuk létre az időzítést.
Megtehetjük, hogy ciklikusan időzítjük a scriptet, pl óránként, így beállítva a frissítési gyakoriságot.
/system scheduler add name=chkIP interval=00:01:00 policy=read,write,test on-event=
"/system script run chkIP"
Ez esetben lehet szolgáltatás kiesés, példánkban maximum 1 óra. Ha szeretnénk pontosan időzíteni, figyelni kell a dinamikus IP cím lejárati idejét, és erre az időpontra időzíteni a következő ellenőrzést.
A módszer csak DHCP-vel kapott IP címek esetén működik. PPPoE és egyéb tunnel protokolloknál nincs lejárati idő, ez esetben csak a ciklikus (manuális) időzés működik.
:global WanIP
:local intName "WAN"
:local scriptName "chkIP"
:local defaultInterval 00:01:00
# időzítés létrehozása, ha nincs
if ( [:len [/system scheduler find name=$scriptName]]=0) do={
/system scheduler add name=$scriptName interval=$defaultInterval start-time=[/system clock get time] start-date=[/system clock get date] policy=read,write,test on-event="/system script run $scriptName"
}
# időzítés alap értékkel, ha hiba van
if ([:len [ /ip address find interface=$intName dynamic ]] = 0) do={
/system scheduler set $scriptName interval=$defaultInterval start-time=[/system clock get time] start-date=[/system clock get date]
:log error message="Nincs dinamikus IP cim az $intName interfeszen!"
:error message="Nincs dinamikus IP cim az $intName interfeszen!"
}
:local tempIP [ /ip address get [ /ip address find interface=$intName dynamic ] address ]
:local tempIP [:pick $tempIP 0 [:find $tempIP "/" -1 ] ]
# időzítés alap értékkel, ha nincs DHCP client
if ( [ :len [ /ip dhcp-client find interface=$intName ] ] = 0 ) do= {
/system scheduler set $scriptName interval=$defaultInterval start-time=[/system clock get time] start-date=[/system clock get date]
:log error message="Nincs lease time az $intName interfeszen!"
:error message="Nincs lease time az $intName interfeszen!"
}
# időzítés lease értékkel
:local leaseIP [ /ip dhcp-client get value-name=expires-after [find interface=$intName] ]
:local schInt [ /system scheduler get $scriptName value-name=interval ]
if ( $leaseIP!=$schInt) do={
/system scheduler set $scriptName interval=$leaseIP start-time=[/system clock get time] start-date=[/system clock get date]
}
if ( $WanIP != $tempIP ) do={
# teendők a régi IP -vel
:set WanIP $tempIP
:log info message="IP valtozas az $intName interfeszen! Uj IP: $WanIP"
# teendők az új IP -vel
}