# Actual remote address
# IP Cloud has to be enable on both device
:local remoterecord "8a2a08d7b2cd.sn.mynetname.net"
# Name of GRE-Tunne, name of IPSec Peer and comment of IPSec Policy (all have to be same)
:local HOST "GRE-O24-3SOBX"
#-------------------No more changes need---------------------------------------------
# Set needed variables and resolve remotedomain and local domain
:local RIP [:resolve $remoterecord]
:local RIP2 [:pick "$RIP" 0 ([:len $RIP] - 3)]
:local LIP [ip cloud get public-address]
:local LIP2 [:pick "$LIP" 0 [:len $LIP]]
# get actual values of dst-address and src-address
:local Remote [/ip ipsec policy get [find comment="$HOST"] dst-address]
:local Remote2 [:pick "$Remote" 0 ([:len $Remote] - 3)]
:local Local [/ip ipsec peer get $HOST local-address]
:local Local2 [:pick "$Local" 0 ([:len $Local] - 3)]
# check and turn on IPSec and GRE-Tunnel if remote host is responsing to ICMP
:if ([/ping $RIP interval=1 count=5] = 5) do={
# change peer if remote or local ip changed
:if ($RIP !=$Remote2) do={
:log info "Checking remote addresses: $Remote2 will update to $RIP"
/ip ipsec peer set $HOST address=$RIP
:log info "Updated peer"
:delay 1s
:log info "Updated policy"
/interface gre set "$HOST" remote-address=$RIP
:log info "Updated remote address for $HOST tunnel"
:delay 1s
:log info "Remote address update complete"
/interface gre set $HOST disabled=no
/interface gre comment $HOST comment="$HOST"
/ip ipsec peer set $HOST disabled=no
/ip ipsec peer set $HOST comment="$HOST"
/ip ipsec policy set [find comment="$HOST"] disabled=yes
/ip ipsec policy set [find comment="$HOST"] disabled=no
:log warning "Tunnel started after remote addresses changed"
} else={}
:if ($LIP !=$Local) do={
:log warning "IPSec Peer $HOST local address invalid: current $Local updates to $LIP2"
/ip ipsec peer set $HOST local-address=$LIP2
:log warning "Updated Policy"
/interface gre set "$HOST" local-address=$LIP
:log warning "Local address updated for $HOST tunnel"
:log warning "Local addresses checked"
/interface gre set $HOST disabled=no
/interface gre comment $HOST comment="$HOST"
/ip ipsec peer set $HOST disabled=no
/ip ipsec peer set $HOST comment="$HOST"
/ip ipsec policy set [find comment="$HOST"] disabled=yes
/ip ipsec policy set [find comment="$HOST"] disabled=no
:log warning "Tunnel started after changing local addresses"
} else={}
# Automatic turn on IPSec and GRE Tunnel if above conditions are met
:if ([/interface gre get $HOST disabled] = true && \
[/ip ipsec peer get $HOST disabled] = true) do={
/interface gre set $HOST disabled=no
/interface gre comment $HOST comment="$HOST enabled, the remote host responds"
/ip ipsec peer set $HOST disabled=no
/ip ipsec peer set $HOST comment="$HOST enabled, the remote host responds"
/ip ipsec policy set [find comment="$HOST"] disabled=no
:log warning "Conditions met, $HOST tunnel enabled"} else={}
} else={
# turn off IPSec and GRE Tunnel when remote HOST is not responsing
:if ([/interface gre get $HOST disabled] = false && \
[/ip ipsec peer get $HOST disabled] = false) do={
/interface gre set $HOST disabled=yes
/interface gre comment $HOST comment="$HOST disabled due to remote host activity"
/ip ipsec peer set $HOST disabled=yes
/ip ipsec peer set $HOST comment="$HOST disabled due to remote host activity"
/ip ipsec policy set [find comment="$HOST"] disabled=yes
:log error "$HOST remote host not responding, tunnel and policy disabled"}
}
/ip cloud force-update