Jak zarejestrować dużą liczbę adresów IP w Debianie/Ubuntu?
Pojedynczy serwer często potrzebuje więcej niż jednego adresu IP. Ten przewodnik wyjaśnia dwa sposoby przypisania wielu adresów IPv4 do jednego interfejsu sieciowego w Debianie 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 muszą przetrwać zarówno rekonfigurację sieci, jak i ponowne uruchomienie.
Obie metody sprawiają, że konfiguracja jest trwała między ponownymi uruchomieniami. Przeczytaj uwagę na końcu każdej metody, aby wybrać tę, która pasuje do twojego przypadku.
Kiedy potrzebujesz wielu adresów IP
Kilka typowych scenariuszy na pojedynczym serwerze wymaga więcej niż jednego publicznego adresu:
- Serwery pocztowe, które używają osobnych adresów i rekordów PTR, aby odizolować reputację wysyłkową różnych domen.
- Serwery WWW, które wymagają dedykowanych adresów dla starszych aplikacji, izolacji klientów lub konkretnych zasad zapory sieciowej.
- Infrastruktura proxy i VPN, w której każda instancja proxy lub punkt końcowy VPN jest powiązany z własnym publicznym adresem.
- Kontenery lub maszyny wirtualne korzystające z trasowanych adresów IP.
Plany VPS INTROSERV domyślnie obejmują dwa adresy IPv4 oraz podsieć IPv6 /112. Dodatkowe adresy IPv4 są dostępne w wielu lokalizacjach. Sprawdź dostępność dla wybranego regionu w konfiguratorze zamówienia.
Zanim zaczniesz
Potrzebujesz dostępu root oraz nazwy interfejsu, który będzie obsługiwał 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 listę interfejsów wraz z ich bieżącymi adresami i zidentyfikuj ten, który już zawiera twój główny adres:
ip -br addr show
Wynik pokazuje wpisy takie jak ens3, enp1s0 czy eth0 obok adresów już na nich skonfigurowanych. Interfejs, który już obsługuje twój główny adres IP, to ten, którego należy użyć w poniższych krokach. Przykłady tutaj wykorzystują ens3.
Te kroki zmieniają konfigurację sieci na serwerze, do którego najprawdopodobniej łączysz się przez SSH. Błąd może odciąć twój własny dostęp. Zachowaj drugi sposób dostępu, jeśli go masz, na przykład konsolę dostawcy lub IP-KVM, i preferuj bezpieczne opcje stosowania zmian pokazane poniżej.
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 przypisanym do ciebie. Poniższe adresy wykorzystują zakres dokumentacyjny z RFC 5737 i są jedynie symbolami zastępczymi:
#!/bin/bash set -euo pipefail # Interface that will carry the additional addresses. IFACE="ens3" # Common prefix and the first and last value of the host octet. # Replace these with the block assigned to you. PREFIX="203.0.113" FIRST=10 LAST=60 # Stop early with a clear message if the interface name is wrong. if ! ip link show "$IFACE" >/dev/null 2>&1; then echo "Interface $IFACE not found. Check the name with: ip -br addr show" >&2 exit 1 fi for HOST in $(seq "$FIRST" "$LAST"); do ip addr replace "${PREFIX}.${HOST}/32" dev "$IFACE" done
Adresy celowo używają prefiksu /32. Interfejs główny posiada już trasę dla swojej podsieci, więc każdy adres dodatkowy potrzebuje tylko lokalnej trasy hosta. Prefiks /32 zapobiega dodaniu przez jądro zduplikowanej trasy podsieci i utrzymuje porządek w tabeli routingu. Skrypt używa ip addr replace zamiast ip addr add, dzięki czemu można go bezpiecznie uruchomić ponownie bez błędów dla adresów, które już istnieją.
Nadaj skryptowi uprawnienia do wykonywania. Zwróć uwagę na pełną ścieżkę, która była elementem brakującym w poprzedniej wersji tego przewodnika:
chmod +x /usr/local/sbin/extra-ips.sh
Utrwalenie 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 systemu, 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 następującą 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 uruchomiła się teraz oraz przy każdym starcie:
systemctl daemon-reload systemctl enable --now extra-ips.service
Potwierdź, że usługa uruchomiła się poprawnie:
systemctl status --no-pager extra-ips.service
Adresy dodane przez ten skrypt nie są częścią konfiguracji netplan ani systemd-networkd. Późniejsze netplan apply, networkctl reconfigure lub jakikolwiek restart sieci może je usunąć. Wracają one przy następnym ponownym uruchomieniu lub natychmiast, jeśli uruchomisz systemctl restart extra-ips.service. Jeśli adresy muszą pozostać na miejscu również podczas rekonfiguracji sieci, użyj zamiast tego metody netplan opisanej poniżej.
Alternatywa: definiowanie adresów w netplan
W Ubuntu, gdzie netplan jest domyślnym rozwiązaniem, adresy można zadeklarować bezpośrednio w netplan. Stos sieciowy traktuje je wtedy jako adresy zarządzane, dzięki czemu przetrwają rekonfigurację. Sprawdza się to w przypadku małej, stałej listy. Dla dużego zakresu opisana wyżej usługa systemd 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 główny adres i odciąć dostęp. Edytowanie istniejącego pliku konfiguracyjnego jest zwykle bezpieczniejsze niż tworzenie kolejnego pliku dla tego samego interfejsu. Otwórz plik, który już konfiguruje twój interfejs, zwykle /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 główny, bramę i serwery nazw. Dodaj dodatkowe adresy pod listą addresses dla tego samego interfejsu. Poniższy przykład zachowuje DHCP dla adresu głównego 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
Najnowsze wersje netplan ostrzegają, jeśli plik jest odczytywalny przez 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. Polecenie to stosuje konfigurację i automatycznie wycofuje ją 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 listę adresów obecnie przypisanych do interfejsu i potwierdź, że nowe adresy są obecne:
ip -br addr show ens3
Dodatkowe adresy powinny teraz pojawić się w wyniku 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 starcie, 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
Sprawdź, czy:
- nazwa interfejsu w skrypcie zgadza się z rzeczywistą nazwą uzyskaną z
ip -br addr show; - adresy należą do bloku przypisanego do ciebie;
- skrypt ma uprawnienia do wykonywania.
Jeśli przez pomyłkę użyto prefiksu /24 zamiast /32, w tabeli routingu objawia się to jako kilka zduplikowanych tras podsieci. Sprawdź to 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.