Kann ich einen (großen) Adressblock an eine Schnittstelle binden?

26

Ich weiß, dass Sie mit dem IP-Tool mehrere Adressen an eine Schnittstelle binden können (z . B. http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). Im Moment versuche ich jedoch, etwas auf IPv6 aufzubauen, und es wäre sehr nützlich, einen ganzen Adressblock (z. B. a / 64) zur Verfügung zu haben, damit Programme eine beliebige Adresse aus dem Bereich und auswählen können daran binden. Es erübrigt sich zu erwähnen, dass das Anschließen jeder IP-Adresse aus diesem Bereich an eine Schnittstelle eine Weile dauern würde.

Unterstützt Linux das Binden eines ganzen Adressblocks an eine Schnittstelle?

p-statisch
quelle
Verschiedene Distributionen haben unterschiedliche Möglichkeiten, damit umzugehen. Wähle eins.
Ignacio Vazquez-Abrams
Ubuntu im Moment, aber Lösungen, die über Distributionen hinweg funktionieren, werden natürlich bevorzugt.
p-static
Dieses Tutorial bindet eine einzelne Adresse innerhalb eines Blocks (/ 24). Die / 24 gibt nur an, in welchem ​​Block sie sich befindet. Sie sollte für IPv6 identisch funktionieren.
BillThor
Cross-Distribution wäre, ein Skript zu schreiben, das "ip addr add" verwendet. Red Hat, Ubuntu und SuSE haben unterschiedliche Netzwerkskripte ...
Sean Reifschneider
1
@ChandraNakka Ist das nützlich für Sie?
Kasperd

Antworten:

31

Linux 2.6.37 und höher unterstützt dies über eine Funktion namens AnyIP . Zum Beispiel, wenn ich renne

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

Auf einem Ubuntu 11.04-Computer werden Verbindungen mit einer beliebigen Adresse im 2001: db8 :: / 32-Netzwerk akzeptiert.

Gerald Combs
quelle
1
Gibt es eine AnyIP-Lösung für ipv4?
Coaku
Funktioniert es unter Ubuntu 14.04?
Chandra Nakka
Dies scheint zu funktionieren und ich kann den Adressbereich anpingen, aber wenn ich renne ip route listoder ip -6 route listdie hinzugefügte Route nicht sichtbar ist. Wie würden Sie einen AnyIP-Adressblock aufzählen?
Colton
Dies funktioniert für die Adressen lokal, aber ich kann diese IPs nicht von externen Quellen aus anpingen oder darauf zugreifen. Irgendeine Möglichkeit, das zu beheben? (Ich habe versucht, lo durch eth0 zu ersetzen, aber dann ist nichts erreichbar)
BrainStone
@BrainStone Sie müssen ndppd dafür installieren oder ein Präfix von Ihrem Provider erhalten
Arya
6

Ja, Linux unterstützt das Binden eines Blocks von Netzwerkadressen an eine Netzwerkschnittstelle, jedoch nur an die Loopback-Schnittstelle. So können Sie dies tun:

ip addr add 192.168.5.0/24 dev lo

Und dann mach das:

$ 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

Mit den entsprechenden Routen wird dies tun, was Sie wollen ... für IPv4-Adressen. Sie haben nach IPv6 gefragt, und ich habe keine Erfahrung mit IPv6, aber es besteht eine gute Chance, dass dies genauso funktioniert.

Ich las ursprünglich diese etwa hier ( in Richtung der Unterseite des Artikels). Beachten Sie, dass in diesem Artikel auch das explizite Zuweisen mehrerer Adressen zu einer Schnittstelle mithilfe von CentOS / Red Hat-Funktionen erläutert wird, über die ich zuvor nichts gewusst hatte.

larsks
quelle
Cool! Ich habe dies mit IPv6 unter Ubuntu (Lucid & Hardy) ohne Glück versucht. Ich denke, dies wäre ein Killer-Feature für IPv6 - Sie könnten Adressen für Datenbankobjekte zuordnen oder Adressen als Sitzungs-IDs verwenden.
Gerald Combs
2
Nein, Sie sollten lo keine Adresse hinzufügen. Stattdessen fügen Sie eine Route: ip -6 route add local <ip> dev lo.
Navin
2

Daher sehe ich hier einige Optionen:

  1. Verwenden Sie ein Skript, um alle Adressen einzeln an die Schnittstelle zu binden

  2. Leiten Sie den gewünschten Block an die einzelne Adresse Ihres Computers und lassen Sie diesen Computer die pcap-Schnittstelle verwenden, um den gesamten Datenverkehr für diesen Block (als wäre es ein Router) abzufangen und zu verarbeiten.

  3. Sie können durchaus Tricks mit NAT-Regeln spielen, um dann einen IP-Block, der an einen Computer weitergeleitet wurde, in eine einzelne interne IP auf diesem Computer umzuschreiben. Am Ende erhalten Sie jedoch immer noch eine interne IP pro IP, die Sie wirklich bezahlen möchten Aufmerksamkeit auf, die Sie zurück zu Lösung 1 bringt.

Wenn ich Sie wäre, würde ich einfach das kleine Skript in Option 1 schreiben. Oder verwenden Sie das von hier :

#!/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
quelle
wo würde ein solches Drehbuch heißen?
Skaperen
2

Wie bereits erwähnt, können Sie den AnyIP-Mechanismus verwenden, um ankommende Pakete für ein gesamtes Subnetz an die localhost-Schnittstelle weiterzuleiten. Beachten Sie jedoch, dass Sie auch Ihren Upstream-Router benötigen, um alle gewünschten Pakete an diesen Computer weiterzuleiten den ersten Platz. Dies kann einfach mit Routing-Tabelleneinträgen auf dem Router oder über BGP erfolgen. ARP ist nicht wirklich angemessen, da Ihr Computer für jede IP einzeln ARP ausführen müsste.

Kyle Rose
quelle
1

Das oben beschriebene "Anyip" funktionierte auf Centos 7 nicht. Ich musste ein Skript erstellen, um beim Booten manuell IPv6-Adressen zu erstellen. Dazu habe ich Folgendes zu / etc / crontab hinzugefügt:

@reboot root /path/to/bashscript

Hier ist das Bash-Skript zum Erstellen von ungefähr 3000 IPv6-Adressen:

#!/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
quelle
Diese Methode funktioniert nur, bis Sie ungefähr 4000 Adressen erreichen. Wenn Sie versuchen, mehr Adressen zu konfigurieren, funktioniert dies nicht. Es gibt Szenarien, in denen es wünschenswert ist, einem einzelnen Host eine ganze / 96 oder / 64 zuzuweisen. Es gibt keine Möglichkeit, Ihre Methode so weit zu skalieren.
Kasperd
@kasperd, wo Sie den von Gerald Combs oben beschriebenen so genannten Anyip-Mechanismus für Centos 7 oder Debian 8 verwenden können?
Nicolas Guérinet
1
Ja das funktioniert Aber es gibt ein paar Schritte mehr als in dieser Antwort erwähnt. Siehe meine Antwort auf eine ähnliche Frage.
Kasperd