Czy mogę powiązać (duży) blok adresów z interfejsem?


26

Wiem, że narzędzie ip pozwala powiązać wiele adresów z interfejsem (np. Http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). W tej chwili jednak staram się zbudować coś na bazie IPv6 i bardzo przydatny byłby cały blok adresów (powiedzmy a / 64), aby programy mogły wybrać dowolny adres z zakresu i związać się z tym. Nie trzeba dodawać, że dołączenie każdego adresu IP z tego zakresu do interfejsu zajęłoby trochę czasu.

Czy Linux obsługuje wiązanie całego bloku adresów z interfejsem?


Różne dystrybucje mają różne sposoby radzenia sobie z tym. Wybierz jedno.
Ignacio Vazquez-Abrams,

Ubuntu w tej chwili, ale oczywiście preferowane są rozwiązania działające w różnych dystrybucjach.
p-statyczny

Ten poradnik wiąże pojedynczy adres w bloku (/ 24). / 24 tylko określa, w którym bloku jest. Powinien działać identycznie dla IPv6.
BillThor

Cross-distro byłoby napisanie skryptu, który używa „ip addr add”. Red Hat, Ubuntu i SuSE mają różne skrypty sieciowe ...
Sean Reifschneider,

1
@ChandraNakka Czy to ci się przydaje?
kasperd

Odpowiedzi:


31

Linux 2.6.37 i nowsze wersje obsługują tę funkcję za pomocą AnyIP . Na przykład, jeśli uruchomię

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

na komputerze Ubuntu 11.04 będzie akceptować połączenia pod dowolnym adresem w sieci 2001: db8 :: / 32.


1
Czy istnieje jakieś rozwiązanie AnyIP dla ipv4?
Coaku

Czy to działa na Ubuntu 14.04?
Chandra Nakka

Wydaje się, że to działa i mogę pingować zakres adresów, ale gdy uruchomię ip route listlub ip -6 route listdodana trasa nie będzie widoczna. Jak wyliczyć blok adresu AnyIP?
Colton

Działa to lokalnie z adresami, ale nie mogę pingować ani uzyskiwać dostępu do tych adresów IP ze źródeł zewnętrznych. Jakiś sposób to naprawić? (Próbowałem zamienić lo na eth0, ale wtedy nic nie jest osiągalne)
BrainStone

@BrainStone, w tym celu musisz zainstalować ndppd lub otrzymać prefiks od swojego dostawcy
Arya

6

Tak, Linux obsługuje wiązanie bloku adresów sieciowych z interfejsem sieciowym ... ale tylko w interfejsie sprzężenia zwrotnego. Możesz to zrobić:

ip addr add 192.168.5.0/24 dev lo

A następnie zrób to:

$ 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

Przy odpowiednich trasach zrobi to, co chcesz ... dla adresów IPv4. Pytałeś o IPv6, a ja nie mam żadnego doświadczenia z IPv6, ale jest spora szansa, że ​​zadziała w ten sam sposób.

Oryginalnie czytałem o tym tutaj (na dole artykułu). Zauważ, że w tym artykule omówiono także jawne przypisywanie wielu adresów do interfejsu za pomocą funkcji CentOS / Red Hat, o których wcześniej nie wiedziałem.


Fajne! Próbowałem tego z IPv6 na Ubuntu (Lucid i Hardy) bez powodzenia. Myślę, że byłaby to funkcja zabójcza dla IPv6 - możesz mapować adresy, wykonywać obiekty bazy danych lub używać adresów jako identyfikatorów sesji.
Gerald Combs,

2
Nie, nie powinieneś dodawać adresu do lo. Zamiast dodawać trasy: ip -6 route add local <ip> dev lo.
Navin

2

Widzę więc kilka opcji tutaj:

  1. użyj skryptu, aby indywidualnie powiązać adresy z interfejsem

  2. przekieruj żądany blok do pojedynczego adresu komputera, a następnie pozwól temu urządzeniu użyć interfejsu pcap, aby przechwycić cały ruch dla tego bloku (tak jakby to był router) i go obsłużyć.

  3. Możesz grać w sztuczki z regułami NAT, a następnie przepisać blok Ips, który został przekierowany do jednego komputera do jednego wewnętrznego adresu IP na tym komputerze ... ale nadal będziesz mieć jeden wewnętrzny adres IP na adres IP, który naprawdę chcesz zapłacić uwaga, która wróci do rozwiązania 1.

Na twoim miejscu napisałbym mały skrypt w opcji 1. Lub użyj tego z tego miejsca :

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

skąd nazwa takiego skryptu?
Skaperen

2

Jak powiedzieli inni, możesz użyć mechanizmu AnyIP, aby skierować przychodzące pakiety dla całej podsieci do interfejsu localhost, ale pamiętaj, że musisz również poprosić router nadrzędny, aby skierował wszystkie pożądane pakiety do tego komputera w pierwsze miejsce. Można to zrobić po prostu za pomocą wpisów w tablicy routingu na routerze lub przez BGP. ARP nie jest tak naprawdę właściwe, biorąc pod uwagę, że twoja maszyna musiałaby ARP dla każdego adresu IP indywidualnie.


1

„Anyip” opisany powyżej nie działał dla mnie na centos 7. Musiałem utworzyć skrypt, aby ręcznie utworzyć adresy IPv6 podczas rozruchu. Aby to zrobić, dodałem następujące pliki do / etc / crontab:

@reboot root /path/to/bashscript

Oto skrypt bash do utworzenia około 3000 adresów 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!"

Ta metoda działa tylko do momentu uzyskania około 4000 adresów. Jeśli spróbujesz skonfigurować więcej adresów, to nie zadziała. Istnieją scenariusze, w których pożądane jest przypisanie całego / 96 lub / 64 do jednego hosta, nie ma możliwości, aby Twoja metoda skalowała się tak daleko.
kasperd

@kasperd, gdzie możesz zrobić tak zwany mechanizm anyip „opisany” przez Geralda Combs powyżej pracy na Centos 7 lub Debian 8?
Nicolas Guérinet

1
Tak, to działa. Ale jest kilka kroków więcej niż wspomniane w tej odpowiedzi. Zobacz moją odpowiedź na podobne pytanie.
kasperd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.