Realtime detekce změny IP adresy (Ubuntu 17.04)

beer

  • *****
  • 727
    • Zobrazit profil
Realtime detekce změny IP adresy (Ubuntu 17.04)
« kdy: 25. 08. 2017, 18:29:55 »
Ahoj, dá se nějak realtime detekovat změna ip adresy (například teredo?). Například nějak přes systemd, když se změní ip adresa, aby se spustil soubor? Řeším přes cron.d každé 3 minuty, ale není to dostatečné...

Proč se vůbec u teredo mění neustále ip adresa, když IPv4 je stejná?

Řeším kvůli vzdállenému připojení přes ssh a dynamické dns, bohužel tam není veřejná ip adresa, ale za devatero naty, takže nemůžu využít 6to4 nebo 6in4. Poskytovatel sice umí IPv6, ale nechci měnit router, dokud slouží, za router s podporou IPv6.
« Poslední změna: 28. 08. 2017, 10:11:11 od Petr Krčmář »


aaa

Re:realtime detekce změny ip adresy (ubuntu 17.04)
« Odpověď #1 kdy: 26. 08. 2017, 01:18:38 »
Ako to riesis v crone? Mozno nieco bude v logoch (pouzi s inotify). Mne fungovalo nadviazanie spojenia na server, server vratil moju IP adresu a drzal spojenie. Ked spojenie padlo, tak po znovunadviazani som vacsinou dostal inu IP a mohol som reagovat.
Ked ani to nepojde, tak si posielaj pravidelne obojsmerne keep-alive a zhod spojenie, ked to prestane fungovat.

beer

  • *****
  • 727
    • Zobrazit profil
Re:realtime detekce změny ip adresy (ubuntu 17.04)
« Odpověď #2 kdy: 26. 08. 2017, 03:16:55 »

V cronu mám:
cat /etc/cron.d/dynv6
Kód: [Vybrat]
PATH=/sbin:/usr/sbin:/bin:/usr/bin


*/3 * * * * root /opt/miredo-restart.sh
Potom:
Kód: [Vybrat]
cat /opt/miredo-restart.sh
#!/bin/bash


host=neco.dynv6.net


ipv6=$(ip a | grep -s -i -o '200[1-2]\:[a-f0-9\.:]*' | head -n 1)
privatekey=/root/.ssh/id_ed25519


    if ping6 google.com -c3 &>/dev/null ; then
            ssh -6 -i "$privatekey" api@dynv6.com "hosts "$host" set ipv6addr "$ipv6" ipv4addr auto"
           
    else
            killall miredo &>/dev/null
            systemctl stop miredo &>/dev/null
            ip link set teredo down &>/dev/null
            sleep 1 && systemctl start miredo
            sleep 5 && ip -6 route add default dev teredo;
            sleep 5 && ipv6=$(ip a | grep -s -i -o '200[1-2]\:[a-f0-9\.:]*' | head -n 1)
            ssh -6 -i "$privatekey" api@dynv6.com "hosts "$host" set ipv6addr "$ipv6" ipv4addr auto"
            ping6 google.com -c10  -I teredo -i 5 &>/dev/null &
    fi


exit 0
Dále


v /etc/ssh/ssh_config
Kód: [Vybrat]
ServerAliveInterval 300


v /root/.ssh/config
Kód: [Vybrat]
Host *
    ServerAliveInterval 300
    ServerAliveCountMax 2


V /etc/ssh/sshd_config
Kód: [Vybrat]
ClientAliveInterval 300


V /etc/network/if-up.d/miredo
Kód: [Vybrat]
#!/bin/sh
# Reload Miredo when an interface comes up
# /etc/network/if-up.d/miredo
set -e


# Don't bother to reload when lo is configured.
if [ "$IFACE" = lo ]; then
   exit 0
fi


# Only run from ifup.
if [ "$MODE" != start ]; then
   exit 0
fi


# Miredo only cares about (underlying) IPv4 interfaces.
#if [ "$ADDRFAM" != inet ]; then
#   exit 0
#fi


# Actually, due to this bug:
#  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=475188
# exclude IPX and IPv6 explicitly instead.
if [ "$ADDRFAM" = "ipx" ] || [ "$ADDRFAM" = "inet6" ]; then


/opt/miredo-restart.sh;   exit 0


fi


# Is /usr mounted?
if [ ! -e /usr/sbin/miredo ]; then
   exit 0
fi


# Is the miredo service running?
if ! invoke-rc.d --quiet miredo status >/dev/null; then
   exit 0
fi


invoke-rc.d --quiet miredo reload || true


Dále
Kód: [Vybrat]
cat /etc/miredo.conf
# Please refer to the miredo.conf(5) man page for details.
InterfaceName   teredo


# Pick a Teredo server:
#ServerAddress   teredo.ipv6.microsoft.com
#ServerAddress   teredo-debian.remlab.net
ServerAddress   teredo.nic.cz


# Some firewall/NAT setups require a specific UDP port number:
#BindPort   3545


Takhle to mám +- na více strojích, často mne to přeruší, i když třeba zrovna píšu (není tam nečinnost).
« Poslední změna: 26. 08. 2017, 03:19:31 od beer »


beer

  • *****
  • 727
    • Zobrazit profil
Re:realtime detekce změny ip adresy (ubuntu 17.04)
« Odpověď #4 kdy: 26. 08. 2017, 12:07:31 »
LMGTFY https://unix.stackexchange.com/questions/159641/systemd-restart-service-when-ip-address-changed

Díky, to by mohlo být pro mne. Teď ještě, abych tomu rozuměl, jak mám nastavit.


systemctl list-units --type=device | grep teredo
Kód: [Vybrat]
sys-devices-virtual-net-teredo.device                                                    loaded active plugged /sys/devices/virtual/net/teredo
sys-subsystem-net-devices-teredo.device                                                  loaded active plugged /sys/subsystem/net/devices/teredo

V příkladu je:

Kód: [Vybrat]
[Unit]
Description=Service on interface %I
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/project/my_script.sh start %I

[Install]
WantedBy=multi-user.target

To to mám přepsat takhle?

Kód: [Vybrat]
[Unit]
Description=Service on interface %I
BindsTo=sys-subsystem-net-devices-teredo.device
After=sys-subsystem-net-devices-teredo.device
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/miredo-restart.sh start %I

[Install]
WantedBy=multi-user.target

Nebo jinak? Je tam vůbec potřeba to After? Jak z toho systemd pozná, že se změnila ip adresa teredo? Nemělo by se přidat ještě např:


Kód: [Vybrat]
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/miredo-restart.sh start %I
Restart=on-abort

Mají to v jiném skriptu zde: https://aur.archlinux.org/packages/dyndns/

Co znamená %I? Je to potřeba? V tom druhém skriptu, to není...
« Poslední změna: 26. 08. 2017, 12:15:30 od beer »