¿Puedo vincular un bloque (grande) de direcciones a una interfaz?

26

Sé que la herramienta ip le permite vincular varias direcciones a una interfaz (por ejemplo, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). En este momento, sin embargo, estoy tratando de construir algo sobre IPv6, y sería realmente útil tener disponible un bloque completo de direcciones (por ejemplo, a / 64), para que los programas puedan elegir cualquier dirección del rango y ato a eso. Huelga decir que conectar cada IP de este rango a una interfaz llevaría un tiempo.

¿Admite Linux vincular un bloque completo de direcciones a una interfaz?

p-static
fuente
Distintas distribuciones tienen diferentes formas de manejar esto. Elegir uno.
Ignacio Vazquez-Abrams
Ubuntu en este momento, pero las soluciones que funcionan en las distribuciones son preferidas, por supuesto.
p-static
Este tutorial vincula una sola dirección dentro de un bloque (/ 24). El / 24 solo especifica en qué bloque se encuentra. Debería funcionar de manera idéntica para IPv6.
BillThor
La distribución cruzada sería escribir un script que use "ip addr add". Red Hat, Ubuntu y SuSE tienen diferentes scripts de red ...
Sean Reifschneider
1
@ChandraNakka ¿Es esto útil para usted?
kasperd

Respuestas:

31

Linux 2.6.37 y superior admite esto a través de una función llamada AnyIP . Por ejemplo si corro

ip route add local 2001:db8::/32 dev lo

en una máquina Ubuntu 11.04 aceptará conexiones en cualquier dirección en la red 2001: db8 :: / 32.

Gerald Peines
fuente
1
¿Hay alguna solución AnyIP para ipv4?
Coaku
¿Funciona en Ubuntu 14.04?
Chandra Nakka
Esto parece funcionar y puedo hacer ping al rango de direcciones, pero cuando ejecuto ip route listo ip -6 route listla ruta agregada no es visible. ¿Cómo enumeraría un bloque de direcciones AnyIP?
Colton
Esto funciona para las direcciones localmente, pero no puedo hacer ping o acceder a estas IP desde fuentes externas. ¿Alguna manera de arreglar eso? (Traté de reemplazar lo con eth0 pero luego no hay nada accesible)
BrainStone
@BrainStone necesita instalar ndppd para eso, u obtener un prefijo enrutado de su proveedor
Arya
6

Sí, Linux admite la vinculación de un bloque de direcciones de red a una interfaz de red ... pero solo en la interfaz de bucle invertido. Entonces puedes hacer esto:

ip addr add 192.168.5.0/24 dev lo

Y luego haz esto:

$ nmap -sP -oG - 192.168.5.0/24

# Nmap 5.21 scan initiated Tue Dec  7 11:38:28 2010 as: nmap -sP -oG - 192.168.5.0/24 
Host: 192.168.5.0 ()    Status: Up
Host: 192.168.5.1 ()    Status: Up
Host: 192.168.5.2 ()    Status: Up
[...]
Host: 192.168.5.254 ()  Status: Up
Host: 192.168.5.255 ()  Status: Up
# Nmap done at Tue Dec  7 11:38:46 2010 -- 256 IP addresses (256 hosts up) scanned in 0.11 seconds

Con las rutas apropiadas en su lugar, esto hará lo que desee ... para las direcciones IPv4. Has preguntado sobre IPv6, y no tengo ninguna experiencia con IPv6, pero hay muchas posibilidades de que funcione de la misma manera.

Originalmente leí sobre esto aquí (hacia la parte inferior del artículo). Tenga en cuenta que este artículo también analiza cómo asignar explícitamente múltiples direcciones a una interfaz utilizando las funciones de CentOS / Red Hat que no conocía anteriormente.

larsks
fuente
¡Guay! Intenté esto con IPv6 en Ubuntu (Lucid & Hardy) sin suerte. Creo que esta sería una característica excelente para IPv6: podría asignar direcciones a objetos de base de datos o usar direcciones como ID de sesión.
Gerald Combs
2
No, no debe agregar una dirección a lo. En su lugar, añadir una ruta: ip -6 route add local <ip> dev lo.
Navin
2

Entonces veo algunas opciones aquí:

  1. use un script para vincular todas las direcciones a la interfaz individualmente

  2. dirija el bloque que desea a la dirección única de su máquina, y luego haga que esa máquina use la interfaz pcap para interceptar todo el tráfico de dicho bloque (como si fuera un enrutador) y manejarlo.

  3. Podrías jugar trucos con reglas NAT para luego reescribir un bloque de Ips que fueron enrutados a una máquina en una sola IP interna en esa máquina ... pero aún así terminarás con una IP interna por IP que realmente quieres pagar. atención, lo que lo lleva de vuelta a la solución 1.

Si yo fuera usted, simplemente escribiría el pequeño script en la opción 1. O use el de aquí :

#!/bin/sh
if [ "$#" -ne "4" ]; then
        echo Usage:
        echo " $0 interface ip range netmask"
        echo " examples:"
        echo "  1) Assuming you want to bind the IP range 192.168.0.1..192.168.0.254 to eth0 with netmask 255.255.255.0:"
        echo "  $0 eth0 192.168.0. 1..254 255.255.255.0"
        echo "  2) Assuming you want to bind the IPv6 range 2001:41d0:1:5000::1-2001:41d0:1:5000::254 to eth0 with netmask /56"
        echo "  $0 eth0 2001:41d0:1:5000:: 1..254 56"
else
        echo "Attempting to assign the IP range $2($3) to interface $1 with netmask $4"
        for ip in $(eval echo "{$3}"); do ifconfig -v $1 add $2$ip netmask $4; done
fi
pjz
fuente
¿Dónde se nombraría tal script?
Skaperen
2

Como han dicho otros, puede usar el mecanismo AnyIP para enrutar los paquetes que llegan para una subred completa a la interfaz localhost, pero tenga en cuenta que también necesitará que su enrutador ascendente enrute todos los paquetes deseados a esta máquina en El primer lugar. Esto se puede hacer simplemente con las entradas de la tabla de enrutamiento en el enrutador o mediante BGP. ARP no es realmente apropiado dado que su máquina tendría que ARP para cada IP individualmente.

Kyle Rose
fuente
1

El "Anyip" descrito anteriormente no funcionó para mí en centos 7. Tuve que crear un script para crear manualmente direcciones IPv6 en el arranque. Para hacerlo, he agregado lo siguiente a / etc / crontab:

@reboot root /path/to/bashscript

Aquí está el script bash para crear aproximadamente 3000 direcciones ipv6:

#!/bin/bash
INETP="2a00:xxxx:xxxx:xxxx::"
PRE="64"
INTE="eth0"
IP1=/sbin/ip
echo -n "Adding IPv6 addresses..."
for i in {3..3000}
do
$IP1 -6 addr add ${INETP}$(printf '%x\n' $i)/${PRE} dev ${INTE}
done
echo "Done!"
Nicolas Guérinet
fuente
Este método solo funciona hasta que alcanza aproximadamente 4000 direcciones. Si intenta configurar más direcciones que eso, no funcionará. Hay escenarios en los que es deseable asignar un / 96 o / 64 completo a un solo host, no hay forma de que su método se ajuste tanto.
kasperd
@kasperd, ¿dónde puede hacer que el llamado mecanismo anyip "descrito" por Gerald Combs anteriormente funcione en Centos 7 o Debian 8?
Nicolas Guérinet
1
Si, eso funciona. Pero hay algunos pasos más que los mencionados en esa respuesta. Vea mi respuesta a una pregunta similar.
kasperd