Jak zarejestrować dużą liczbę adresów IP w Debianie/Ubuntu?
Pojedynczy serwer często potrzebuje więcej niż jednego adresu IP. Ten przewodnik opisuje dwa sposoby przypisania wielu adresów IPv4 do jednego interfejsu sieciowego w systemach Debian i Ubuntu:
- automatycznie, za pomocą skryptu powłoki i usługi systemd, zalecane dla dużych zakresów;
- bezpośrednio w netplan, zalecane, gdy adresy mają przetrwać rekonfigurację sieci, a nie tylko ponowne uruchomienie.
Obie metody sprawiają, że konfiguracja jest trwała po ponownym uruchomieniu. Przeczytaj uwagę na końcu każdej metody, aby wybrać tę odpowiednią dla swojego przypadku.
Kiedy potrzebujesz wielu adresów IP
Kilka typowych zastosowań na pojedynczym serwerze wymaga więcej niż jednego adresu publicznego:
- Serwery pocztowe, które używają osobnych adresów i rekordów PTR, aby oddzielić reputację wysyłki różnych domen.
- Serwery WWW, które wymagają dedykowanych adresów dla starszych aplikacji, izolacji klientów lub określonych zasad zapory.
- Infrastruktura proxy i VPN, w której każda instancja proxy lub każdy punkt końcowy VPN jest powiązany z własnym adresem publicznym.
- Kontenery lub maszyny wirtualne używające trasowanych adresów IP.
Plany VPS firmy INTROSERV domyślnie obejmują dwa adresy IPv4 oraz podsieć IPv6 /112. Dodatkowe adresy IPv4 są dostępne w wielu lokalizacjach. Sprawdź dostępność dla swojego regionu w konfiguratorze zamówień.
Zanim zaczniesz
Potrzebujesz dostępu root oraz nazwy interfejsu, który będzie przenosił dodatkowe adresy. Nowoczesne wersje Debiana i Ubuntu nie używają już starej nazwy eth0, więc nie zakładaj jej z góry. Wyświetl interfejsy wraz z ich bieżącymi adresami i ustal ten, który ma już Twój adres podstawowy:
ip -br addr show
Dane wyjściowe pokazują wpisy takie jak ens3, enp1s0 lub eth0 obok adresów już na nich skonfigurowanych. Interfejs, który ma już Twój główny adres IP, to ten, którego należy użyć w poniższych krokach. W przykładach używamy ens3.
Ostrzeżenie: Te kroki zmieniają konfigurację sieci na serwerze, do którego najprawdopodobniej łączysz się przez SSH. Błąd może odciąć Ci własny dostęp. Jeśli to możliwe, zachowaj drugą drogę wejścia, taką jak konsola dostawcy lub IP-KVM, i preferuj pokazane poniżej opcje bezpiecznego stosowania zmian.
Tworzenie skryptu adresów
Krótki skrypt dodaje zakres adresów w jednym przebiegu. Utwórz go w /usr/local/sbin:
nano /usr/local/sbin/extra-ips.sh
Wklej poniższy skrypt. Zastąp nazwę interfejsu, prefiks i zakres blokiem przydzielonym Tobie. Adresy poniżej używają zakresu dokumentacyjnego z RFC 5737 i są wartościami zastępczymi:
#!/bin/bash set -euo pipefail # Interfejs, ktory bedzie przenosil dodatkowe adresy. IFACE="ens3" # Wspolny prefiks oraz pierwsza i ostatnia wartosc oktetu hosta. # Zastap je blokiem przydzielonym Tobie. PREFIX="203.0.113" FIRST=10 LAST=60 # Zatrzymaj sie wczesnie z czytelnym komunikatem, jesli nazwa interfejsu jest bledna. if ! ip link show "$IFACE" >/dev/null 2>&1; then echo "Nie znaleziono interfejsu $IFACE. Sprawdz nazwe poleceniem: ip -br addr show" >&2 exit 1 fi for HOST in $(seq "$FIRST" "$LAST"); do ip addr replace "${PREFIX}.${HOST}/32" dev "$IFACE" done
Info: Adresy używają prefiksu /32 celowo. Interfejs podstawowy ma już trasę dla swojej podsieci, więc każdy adres dodatkowy potrzebuje jedynie lokalnej trasy hosta. Prefiks /32 zapobiega dodawaniu przez jądro zduplikowanej trasy podsieci i utrzymuje tablicę routingu w czystości. Skrypt używaip addr replacezamiastip addr add, dzięki czemu można go bezpiecznie uruchomić ponownie bez zgłaszania błędu dla adresów, które już istnieją.
Nadaj skryptowi uprawnienia do wykonywania. Zwróć uwagę na pełną ścieżkę, której brakowało w poprzedniej wersji tego przewodnika:
chmod +x /usr/local/sbin/extra-ips.sh
Utrwalanie adresów za pomocą usługi systemd
Ręczne uruchomienie skryptu dodaje adresy tylko do następnego ponownego uruchomienia. Aby stosować je automatycznie przy starcie, utwórz usługę systemd, która uruchamia skrypt podczas rozruchu. Ta metoda działa tak samo, niezależnie od tego, czy system używa netplan, systemd-networkd czy starszego stosu ifupdown.
Utwórz plik jednostki:
nano /etc/systemd/system/extra-ips.service
Dodaj poniższą zawartość:
[Unit] Description=Assign additional IP addresses After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/local/sbin/extra-ips.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
Przeładuj systemd i włącz usługę, aby uruchamiała się teraz oraz przy każdym rozruchu:
systemctl daemon-reload systemctl enable --now extra-ips.service
Potwierdź, że usługa uruchomiła się poprawnie:
systemctl status --no-pager extra-ips.service
Ostrzeżenie: Adresy dodane przez ten skrypt nie są częścią konfiguracji netplan ani systemd-networkd. Późniejszenetplan apply,networkctl reconfigurelub dowolne ponowne uruchomienie sieci może je usunąć. Wracają przy następnym rozruchu lub natychmiast po uruchomieniusystemctl restart extra-ips.service. Jeśli adresy mają pozostać również po rekonfiguracji sieci, użyj zamiast tego metody netplan opisanej poniżej.
Alternatywa: definiowanie adresów w netplan
W Ubuntu, gdzie netplan jest rozwiązaniem domyślnym, adresy można zadeklarować bezpośrednio w netplan. Stos sieciowy traktuje je wówczas jako adresy zarządzane, więc przetrwają rekonfigurację. Nadaje się to do małej, stałej listy. Dla dużego zakresu usługa systemd opisana powyżej skaluje się lepiej, ponieważ netplan wymaga jednej linii na adres.
Gdy wiele plików netplan definiuje ten sam interfejs, ich ustawienia mogą się nadpisywać lub łączyć w nieoczekiwany sposób, co może usunąć Twój adres podstawowy i odciąć dostęp. Edycja istniejącego pliku konfiguracyjnego jest zwykle bezpieczniejsza niż tworzenie kolejnego pliku dla tego samego interfejsu. Otwórz plik, który już konfiguruje Twój interfejs, zazwyczaj /etc/netplan/50-cloud-init.yaml lub /etc/netplan/00-installer-config.yaml:
ls /etc/netplan/ nano /etc/netplan/50-cloud-init.yaml
Zachowaj wszystkie istniejące ustawienia interfejsu, takie jak dhcp4, adres podstawowy, bramę i serwery nazw. Dodaj dodatkowe adresy pod listą addresses na tym samym interfejsie. Poniższy przykład zachowuje DHCP dla adresu podstawowego i dodaje trzy adresy dodatkowe:
network: version: 2 ethernets: ens3: dhcp4: true addresses: - 203.0.113.10/32 - 203.0.113.11/32 - 203.0.113.12/32
Nowsze wersje netplan ostrzegają, jeśli plik jest czytelny dla innych użytkowników. Ogranicz uprawnienia, aby usunąć to ostrzeżenie:
chmod 600 /etc/netplan/50-cloud-init.yaml
Przetestuj zmianę za pomocą netplan try. Stosuje on konfigurację i automatycznie ją wycofuje po 120 sekundach, jeśli jej nie potwierdzisz, co chroni Cię przed utratą zdalnego dostępu:
netplan try
Jeśli połączenie pozostaje aktywne i wszystko wygląda poprawnie, potwierdź po wyświetleniu monitu, a następnie zastosuj konfigurację na stałe:
netplan apply
Weryfikacja wyniku
Wyświetl adresy aktualnie powiązane z interfejsem i potwierdź, że nowe są obecne:
ip -br addr show ens3
Dodatkowe adresy powinny teraz pojawić się w danych wyjściowych i będą automatycznie przywracane po każdym ponownym uruchomieniu.
Usuwanie adresów
Aby usunąć pojedynczy adres, usuń go z interfejsu:
ip addr del 203.0.113.10/32 dev ens3
Jeśli użyłeś skryptu i usługi, zatrzymaj przypisywanie całego zakresu przy rozruchu, wyłączając i usuwając usługę:
systemctl disable --now extra-ips.service rm /etc/systemd/system/extra-ips.service systemctl daemon-reload
Jeśli użyłeś netplan, usuń dodatkowe linie z listy addresses w pliku netplan, a następnie uruchom netplan apply.
Rozwiązywanie problemów
Jeśli usługa się nie uruchamia, sprawdź jej stan i logi:
systemctl status --no-pager extra-ips.service journalctl -u extra-ips.service
Potwierdź następujące kwestie:
- nazwa interfejsu w skrypcie odpowiada rzeczywistej nazwie z
ip -br addr show; - adresy należą do bloku przydzielonego Tobie;
- skrypt ma uprawnienia do wykonywania.
Jeśli przez pomyłkę użyłeś prefiksu /24 zamiast /32, tablica routingu pokaże ten objaw w postaci kilku zduplikowanych tras podsieci. Sprawdź ją za pomocą:
ip route
Ten przewodnik koncentruje się na IPv4. Podobnie jak w przypadku IPv4, dodatkowe adresy IPv6 są zwykle dodawane jako adresy hosta z prefiksem /128, przy użyciu tego samego polecenia ip addr replace, na przykład ip addr replace 2001:db8::10/128 dev ens3.