Auteur Sujet: Obtenir un préfixe IPv6 /60 en FTTH avec un Ubiquiti Edgerouter  (Lu 8661 fois)

0 Membres et 1 Invité sur ce sujet

jeanbaptistep

  • Abonné Bbox fibre
  • *
  • Messages: 4
  • La Baulle-Esoublac 44
Obtenir un préfixe IPv6 /60 en FTTH avec un Ubiquiti Edgerouter
« Réponse #12 le: 07 juin 2022 à 21:55:18 »
Bonjour,

Merci pour la réponse.
J'ai essayé, je n'ai pas plus de succès. Je ne vois toujours aucune requête concernant DHCPv6 entre l'ERX et l'ONT (pleins pour l'ICMPv6 par contre).

Comment est-il possible de consulter les log du firewall, afin de voir que la règle allow dhcpv6 est bien prise en compte ?

jeanbaptistep

  • Abonné Bbox fibre
  • *
  • Messages: 4
  • La Baulle-Esoublac 44
Obtenir un préfixe IPv6 /60 en FTTH avec un Ubiquiti Edgerouter
« Réponse #13 le: 17 juin 2022 à 01:00:49 »
J'ai trouvé ceci qui ressemble tout à fait au problème :
https://community.ui.com/questions/DHCPv6-PD-stop-dor-set-DUID/79aa052b-0933-434c-b2ef-3d0275a10eeb

Je rejouterai un message si j'arrive faire fonctionner le routeur.

jeanbaptistep

  • Abonné Bbox fibre
  • *
  • Messages: 4
  • La Baulle-Esoublac 44
Obtenir un préfixe IPv6 /60 en FTTH avec un Ubiquiti Edgerouter
« Réponse #14 le: 17 juin 2022 à 15:17:48 »
Bingo ! L'IPv6 est bien obtenue !
En modifiant le fichier /opt/vyatta/sbin/dhcpv6-pd-duid.pl comme indiqué dans ce post, ça fonctionne :

https://community.ui.com/questions/DHCPv6-PD-stop-dor-set-DUID/79aa052b-0933-434c-b2ef-3d0275a10eeb

Modifier la section sub set_duid par ces éléments :
sub set_duid {
    my ($duid) = @_;

    open(my $FH, '>', $dhcp6c_duid) || die "Error opening [$dhcp6c_duid]: $!\n";
    binmode($FH);

    $duid =~ s/://g;
    my $len = length($duid) / 2;
    my $buf = pack("v", $len);
    my $buf;+    my $endian = $Config{byteorder};
    if ($endian == 1234 or $endian == 12345678) {
    $buf = pack("v", $len);
    } else{
        $buf = pack("n", $len);
    }
    print $FH $buf || die "duid length write failed: $!\n";

    my $bin_duid = pack("H*", $duid);
    print $FH $bin_duid || die "duid write failed: $!\n";
    close($FH);
}
La modification semble persister au redémarrage, mais je n'ai aucune idée si elle persiste indéfiniment.

Il reste une erreur sur la commande show dhcpv6-pd duid :
"my" variable $buf masks earlier declaration in same scope at /opt/vyatta/sbin/dhcpv6-pd-duid.pl line 45.

zoc

  • Abonné Orange Fibre
  • *
  • Messages: 4 283
  • Antibes (06) / Mercury (73)
Obtenir un préfixe IPv6 /60 en FTTH avec un Ubiquiti Edgerouter
« Réponse #15 le: 17 juin 2022 à 18:18:02 »
Les modifications effectuées sur les scripts du système persistent jusqu’à l’installation d’une mise à jour firmware.

tivoli

  • Toulouse (31)
  • Abonné Bbox fibre
  • *
  • Messages: 1 944
  • Toulouse (31)
Obtenir un préfixe IPv6 /60 en FTTH avec un Ubiquiti Edgerouter
« Réponse #16 le: 30 décembre 2022 à 18:51:44 »

Après avoir changé d'IPv4 2 fois en un mois, j'ai rebranché la box pour vérifier si j'avais maintenant IPv6 et miracle ...

merci pour cela, je me suis permis de mettre au propre (car il y a des + qui trainent)

Voici la version complete du fichier

#!/usr/bin/perl

use strict;
use warnings;

use Getopt::Long;
use Config;

my $dhcp6c_duid = '/var/lib/dhcpv6/dhcp6c_duid';


sub show_duid {

    die "No DUID found\n" if ! -e $dhcp6c_duid;

    open(my $FH, '<', $dhcp6c_duid) || die "Error opening [$dhcp6c_duid]: $!\n";
    binmode($FH);
    my ($buf, $val, $len);
    read($FH, $buf, 2);
    my $endian = $Config{byteorder};
    if ($endian == 1234 or $endian == 12345678) {
        $len = unpack("v", $buf);
    } else {
        $len = unpack("n", $buf);
    }
    for (my $i = 0; $i < $len; $i++) {
        read($FH, $buf, 1);
        $val .= unpack("H", $buf);
        $val .= unpack("h", $buf);
        $val .= ':' if $i + 1 < $len;
    }
    close($FH);
    print "DUID $val\n";
}

sub set_duid {
    my ($duid) = @_;

    open(my $FH, '>', $dhcp6c_duid) || die "Error opening [$dhcp6c_duid]: $!\n";
    binmode($FH);

    $duid =~ s/://g;
    my $len = length($duid) / 2;
#    my $buf = pack("n", $len);
    my $buf;
    my $endian = $Config{byteorder};
    if ($endian == 1234 or $endian == 12345678) {
        $buf = pack("v", $len);
    } else{
        $buf = pack("n", $len);
    }


    print $FH $buf || die "duid length write failed: $!\n";
    my $bin_duid = pack("H*", $duid);
    print $FH $bin_duid || die "duid write failed: $!\n";
    close($FH);
}

sub set_duid_bin {
    my ($duid) = @_;

    open(my $FH, '>', $dhcp6c_duid) || die "Error opening [$dhcp6c_duid]: $!\n";
    binmode($FH);

    $duid =~ s/://g;
    my $len = length($duid);
    my $buf = pack("n", $len);
    print $FH $buf || die "write failed\n";

    print $FH $duid;
    close($FH);
}

sub get_mac {
    my ($intf) = @_;

    return if !defined $intf;
    my $path = "/sys/class/net/$intf/address";
    return if ! -e $path;
    open my $FH, '<', $path or return;
    my $mac = <$FH>;
    close $FH;
    chomp $mac;
    return $mac;
}

sub gen_duid {
    my ($intf) = @_;

    $intf = 'eth0' if !defined $intf;
    my $mac = get_mac($intf);
    if (!defined $mac) {
        $mac = get_mac('eth0');
    }
    my $duid;
    my $duid_type = 1;
    my $duid_intf = 6;  # ethernet
    my $duid_time = time();
    my @duid_mac = split(/:/, $mac);
    $duid  = chr(0);
    $duid .= chr($duid_type);
    $duid .= chr($duid_type);
    for (my $i=24; $i >= 0; $i -= 8) {
$duid .= chr(($duid_time >> $i) & 0xff);
}
    foreach my $b (@duid_mac) {
        $duid .= chr(hex($b));
    }
    $duid  = chr(0);
    $duid .= chr($duid_type);
    $duid .= chr($duid_type);
    for (my $i=24; $i >= 0; $i -= 8) {
$duid .= chr(($duid_time >> $i) & 0xff);
}
    foreach my $b (@duid_mac) {
        $duid .= chr(hex($b));
    }
    set_duid_bin($duid);
}


my ($action, $duid, $intf);

GetOptions("action=s" => \$action,
           "duid=s"   => \$duid,
           "intf=s"   => \$intf,
);

if (! defined $action) {
    print "Must define action\n";
    exit 1;
}

if ($action eq 'show') {
    show_duid();
    exit 0;
}

if ($action eq 'set') {
    if (! defined $duid) {
        print "Must define DUID to set it\n";
        exit 1;
    }
    set_duid($duid);
    exit 0;
}

if ($action eq 'gen') {
    if (! defined $intf) {
        print "Must define intf\n";
        exit 1;
    }
    gen_duid($intf);
    exit 0;
}

if ($action eq 'delete') {
    die "No DUID found\n" if ! -e $dhcp6c_duid;
    system("sudo rm -rf $dhcp6c_duid");
    exit 0;
}

exit 0;