Questo è un esempio di script bash per assegnare una delega ipv6 partendo da un prefisso statico ipv6. Si può utilizzare con openvpn, in modo classico o come vi pare!

Nella fattispecie questo è lo script che avevo codato ed utilizzato per l’assegnazione delle classi private ai customer del TB. Dal momento che il tb non c’è più e se c’è io non ne faccio più parte (se ve lo state chiedendo non è importante come e perchè ma il post) e dal momento che me lo chiedono in tanti: eccovi serviti. Pulito “abbastanza…non molto a dire il vero, per come la vedo io”, semplice “sicuramente”, efficace “anche!”.

#!/bin/bash
# ra-ipv6-verifier.sh
# https://bitbucket.org/a1cs/bash/raw/8e333e6099a5df7f46c6cd7203eee59e4891b593/ra-ipv6-verifier.sh
# ax - ax[at]slackware.eu
# release 1.0p1

echo
echo "# By ax                    #"
echo "# Sa. for           IPV6 TB#"
echo "# Cp. by    ax - ax@slackware.eu   #"
echo


# ISTRUZIONI:
# Ricordati che per rendere operativo il processo di verifica
# tutti i file .sh generati devono essere spostati nella cartella /var/Deleghe.
# IMPORTANTE: La cartella deve avere i permessi di lettura per gruppo users!
# Setta la variabile per cambiare la cartella di destinazione.

# Lo script genera di base classi ::/80 partendo da un prefisso stabilito
# Modificare i parametri commentati successivi per cambiare il comportamento dello script!

array=( 1 2 3 4 5 6 7 8 9 a b c d e f ) # caratteri contenuti in indirizzi ipv6
MAXCOUNT=1 # numero di ipv6 da generare alla fine
count=1
network=2001:FFFF:a1c5:f1c4 # ipv6 network prefix
cartella=/var/Deleghe # cartella di destinazione delle deleghe
face=eth0 # interfaccia da cui prelevare l'ip local del server

echo "CIAO,"
echo "sono l'oracolo dei server *nix.."
echo "puoi chiamarmi... ax"
echo "facciamoci una chiacchierata!"
echo

rnd_ip_block ()
{
    a=${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]}${array[$RANDOM%16]}

    echo $network:$a:: 
}

echo "$MAXCOUNT IPv6 ::/80"
echo "*------------------------*"
while [ "$count" -le $MAXCOUNT ]        
do
        rnd_ip_block
        let "count += 1"                
        done > sub.ipv6
    cat sub.ipv6
echo "*------------------------*"

# istruzioni per continuare dopo!
echo ""
echo -n "ax: Vuoi creare lo script di delega con il prefisso generato? [yes or no]: "
read scelta
case $scelta in

        [yY] | [yY][Ee][Ss] )
                echo
        echo "ax: Ok procedo, ti farò un paio di domande."
        echo
        # Avvio script interattivo con i dati della delega
        read -p "Quale interfaccia vuoi creare? (nome del tunnel): " iface
        read -p "Qual'è end-point? (ipv4 dell'user): " remote
        echo "ax: Perfetto! procedo con la creazione dello script"
        # Creo il file config con tutti i dati all'interno
        touch $iface.conf
        echo -e "#!/bin/bash" > $iface.conf
        echo -e "" >> $iface.conf
                # Cerco e setto la variabile per l'ipv4 locale della macchina in base alle interfacce presenti
        LOCAL=$(ip -o addr show dev $face | sed -e's/^.*inet \([^ ]*\)\/.*$/\1/;t;d' | head -1)
        ifconfig=$(ifconfig -s | awk '{ print $1 }' | grep $face | head -1)
            if [[ $ifconfig == $face || $? == $0 ]]; then
                                echo
                                echo "local addr: [$LOCAL]"
                        else
                                echo
                                echo "ATTENZIONE: L'interfaccia local $face non esiste!"
                                echo "Non posso continuare a generare la delega..."
                echo "In ogni caso puoi visionare il prefisso generato.";
                        echo "CMD: 'cat sub.ipv6'";
                echo "# End"
                echo
                exit 1
                        fi     
        # Aggiungo le variabili alla fine della stringa per la subnet creata in precedenza
        SUBNET=$(cat sub.ipv6 | sed -e 's/$/\/80/g')
        ADDRESS=$(cat sub.ipv6 | sed -e 's/$/1/g')
        ROUTE=$(cat sub.ipv6 | sed -e 's/$/2/g')
        # Aggiungo i comandi per il mode-sit che andranno nello script
        echo "ip tunnel add $iface mode sit remote $remote local $LOCAL ttl 255" >> $iface.conf
        echo "ip link set $iface up" >> $iface.conf
        echo "ip -6 a a $ADDRESS dev $iface" >> $iface.conf
        #echo "ip -6 r a $ROUTE dev $iface" >> $iface.conf
        #echo "ip -6 r a $SUBNET via $ROUTE dev $iface metric 256" >> $iface.conf
        echo "ip -6 r a $SUBNET dev $iface metric 256" >> $iface.conf
        echo "sysctl -w net.ipv6.conf.$iface.forwarding=1" >> $iface.conf
        echo "" >> $iface.conf
        echo -e "# END " >> $iface.conf
        echo
        # Agisco sulle estensioni del file finale!
        echo -e "ax: converto lo script in bash per eseguirlo via ./$iface.sh"
        sleep 3
        mv $iface.conf $iface.sh
        echo
        echo -e "ax: FATTO! Script generato: $iface.sh"
        echo
        echo -e "Ricordati di visionarlo prima di lanciarlo per verificare i dati."
        echo -e "Magari hai premuto qualche tasto in modo accidentale..."
        echo -e "Oppure sei/eri sotto l'effetto di una sostanza allucinogena... ;>"
        # creo lo script da dare all'utente
                touch $iface.user-conf
                echo -e "#!/bin/bash" > $iface.user-conf
                echo "" >> $iface.user-conf
                echo -e "ip tunnel add $iface mode sit remote $LOCAL local $remote ttl 255" >> $iface.user-conf
                echo -e "ip link set $iface up" >> $iface.user-conf
                echo -e "ip -6 a a $ROUTE/80 dev $iface" >> $iface.user-conf
                echo -e "ip -6 r a $ADDRESS dev $iface" >> $iface.user-conf
                echo -e "ip -6 r a default via $ADDRESS  dev $iface metric 256" >> $iface.user-conf      
                echo -e "sysctl -w net.ipv6.conf.$iface.forwarding=1" >> $iface.user-conf
                echo "" >> $iface.user-conf
                echo -e "# END " >> $iface.user-conf
                echo -e "Ho creato lo script client per l'utente finale [$iface.user-conf]"            
                echo
        ;;

        [nN] | [nN][Oo] )
                echo
        echo "ax: Hai deciso di non continuare. Tutt APPOST!";
                echo "In ogni caso puoi visionare il prefisso generato.";
        echo "CMD: 'cat sub.ipv6'";
        exit 1
                ;;
        *)      echo
        echo "ax: Scus ma nun sai legger? O vir che si GNURANT! Scegli: Y/N"
        echo "Puoi comunque visionare il prefisso generato.";
                echo "CMD: 'cat sub.ipv6'";
        exit 1
        ;;
esac

# istruzioni per la verifica del suffisso generato!
echo
echo -n "ax: Vuoi verificare se la subnet creata esiste già? [yes or no]: "
read verifica
case $verifica in

        [yY] | [yY][Ee][Ss] )
        echo ""
        echo "ax: OK procedo con la verifica."
        # Riprendo i parametri della subnet generata e effettuo la verifica nella directory specificata
        VERIFY=$(grep -r -i "$SUBNET" $cartella | awk '{ print $5 }')
            if [ "$SUBNET" == "$VERIFY" ]; then
                        echo
                echo "ATTENZIONE: la subnet creata è già attiva"
                echo "Premi un tasto per continuare ..."
                read # blocco il continuo dello script fino alla selezione di un tasto a caso
                echo
                echo "ax: Le probabilità dovevano essere rare in teoria."
                echo "A quanto pare, invece, l'improbabile è dietro l'angolo..."
                echo "Devi necessariamente ricominciare il processo di creazione della subnet!"
                echo "Lo script successivo potrebbe tornarti utile..."
                echo
            else
                        echo
                echo "ax: Nessuna subnet con lo stesso prefisso ;>"
                echo "Vai liscio come l'olio! PROCEDI!"
            fi
        rm sub.ipv6
        ;;
    [nN] | [nN][Oo] )
                echo
        echo "ax: Hai deciso di fregartene..."
                echo "Se esiste già: cazzi tuoi!"
        echo "In ogni caso puoi visionare lo script *.sh generato.";
                rm sub.ipv6
        exit 1
                ;;
        *)      echo
                echo "ax: Tasto non consentito ..."
        echo "Taviss mbarà a legger nu poc meglio..."
        echo "In ogni caso puoi visionare lo script *.sh generato.";
        echo "ADDIO!"
                rm sub.ipv6
        exit 1
        ;;
esac

# Scelta delle azioni finali sul file.sh generato!
echo
PS3="ax: Scegli se/come agire su [$iface.sh] oppure premi [ CTRL+C ] per terminare lo script: "
select azione in "Visualizza" "Cambia permessi" "Sposta" "Elimina" "Esci"; do

    case $azione in
        "Visualizza")
            echo
            echo "ax: informazioni pe GNURANT! :"
            echo "Tasti direzionali [◀▼▲▶ | pagSU-pagGIU]"
            echo "Quit [q]"
            echo "Premi un tasto per continuare nella visualizzazione..."
            read
            less $iface.sh
            echo
            ;;
        "Cambia permessi")
            echo
            chmod +x $iface.sh
            echo "ax: Ho cambiato i permessi di [$iface.sh] per l'esecuzione."
            echo "Adesso puoi lanciarlo con [sudo|su ./$iface.sh]"
            echo
            ;;
        "Sposta")
            echo "ax: Verifico se ci sono le condizioni per spostare il file..."
            echo
            # setto varibile di controllo dell'esistenza del file nella directory di destinazione
            if [[ -f $cartella/$iface.sh ]]; then # se esiste il file $cartella/$iface.sh fai questo
                                echo "ATTENZIONE: il file $iface.sh esiste già!"
                                echo "Probabilmente hai già assegnato una delega con questo nome."
                                echo "Non posso copiare il file per ragioni di sicurezza!."
                echo "A questo punto ti consiglio di eliminarlo prima di uscire."
                                echo
                elif [[ -x $iface.sh  ]]; then                                                                                                
                                        mv $iface.sh $cartella
                                        echo "ax: $iface.sh è stato spostato nella dir delle deleghe: [$cartella]"
                                        echo
                                        exit 1
                                else
                                        echo "ax: $iface.sh non è eseguibile!"
                                        echo "Devi prima cambiare i permessi."
                                        echo
                                fi  
            ;;
        "Elimina")
            rm $iface.sh
            echo "ax: ho eliminato [$iface.sh]"
            echo
            exit 1
            ;;
        "Esci")
            echo "ax: ADDIO"
            exit 1
            ;;
    esac
done

# End