Foros del Web » Programando para Internet » PHP »

Existe algo para generar rangos de ipv6 con php¿?

Estas en el tema de Existe algo para generar rangos de ipv6 con php¿? en el foro de PHP en Foros del Web. Hola! Tengo una cuestión entre manos que no se por donde pillar... Por ejemplo, el proveedor me da cualquier rango de IPv6, en este caso ...
  #1 (permalink)  
Antiguo 18/12/2019, 15:25
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 8 meses
Puntos: 8
Pregunta Existe algo para generar rangos de ipv6 con php¿?

Hola!

Tengo una cuestión entre manos que no se por donde pillar...

Por ejemplo, el proveedor me da cualquier rango de IPv6, en este caso pongamos que me da un rango /112:

Ejemplo: 2000:0000:1111:2222:3333:4444:5555:0000/112

¿Existe alguna función, código, etc.. en php que genere todo el rango de ips que trae disponible este rango?

Ejemplos:

2000:0000:1111:2222:3333:4444:5555:0001
2000:0000:1111:2222:3333:4444:5555:0002
2000:0000:1111:2222:3333:4444:5555:0003
2000:0000:1111:2222:3333:4444:5555:0004
2000:0000:1111:2222:3333:4444:5555:0005
2000:0000:1111:2222:3333:4444:5555:0006
2000:0000:1111:2222:3333:4444:5555:0007


Etc...

No se si me he explicado, pero a ver si tenéis alguna idea.

Saludos!
  #2 (permalink)  
Antiguo 19/12/2019, 14:35
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 8 meses
Puntos: 8
Respuesta: Existe algo para generar rangos de ipv6 con php¿?

Hola!

He encontrado un codigo que hace lo que busco "mas o menos", me muestra la primera ip del rango y la ultima, eso parece que lo hace bien, pero ahora me surge una necesidad...

¿Alguien sabe como puedo conseguir un bucle que me muestre una a una todas las IPv6 del rango? Es que luego hay que ejecutar un comando para agregarlas al sistema linux con, ejemplo:

shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0000/112 dev eth0")
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0001/112 dev eth0")
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0002/112 dev eth0")
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0003/112 dev eth0")

etc...

O no se si exista otra opcion de hacerlo mas sencillo, ando muy verde en el asunto, lo que he conseguido es este codigo:

Código PHP:
<?php

$a_Prefix 
"2000:1111:2222:3333:4444:5555:6666::/112";
    
// Validate input superficially with a RegExp and split accordingly
    
if(!preg_match('~^([0-9a-f:]+)[[:punct:]]([0-9]+)$~i'trim($a_Prefix), $v_Slices)){
        return 
false;
    }
    
// Make sure we have a valid ipv6 address
    
if(!filter_var($v_FirstAddress $v_Slices[1], FILTER_VALIDATE_IPFILTER_FLAG_IPV6)){
        return 
false;
    }
    
// The /## end of the range
    
$v_PrefixLength intval($v_Slices[2]);
    if(
$v_PrefixLength 128){
        return 
false// kind'a stupid :)
    
}
    
$v_SuffixLength 128 $v_PrefixLength;

    
// Convert the binary string to a hexadecimal string
    
$v_FirstAddressBin inet_pton($v_FirstAddress);
    
$v_FirstAddressHex bin2hex($v_FirstAddressBin);

    
// Build the hexadecimal string of the network mask
    // (if the manually formed binary is too large, base_convert() chokes on it... so we split it up)
    
$v_NetworkMaskHex str_repeat('1'$v_PrefixLength) . str_repeat('0'$v_SuffixLength);
    
$v_NetworkMaskHex_parts str_split($v_NetworkMaskHex8);
    foreach(
$v_NetworkMaskHex_parts as &$v_NetworkMaskHex_part){
        
$v_NetworkMaskHex_part base_convert($v_NetworkMaskHex_part216);
        
$v_NetworkMaskHex_part str_pad($v_NetworkMaskHex_part2'0'STR_PAD_LEFT);
    }
    
$v_NetworkMaskHex implode(null$v_NetworkMaskHex_parts);
    unset(
$v_NetworkMaskHex_part$v_NetworkMaskHex_parts);
    
$v_NetworkMaskBin inet_pton(implode(':'str_split($v_NetworkMaskHex4)));

    
// We have the network mask so we also apply it to First Address
    
$v_FirstAddressBin &= $v_NetworkMaskBin;
    
$v_FirstAddressHex bin2hex($v_FirstAddressBin);

    
// Convert the last address in hexadecimal
    
$v_LastAddressBin $v_FirstAddressBin | ~$v_NetworkMaskBin;
    
$v_LastAddressHex =  bin2hex($v_LastAddressBin);

    
// Return a neat object with information
    
$v_Return = array(
        
'Prefix'    => "{$v_FirstAddress}/{$v_PrefixLength}",
        
'FirstHex'  => $v_FirstAddressHex,
        
'LastHex'   => $v_LastAddressHex,
        
'MaskHex'   => $v_NetworkMaskHex,
    );
    
//return (object)$v_Return;*/

echo "v_FirstAddressHex: ".$v_FirstAddressHex."</br>";
echo 
"v_LastAddressHex: ".$v_LastAddressHex."</br>";
//var_dump($v_Return);
?>
Me muestra estos resultados:

v_FirstAddressHex: 20001111222233334444555566660000
v_LastAddressHex: 2000111122223333444455556666ffff

¿Creeis que puedo conseguir lo que busco?

Saludos!
  #3 (permalink)  
Antiguo 19/12/2019, 22:16
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años, 6 meses
Puntos: 120
Respuesta: Existe algo para generar rangos de ipv6 con php¿?

si solo quueres los rangos prrueba esto

Código PHP:
Ver original
  1. <?php
  2.  
  3. $ejemplo = '2000:0000:1111:2222:3333:4444:5555:0000/112';
  4.  
  5. $parts = explode('/',$ejemplo,2);
  6.  
  7. $rango_maximo = $parts[1]+0;//con "+0" convertimos String a Numero
  8.  
  9. $parts = explode(':',$parts[0]);
  10.  
  11. $rango_minimo = array_pop($parts)+0;//con "+0" convertimos String a Numero
  12.  
  13. $ip=implode(':',$parts);
  14.  
  15.  
  16.  
  17. echo "<pre>";
  18. for($i=$rango_minimo;$i<=$rango_maximo;$i++){
  19.     $ip_actual=  $ip .':' ;
  20.     $ip_actual= $ip_actual . str_pad($i,4,'0',STR_PAD_LEFT);
  21.     echo $ip_actual;
  22.     echo PHP_EOL;
  23. }
  24. var_dump($rango_minimo);
  25. var_dump($rango_maximo);

http://phptester.net
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9

Etiquetas: ipv6, rangos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:07.