Auteur Sujet: Test du MAP-T et MAP-E en LAB  (Lu 2337 fois)

0 Membres et 1 Invité sur ce sujet

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 373
Test du MAP-T et MAP-E en LAB
« Réponse #24 le: 22 février 2024 à 11:03:18 »
sinon utiliser Gemini (le GPT de Google) et lui demander EN ANGLAIS:
"python code to calculate IPv6 MAP-T and MAP-E parameters"

la il te répond qu'il existe une lib python pour cela (https://github.com/ejordangottlieb/pyswmap) et il te donne un exemple:

J'ai voulu tester par curiosité, mais pas moyen d'y accéder. Il me dit que mon compte n'est pas compatible, mais je ne suis dans aucun des cas bloquant décrit dans l'aide. Encore un truc bien foutu...

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Test du MAP-T et MAP-E en LAB
« Réponse #25 le: 22 février 2024 à 14:14:50 »
Et ben franchement, il manque pas grand chose pour que ce soit nickel.

listmapaddresses.py qui calcule tous les préfixes, se suffit presque à lui-même. Juste à rajouter un petit grep derrière pour filtrer son préfixe délégué et on a déjà l'IP publique et le PSID (ce qui bien l'info importante pour une conf statique).

Le petit truc qui manque c'est l'affichage du ou des ranges de ports (comme le simulateur de cisco) et non l'ensemble. En plus dans le terminal, ça fait un affichage bizarre qui coupe les lignes, à moins de l'exporter dans un fichier.

la boucle d'affichage de listmapaddresses.py (listaddr.py plutot c'est le meme mais en passant les parametres) est simple a modifier. tu veux quel format de sortie ?
si ton terminal coupe les lignes trop longues , ca se règle aussi.


renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 373
Test du MAP-T et MAP-E en LAB
« Réponse #26 le: 22 février 2024 à 16:20:25 »
Le format inchangé si on entre rien. Et les ports en plus si on spécifie un préfixe particulier (-pfx) avec une présentation un peu plus lisible, ex :

Sans offset :
User prefix: 2001:db8:0:3fc0::/60 
MAP address: 2001:db8:0:3fc0:0:5ba0:ff:0 
PSID: 0
IPv4: 91.160.0.255
Reserved ports: None
Available ports (1 range): 0-16384

Ou avec offset (ici 2) :
User prefix: 2001:db8:0:3fc0::/60 
MAP address: 2001:db8:0:3fc0:0:5ba0:ff:0 
PSID: 0
IPv4: 91.160.0.255
Reserved ports: 0-4095
Available ports (3 ranges): 16384-20479, 32768-36863, 49152-53247

Tu me dis si je t'en demande trop  ;)

Et merci encore.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Test du MAP-T et MAP-E en LAB
« Réponse #27 le: 25 février 2024 à 21:56:08 »
m'en faut un peu plus niveau explication...

ce résultat
User prefix: 2001:db8:0:3fc0::/60
MAP address: 2001:db8:0:3fc0:0:5ba0:ff:0
PSID: 0
IPv4: 91.160.0.255
Reserved ports: None
Available ports (1 range): 0-16384

serait avec quels paramètres en entrée ?





renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 373
Test du MAP-T et MAP-E en LAB
« Réponse #28 le: 26 février 2024 à 22:37:55 »
Ah... je pensais que t'avais saisi.

Je parle de la règle dans le script directement, sauf qu'on spécifie en plus le /60 (ou autre) qu'on veut en particulier comme argument :
m = MapCalc( rulev6='2001:db8::/50',
             rulev4='91.160.0.0/24',
             #psidoffset=6,
             ratio=4,
             ealen=10,
                   )

Et l'autre avec l'offset dé-commenté.

Mais je me demande si c'est pas plus simple de tout mettre en argument, plutôt que de modifier le script à chaque fois et faire (ou simplifié sans les options -v6 -v4...) :
listmapaddresses.py -v6 2001:db8::/50 -v4 91.160.0.0/24 -off 0 -ratio 4 -ea 10
Ce qui donne :
User prefix: 2001:db8::/60  MAP address: 2a01:e0a::5ba0:0:0  PSID: 0 IPv4: 91.160.0.0
User prefix: 2001:db8:0:10::/60  MAP address: 2a01:e0a:0:10:0:5ba0:0:1  PSID: 1 IPv4: 91.160.0.0
User prefix: 2001:db8:0:20::/60  MAP address: 2a01:e0a:0:20:0:5ba0:0:2  PSID: 2 IPv4: 91.160.0.0
User prefix: 2001:db8:0:30::/60  MAP address: 2a01:e0a:0:30:0:5ba0:0:3  PSID: 3 IPv4: 91.160.0.0
User prefix: 2001:db8:0:40::/60  MAP address: 2a01:e0a:0:40:0:5ba0:1:0  PSID: 0 IPv4: 91.160.0.1
User prefix: 2001:db8:0:50::/60  MAP address: 2a01:e0a:0:50:0:5ba0:1:1  PSID: 1 IPv4: 91.160.0.1
User prefix: 2001:db8:0:60::/60  MAP address: 2a01:e0a:0:60:0:5ba0:1:2  PSID: 2 IPv4: 91.160.0.1
User prefix: 2001:db8:0:70::/60  MAP address: 2a01:e0a:0:70:0:5ba0:1:3  PSID: 3 IPv4: 91.160.0.1
...

Et listmapaddresses.py -v6 2a01:e0a::/50 -v4 91.160.0.0/24 -off 0 -ratio 4 -ea 10 -pd 2001:db8:0:3fc0::/60User prefix: 2001:db8:0:3fc0::/60
MAP address: 2001:db8:0:3fc0:0:5ba0:ff:0
PSID: 0
IPv4: 91.160.0.255
Reserved ports: None
Available ports (1 range): 0-16384
« Modifié: 26 février 2024 à 23:16:10 par renaud07 »

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Test du MAP-T et MAP-E en LAB
« Réponse #29 le: 28 février 2024 à 12:32:42 »
"Reserved ports" je ne vois pas dans la lib ou c'est.
sinon ca donne un truc du genre (vire fait, pas propre mais ca devrait marcher):

#!/usr/bin/env python
import sys
import argparse

sys.path.append("..")

from pyswmap import MapCalc


parser=argparse.ArgumentParser(description="MapCalc")
parser.add_argument("-v6")
parser.add_argument("-v4")
parser.add_argument("-ratio",type=int)
parser.add_argument("-ea",type=int)
parser.add_argument("-off",type=int)
parser.add_argument("-pd")
args=parser.parse_args()

# This prints out a list of all possible MAP end-user IPv6 prefixes,
# applicable MAP IPv6 addresses, and PSIDs for a particular domain.
# PSID will always equal 0 for a sharing ratio of 1:1.  This script is
# allows the entering in of the mapping rule via the command line but is
# otherwise the same as listmapaddresses.py.


# Define MAP domain characteristics.  The values may be changed to suite
# a alternate MAP domain configurations.

m = MapCalc(
    rulev6=args.v6,
    rulev4=args.v4,
    psidoffset=args.off,
    ratio=args.ratio,
    ealen=args.ea,
)

# print contiguous ranges in a list of ordered integers
def print_ranges(l):
  if not l:
    print("no range!")
    return

  first = l[0]
  curr = first

  for n in l[1:]:
    if n != curr + 1:
      print("{}-{}, ".format(first,curr),end="")
      first = n
    curr = n
  print("{}-{}".format(first,curr))



# The attribute rulev4object is the object returned for a particular
# instance of the ip_address class from module Python ipaddress.
for y in range(m.rulev4object.num_addresses):
    for w in range(2**m.psidbits):
        mapce = m.get_mapce_addr(m.rulev4object[y], w)
        pd = m.get_mapce_prefix(m.rulev4object[y], w)
        if args.pd is None:
            print(
                "User prefix: {}  MAP address: {}  PSID: {} IPv4: {}".format(
                    pd,
                    mapce,
                    w,
                    m.get_map_ipv4(mapce),
                )
            )
        if args.pd == pd:
            print(
                "User prefix: {}\nMAP address: {}\nPSID: {}\nIPv4: {}".format(
                    pd,
                    mapce,
                    w,
                    m.get_map_ipv4(mapce),
                )
            )
            print("reversed ports: {}\nAvailable ports ({} range): ".format(
                    "todo",
                    m.port_ranges(),
                ),end=""
            )
            print_ranges(m.port_list(w))


renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 373
Test du MAP-T et MAP-E en LAB
« Réponse #30 le: 28 février 2024 à 15:05:49 »
Merci beaucoup, ça marche nickel  :)

Pour les ports réservés, je ne crois pas que ça soit dedans non plus. C'est pas bien grave.

Y'aurait juste un petit truc à ajouter : c'est que ea length ou le ratio soit en option (vu que l'un découle de l'autre) comme le script de base.

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Test du MAP-T et MAP-E en LAB
« Réponse #31 le: 28 février 2024 à 19:54:37 »
Y'aurait juste un petit truc à ajouter : c'est que ea length ou le ratio soit en option (vu que l'un découle de l'autre) comme le script de base.

on peut modifier de façon a passer directement les arguments de la ligne de commande a  MapCalc.

par contre on doit utiliser exactement les mêmes noms que MapCalc attend donc:

python3 listaddr.py  -rulev6 2a01:e0a::/50 -rulev4 91.160.0.0/24 -psidoffset 0 -ratio 4 -ealen 10avec argparse.SUPPRESS sur ratio et ealen on peut ignorer l'un ou l'autre (si on ignore les 2, MapCalc générera une erreur).

voici la nouvelle version de listaddr.py:
#!/usr/bin/env python
import sys
import argparse

sys.path.append("..")

from pyswmap import MapCalc


parser=argparse.ArgumentParser(description="MapCalc")
parser.add_argument("-rulev6")
parser.add_argument("-rulev4")
parser.add_argument("-ratio",type=int,default=argparse.SUPPRESS)
parser.add_argument("-ealen",type=int,default=argparse.SUPPRESS)
parser.add_argument("-psidoffset",type=int)
parser.add_argument("-pd")
args=parser.parse_args()

# Define MAP domain characteristics.  The values may be changed to suite
# a alternate MAP domain configurations.

m = MapCalc(**vars(args))

# print contiguous ranges in a list of ordered integers
def print_ranges(l):
  if not l:
    print("no range!")
    return

  first = l[0]
  curr = first

  for n in l[1:]:
    if n != curr + 1:
      print("{}-{}, ".format(first,curr),end="")
      first = n
    curr = n
  print("{}-{}".format(first,curr))



# The attribute rulev4object is the object returned for a particular
# instance of the ip_address class from module Python ipaddress.
for y in range(m.rulev4object.num_addresses):
    for w in range(2**m.psidbits):
        mapce = m.get_mapce_addr(m.rulev4object[y], w)
        pd = m.get_mapce_prefix(m.rulev4object[y], w)
        if args.pd is None:
            print(
                "User prefix: {}  MAP address: {}  PSID: {} IPv4: {}".format(
                    pd,
                    mapce,
                    w,
                    m.get_map_ipv4(mapce),
                )
            )
        if args.pd == pd:
            print(
                "User prefix: {}\nMAP address: {}\nPSID: {}\nIPv4: {}".format(
                    pd,
                    mapce,
                    w,
                    m.get_map_ipv4(mapce),
                )
            )
            print("reversed ports: {}\nAvailable ports ({} range): ".format(
                    "todo",
                    m.port_ranges(),
                ),end=""
            )
            print_ranges(m.port_list(w))

kgersen

  • Modérateur
  • Abonné Bbox fibre
  • *
  • Messages: 9 092
  • Paris (75)
Test du MAP-T et MAP-E en LAB
« Réponse #32 le: 28 février 2024 à 20:04:52 »
ps: j'ai forké le projet sur github , mes modifs sont dispo directement labas

fichier direct: https://github.com/kgersen/pyswmap/blob/master/examples/listaddr.py

ou

git clone https://github.com/kgersen/pyswmap.git
cd pyswmap/examples
python3 listaddr.py ...

renaud07

  • Abonné Orange adsl
  • *
  • Messages: 3 373
Test du MAP-T et MAP-E en LAB
« Réponse #33 le: 28 février 2024 à 23:55:14 »
Bonne idée le fork pour que ça profite à tout le monde, franchement c'est nickel.

Encore merci, ça fonctionne au poil  ;)