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


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, etwas auf IPv6 aufzubauen, und es wäre wirklich nützlich, einen ganzen Block von Adressen (z. B. a / 64) verfügbar zu haben, so dass Programme irgendeine Adresse aus dem Bereich und auswählen könnten bind daran. Unnötig zu erwähnen, dass das Hinzufügen jeder IP aus diesem Bereich zu einer Schnittstelle eine Weile dauern würde.

Unterstützt Linux die Bindung eines ganzen Adressblocks an eine Schnittstelle?


25
2017-12-05 00:27


Ursprung


Verschiedene Distributionen haben unterschiedliche Möglichkeiten, dies zu handhaben. Wähle eins. - Ignacio Vazquez-Abrams
Ubuntu gerade jetzt, aber Lösungen, die über Distributionen hinweg arbeiten, werden natürlich bevorzugt. - p-static
Dieses Tutorial bindet eine einzelne Adresse innerhalb eines Blocks (/ 24). Das / 24 gibt nur an, in welchem ​​Block es sich befindet. Es sollte für IPv6 identisch funktionieren. - BillThor
Cross-Distro wäre, ein Skript zu schreiben, das "ip addr add" verwendet. Red Hat, Ubuntu und SuSE haben verschiedene Netzwerk-Skripte ... - Sean Reifschneider
@ChandraNakka ist diese nützlich für dich? - kasperd


Antworten:


Linux 2.6.37 und höher unterstützt dies über ein Feature namens AnyIP. Zum Beispiel wenn ich renne

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

Auf einem Ubuntu 11.04-Rechner akzeptiert er Verbindungen an jeder Adresse im 2001: db8 :: / 32-Netzwerk.


30
2018-04-21 20:30



Gibt es eine AnyIP-Lösung für ipv4? - Coaku
Arbeitet es unter Ubuntu 14.04? - Chandra Nakka
Dies scheint zu funktionieren und ich kann den Bereich der Adressen pingen, aber wenn ich laufe ip route list oder ip -6 route list Die hinzugefügte Route ist nicht sichtbar. Wie würden Sie einen AnyIP-Adressblock aufzählen? - Colton
Dies funktioniert für die Adressen lokal, aber ich kann nicht pingen oder auf diese IPs von externen Quellen 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 Sie erhalten ein Präfix von Ihrem Provider - Arya


Ja, Linux unterstützt das Binden eines Netzwerkadressenblocks an eine Netzwerkschnittstelle ... aber nur an der Loopback-Schnittstelle. So können Sie das tun:

ip addr add 192.168.5.0/24 dev lo

Und dann tu 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 es auf die gleiche Weise funktioniert.

Ich habe das ursprünglich gelesen Hier (zum Ende des Artikels). Beachten Sie, dass in diesem Artikel auch erläutert wird, wie Sie mithilfe von CentOS / Red Hat-Funktionen, die ich vorher nicht kannte, einer Schnittstelle explizit mehrere Adressen zuweisen.


6
2017-12-07 16:44



Cool! Ich habe dies mit IPv6 auf Ubuntu (Lucid & Hardy) ohne Glück versucht. Ich denke, das wäre eine mörderische Funktion für IPv6 - Sie könnten Adressen Datenbankobjekte zuordnen oder Adressen als Sitzungs-IDs verwenden. - Gerald Combs
Nein, du solltest keine Adresse zu lo hinzufügen. Fügen Sie stattdessen eine Route hinzu: ip -6 route add local <ip> dev lo. - Navin


Also sehe ich hier ein paar Optionen:

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

  2. routen Sie den gewünschten Block an die einzelne Adresse Ihres Rechners, und lassen Sie dann diesen Rechner die pcap-Schnittstelle verwenden, um den gesamten Datenverkehr für diesen Block (als wäre es ein Router) abzufangen und damit umzugehen.

  3. Man könnte durchaus Tricks mit NAT-Regeln spielen, um dann einen Block von Ips, die auf einen Rechner geroutet wurden, in eine einzige interne IP auf diesem Rechner umzuschreiben ... aber du erhältst immer noch eine interne IP pro IP, die du wirklich bezahlen willst Aufmerksamkeit, die dich zurück zur Lösung bringt 1.

Wenn ich Sie wäre, würde ich nur das kleine Skript in Option 1 schreiben 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

2
2017-12-07 16:25



Wo würde ein solches Skript benannt werden? - Skaperen


Wie andere bereits gesagt haben, können Sie den AnyIP-Mechanismus verwenden, um ankommende Pakete für ein ganzes Subnetz an die Localhost-Schnittstelle zu leiten. Beachten Sie jedoch, dass Sie auch Ihren Upstream-Router dazu veranlassen müssen, alle gewünschten Pakete an diesen Rechner zu leiten der erste Ort. Dies kann einfach mit Routing-Tabelleneinträgen auf dem Router oder über BGP geschehen. ARP ist nicht wirklich angemessen, da Ihre Maschine für jede einzelne IP ARP ARP muss.


2
2017-10-05 19:12





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

@reboot root /path/to/bashscript

Hier ist das Bash-Skript, um ungefähr 3000 IPv6-Adressen zu erstellen:

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

0
2018-01-24 11:57



Diese Methode funktioniert nur, bis Sie ungefähr 4000 Adressen erreichen. Wenn Sie versuchen, mehr Adressen als das zu konfigurieren, wird es nicht funktionieren. Es gibt Szenarien, in denen es wünschenswert ist, einem einzelnen Host ein ganzes / 96 oder / 64 zuzuweisen, es gibt keine Möglichkeit, dass Ihre Methode so weit skaliert. - kasperd
@ Kasperd, wo Sie in der Lage sind, den so genannten Anyip-Mechanismus, der von Gerald Combs beschrieben wurde, auf Centos 7 oder Debian 8 zu schreiben? - Nicolas Guérinet
Ja, das funktioniert. Aber es gibt ein paar mehr Schritte als in dieser Antwort erwähnt. Sehen meine Antwort zu einer ähnlichen Frage. - kasperd