Puis-je lier un (grand) bloc d'adresses à une interface?


26

Je sais que l'outil ip vous permet de lier plusieurs adresses à une interface (par exemple, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). En ce moment, cependant, j'essaie de construire quelque chose au-dessus d'IPv6, et il serait vraiment utile d'avoir un bloc entier d'adresses (disons, un / 64) disponible, afin que les programmes puissent choisir n'importe quelle adresse dans la plage et lier à cela. Inutile de dire que connecter chaque IP de cette plage à une interface prendrait un certain temps.

Linux prend-il en charge la liaison d'un bloc entier d'adresses à une interface?


Différentes distributions ont différentes manières de gérer cela. Choisissez-en un.
Ignacio Vazquez-Abrams

Ubuntu en ce moment, mais les solutions qui fonctionnent à travers les distributions sont préférées, bien sûr.
p-statique

Ce didacticiel lie une seule adresse dans un bloc (/ 24). Le / 24 spécifie simplement dans quel bloc il se trouve. Il devrait fonctionner de manière identique pour IPv6.
BillThor

La distribution croisée consisterait à écrire un script utilisant "ip addr add". Red Hat, Ubuntu et SuSE ont des scripts de mise en réseau différents ...
Sean Reifschneider

1
@ChandraNakka Cela vous est- il utile?
kasperd

Réponses:


31

Linux 2.6.37 et supérieur prend en charge cela via une fonctionnalité appelée AnyIP . Par exemple, si je cours

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

sur une machine Ubuntu 11.04, il acceptera les connexions sur n'importe quelle adresse du réseau 2001: db8 :: / 32.


1
Existe-t-il une solution AnyIP pour ipv4?
Coaku

Est-ce que cela fonctionne sur Ubuntu 14.04?
Chandra Nakka

Cela semble fonctionner et je peux envoyer une requête ping à la plage d'adresses, mais lorsque j'exécute ip route listou que ip -6 route listla route ajoutée n'est pas visible. Comment énuméreriez-vous un bloc d'adresse AnyIP?
Colton

Cela fonctionne pour les adresses localement mais je ne peux pas cingler ou accéder à ces IP à partir de sources externes. Une façon de résoudre ce problème? (J'ai essayé de remplacer lo par eth0 mais alors rien n'est accessible)
BrainStone

@BrainStone vous devez installer ndppd pour cela, ou obtenir un préfixe acheminé depuis votre fournisseur
Arya

6

Oui, Linux prend en charge la liaison d'un bloc d'adresses réseau à une interface réseau ... mais uniquement sur l'interface de bouclage. Vous pouvez donc faire ceci:

ip addr add 192.168.5.0/24 dev lo

Et puis faites ceci:

$ 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

Avec les routes appropriées en place, cela fera ce que vous voulez ... pour les adresses IPv4. Vous avez posé des questions sur IPv6, et je n'ai aucune expérience avec IPv6, mais il y a de fortes chances que cela fonctionne de la même manière.

J'ai lu à ce sujet à l'origine ici (vers le bas de l'article). Notez que cet article explique également comment attribuer explicitement plusieurs adresses à une interface à l'aide des fonctionnalités CentOS / Red Hat que je ne connaissais pas auparavant.


Cool! J'ai essayé cela avec IPv6 sur Ubuntu (Lucid & Hardy) sans aucune chance. Je pense que ce serait une fonctionnalité décourageante pour IPv6 - vous pouvez mapper des adresses, créer des objets de base de données ou utiliser des adresses comme identifiants de session.
Gerald Combs du

2
Non, vous ne devez pas ajouter d'adresse à lo. Au lieu de cela, ajoutez un itinéraire: ip -6 route add local <ip> dev lo.
Navin

2

Je vois donc quelques options ici:

  1. utiliser un script pour lier les adresses à l'interface individuellement

  2. acheminez le bloc souhaité vers l'adresse unique de votre machine, puis demandez à cette machine d'utiliser l'interface pcap pour intercepter tout le trafic pour ce bloc (comme s'il s'agissait d'un routeur) et le gérer.

  3. Vous pouvez jouer des astuces avec les règles NAT pour réécrire ensuite un bloc d'Ips qui ont été routés vers une machine en une seule IP interne sur cette machine ... mais vous vous retrouverez toujours avec une IP interne par IP que vous voulez vraiment payer attention à ce qui vous ramène à la solution 1.

Si j'étais vous, j'écrirais simplement le petit script dans l'option 1. Ou utiliser celui d' ici :

#!/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

où un tel script serait-il nommé?
Skaperen

2

Comme d'autres l'ont dit, vous pouvez utiliser le mécanisme AnyIP pour router les paquets arrivant pour un sous-réseau entier vers l'interface localhost, mais gardez à l'esprit que vous devrez également demander à votre routeur en amont de router tous les paquets souhaités vers cette machine dans la première place. Cela peut être fait simplement avec des entrées de table de routage sur le routeur, ou via BGP. ARP n'est pas vraiment approprié étant donné que votre machine devra ARP pour chaque IP individuellement.


1

Le "Anyip" décrit ci-dessus n'a pas fonctionné pour moi sur centos 7. J'ai dû créer un script pour créer manuellement des adresses ipv6 au démarrage. Pour ce faire, j'ai ajouté ce qui suit à / etc / crontab:

@reboot root /path/to/bashscript

Voici le script bash pour créer environ 3000 adresses 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!"

Cette méthode ne fonctionne que jusqu'à ce que vous atteigniez environ 4000 adresses. Si vous essayez de configurer plus d'adresses que cela ne fonctionnera pas. Il existe des scénarios où il est souhaitable d'affecter un / 96 ou / 64 entier à un seul hôte, il n'y a aucun moyen que votre méthode évolue aussi loin.
kasperd

@kasperd où avez-vous pu faire fonctionner le soi-disant mécanisme anyip "décrit" par Gerald Combs ci-dessus sur Centos 7 ou Debian 8?
Nicolas Guérinet

1
Oui, ça marche. Mais il y a quelques étapes de plus que celles mentionnées dans cette réponse. Voir ma réponse à une question similaire.
kasperd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.