OpCode.eu.org

Blog O autorze O serwisie
2020-05-02

Orange Światłowód, FunBox 3.0 i IPv6

Orange zapewnia natywny dostęp IPv6 jeżeli w ramach loginu PPPoE ...@neostrada.pl użyjemy sufiksu /ipv6 czyli ...@neostrada.pl/ipv6. W umowie wskazany jest właśnie login z tym sufiksem, wydaje się że tak jest w większości umów. Pomimo tego modem „FunBox 3.0” regularnie usuwa ten surfix z używanego loginu tym samym wyłączając IPv6.

Rozwiązaniem problemu może być użycie cron'a do sprawdzania dostępności IPv6 i jej przywracania z użyciem poniższego skryptu (check_ipv6.sh):

#!/bin/bash
exec >> /dev/shm/check_ipv6.log 2>&1
LOCK_FILE='/dev/shm/check_ipv6.lock'

#
# settings
#

ROUTER=192.168.6.1                # router IPv4
PASSWORD=''                       # router password
LOGIN=''                          # PPPoE login (...@neostrada.pl)
IP_CHECK_1="2001:4860:4860::8888" # external IPv6 to check
IP_CHECK_2="2620:0:ccc::2"        # other external IPv6 to check
NAME_CHECK_1="ip1"                # name for $IP_CHECK_2 (only for log)
NAME_CHECK_2="ip2"                # name for $IP_CHECK_2 (only for log)

[ ! -e /etc/network/check_ipv6.cfg ] && exit
. /etc/network/check_ipv6.cfg

#
# router configure function
#

fix_ipv6() {
    # logowanie
    cookie=`mktemp /dev/shm/curl.XXXXXXXXXX`
    res=`curl "http://$ROUTER/authenticate?username=admin&password=$PASSWORD" --cookie-jar "$cookie" --data '' 2>/dev/null`
    context=`python3 -c 'import json; d = json.loads("""'"$res"'"""); print(d["data"]["contextID"])'`

    # aktywacja IPv6
    curl -s "http://$ROUTER/sysbus/NMC/IPv6:set"   -H "X-Context: $context" --cookie "$cookie" --data '{"parameters":{"IPv4UserRequested":false}}'
    curl -s "http://$ROUTER/sysbus/NMC:setWanMode" -H "X-Context: $context" --cookie "$cookie" --data '{"parameters":{"WanMode":"GPON_PPP","Username":"bez_ochrony-'"$LOGIN"'/ipv6"}}'

    # sprzatanie
    rm "$cookie"
}

#
# check and run ...
#

# check lock
lock=`cat $LOCK_FILE 2>/dev/null`
let lock--
if [ $lock -ge 0 ]; then
    echo $lock > $LOCK_FILE
    exit
fi

# check connections and try fix it
ping6 -c 1 $IP_CHECK_1 >& /dev/null && exit
date +"%F %H:%M"
echo "  - $NAME_CHECK_1 is unavailable"
echo 1 > $LOCK_FILE # temporary lock for next ping

ping6 -c 1 $IP_CHECK_2 >& /dev/null && exit
echo "  - $NAME_CHECK_2 is unavailable"
echo 3 > $LOCK_FILE # long temporary lock for restart networking
systemctl restart networking

sleep 30 # wait for recheck after restart networking

ping6 -c 1 $IP_CHECK_1 >& /dev/null && exit
ping6 -c 1 $IP_CHECK_2 >& /dev/null && exit
echo "  - hosts are still unavailable after restart networking"
echo 10 > $LOCK_FILE # final lock for fix ipv6 on funbox
fix_ipv6
echo ""

Skrypt wymaga python3 i curl. Konieczne jest ustawienie w skrypcie lub pliku konfiguracyjnym (/etc/network/check_ipv6.cfg) adresu IPv4 swojego routera (zmienna ROUTER), hasła do routera (zmienna PASSWORD) oraz loginu neostrady bez sufiksu (zmienna LOGIN). Domyślnie skrypt do sprawdzania dostępności IPv6 używa serwerów DNS od Google i OpenDNS adresy te można zmienić poprzez odpowiednie zmienne.

Całość procedury przywrócenia IPv6 zajmuje około minuty, co przy uruchamianiu skryptu przez crond co 1 minutę daje niedostępność IPv6 przez niecałe 2 minuty.

Tagi: ipv6