Posso associare un blocco (grande) di indirizzi a un'interfaccia?


26

So che lo strumento ip consente di associare più indirizzi a un'interfaccia (ad esempio, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). In questo momento, però, sto cercando di costruire qualcosa su IPv6 e sarebbe davvero utile avere un intero blocco di indirizzi (diciamo, un / 64) disponibile, in modo che i programmi possano scegliere qualsiasi indirizzo dall'intervallo e si legano a quello. Inutile dire che collegare ogni IP da questo intervallo a un'interfaccia richiederebbe un po 'di tempo.

Linux supporta l'associazione di un intero blocco di indirizzi a un'interfaccia?


Diverse distro hanno modi diversi di gestirlo. Sceglierne uno.
Ignacio Vazquez-Abrams,

Ubuntu in questo momento, ma le soluzioni che funzionano attraverso le distro sono preferite, ovviamente.
p-static

Questo tutorial associa un singolo indirizzo all'interno di un blocco (/ 24). / 24 specifica solo in quale blocco si trova. Dovrebbe funzionare in modo identico per IPv6.
BillThor il

Cross-distro sarebbe scrivere uno script che utilizza "ip addr add". Red Hat, Ubuntu e SuSE hanno diversi script di rete ...
Sean Reifschneider,

1
@ChandraNakka È questo utile a voi?
Kasperd,

Risposte:


31

Linux 2.6.37 e versioni successive lo supportano tramite una funzione chiamata AnyIP . Ad esempio se corro

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

su una macchina Ubuntu 11.04 accetterà connessioni su qualsiasi indirizzo nella rete 2001: db8 :: / 32.


1
Esiste una soluzione AnyIP per ipv4?
Coaku,

Funziona su Ubuntu 14.04?
Chandra Nakka,

Questo sembra funzionare e posso eseguire il ping dell'intervallo di indirizzi ma quando corro ip route listo ip -6 route listil percorso aggiunto non è visibile. Come enumereresti un blocco di indirizzi AnyIP?
Colton,

Questo funziona per gli indirizzi localmente ma non riesco a eseguire il ping o ad accedere a questi IP da fonti esterne. Un modo per risolverlo? (Ho provato a sostituire lo con eth0 ma poi nulla è raggiungibile)
BrainStone,

@BrainStone devi installare ndppd per questo, o ottenere un prefisso instradato dal tuo provider
Arya,

6

Sì, Linux supporta l'associazione di un blocco di indirizzi di rete a un'interfaccia di rete ... ma solo sull'interfaccia di loopback. Quindi puoi farlo:

ip addr add 192.168.5.0/24 dev lo

E quindi fai questo:

$ 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 i percorsi appropriati in atto questo farà quello che vuoi ... per gli indirizzi IPv4. Hai chiesto informazioni su IPv6 e non ho alcuna esperienza con IPv6, ma ci sono buone probabilità che funzioni allo stesso modo.

Inizialmente ho letto di questo qui (verso il fondo dell'articolo). Si noti che questo articolo illustra anche come assegnare esplicitamente più indirizzi a un'interfaccia utilizzando le funzioni CentOS / Red Hat di cui non avevo mai sentito parlare.


Freddo! L'ho provato con IPv6 su Ubuntu (Lucid & Hardy) senza fortuna. Penso che questa sarebbe una caratteristica killer per IPv6: potresti mappare gli indirizzi con oggetti di database o usare gli indirizzi come ID di sessione.
Gerald Combs,

2
No, non dovresti aggiungere un indirizzo a lo. Invece, aggiungere una rotta: ip -6 route add local <ip> dev lo.
Navin,

2

Quindi vedo alcune opzioni qui:

  1. utilizzare uno script per associare tutti gli indirizzi all'interfaccia singolarmente

  2. instradare il blocco desiderato al singolo indirizzo della macchina, quindi fare in modo che quella macchina utilizzi l'interfaccia pcap per intercettare tutto il traffico per quel blocco (come se fosse un router) e gestirlo.

  3. Potresti giocare in maniera concreta con le regole NAT per riscrivere un blocco di Ips che sono stati instradati verso una macchina in un singolo IP interno su quella macchina ... ma finirai comunque con un IP interno per IP che vuoi davvero pagare attenzione a, che ti riporta alla soluzione 1.

Se fossi in te, scriverei il piccolo script nell'opzione 1. O userei quello da qui :

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

dove si chiamerebbe un tale script?
Skaperen,

2

Come altri hanno già detto, puoi utilizzare il meccanismo AnyIP per instradare i pacchetti in arrivo per un'intera sottorete all'interfaccia localhost, ma tieni presente che dovrai anche avere il router upstream per instradare tutti i pacchetti desiderati su questa macchina in il primo posto. Questo può essere fatto semplicemente con le voci della tabella di routing sul router o tramite BGP. ARP non è davvero appropriato dato che la tua macchina dovrebbe ARP per ogni IP individualmente.


1

"Anyip" sopra descritto non ha funzionato per me su centos 7. Ho dovuto creare uno script per creare manualmente gli indirizzi ipv6 all'avvio. Per fare ciò ho aggiunto quanto segue a / etc / crontab:

@reboot root /path/to/bashscript

Ecco lo script bash per creare circa 3000 indirizzi 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!"

Questo metodo funziona solo fino a raggiungere circa 4000 indirizzi. Se provi a configurare più indirizzi di quelli non funzionerà. Esistono scenari in cui è preferibile assegnare un intero / 96 o / 64 a un singolo host, non è possibile che il metodo venga ridimensionato così lontano.
Kasperd,

@kasperd dove sei riuscito a far funzionare il cosiddetto meccanismo anyip "descritto" da Gerald Combs sopra su Centos 7 o Debian 8?
Nicolas Guérinet,

1
Sì, funziona. Ma ci sono alcuni passaggi in più rispetto a quelli menzionati in quella risposta. Vedi la mia risposta a una domanda simile.
Kasperd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.