Jak powiązać usługi z adresem IP na serwerze multi-IP
Poziom: Średniozaawansowany
Szacowany czas: ok. 25 minut
Cel: Skonfigurowanie SSH, Nginx, Apache i MySQL/MariaDB tak, aby nasłuchiwały wyłącznie na wybranym adresie IP zamiast na wszystkich interfejsach serwera z wieloma adresami IP.
Wprowadzenie
Gdy serwer ma wiele adresów IP, domyślnie każda usługa nasłuchuje na wszystkich z nich. Rzadko jest to pożądane: baza danych nie powinna być dostępna pod publicznym adresem IP, a serwer WWW jednego klienta nie powinien odpowiadać pod adresem innego klienta. Prawidłowa konfiguracja serwera z wieloma adresami IP zapewnia, że każdy interfejs sieciowy obsługuje właściwy ruch. Powiązanie z adresem IP (IP binding) daje dokładniejszą kontrolę dostępu, ułatwia zarządzanie routingiem ruchu przychodzącego i zmniejsza powierzchnię ataku. W tym poradniku wyjaśniamy, jak powiązać usługę z adresem IP (bind service to IP address) dla kilku popularnych usług — SSH, Nginx, Apache, MySQL/MariaDB — oraz jak zoptymalizować konfigurację adresu nasłuchiwania, aby usługa nasłuchiwała wyłącznie na wybranym adresie IP.
Wymagania wstępne
Zanim zaczniesz, upewnij się, że spełnione są następujące warunki:
- System operacyjny: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 lub CentOS/RHEL 8/9 (jeśli chcesz skonfigurować powiązanie usług w Ubuntu, kroki są niemal identyczne we wszystkich wersjach)
- Dostęp: dostęp sudo lub root do serwera
- Sieć: co najmniej dwa adresy IP skonfigurowane na serwerze (sprawdź w kroku 1)
- Wymagana wiedza: swobodna obsługa wiersza poleceń Linuksa i podstawowa edycja tekstu
Krok 1: Ustalenie adresów IP
Sprawdź, jakie adresy IP są przypisane do serwera:
ip -4 addr show
Oczekiwany wynik (przykład):
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ... inet 203.0.113.10/24 brd 203.0.113.255 scope global eth0 inet 198.51.100.5/24 brd 198.51.100.255 scope global eth0:1
W tym poradniku używamy adresu 203.0.113.10 jako publicznego IP oraz 198.51.100.5 jako dodatkowego IP. Zastąp je własnymi adresami.
Jeśli widzisz tylko jeden adres, na serwerze nie skonfigurowano jeszcze wielu adresów IP. Skontaktuj się z dostawcą lub dodaj adres ręcznie, zanim przejdziesz dalej.
Krok 2: Powiązanie SSH z wybranym adresem IP
Domyślnie SSH nasłuchuje na 0.0.0.0 (wszystkie interfejsy). Aby ograniczyć go do jednego adresu IP i uzyskać powiązanie usługi w systemie Linux:
Wykonaj kopię zapasową konfiguracji:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
Otwórz plik konfiguracyjny SSH:
sudo nano /etc/ssh/sshd_config
Znajdź dyrektywę ListenAddress i ustaw adres nasłuchiwania, aby skonfigurować adres IP, na którym usługa ma nasłuchiwać:
ListenAddress 203.0.113.10
Jeśli ListenAddress jest zakomentowana lub jej brakuje, dodaj ten wiersz w dowolnym miejscu pliku.
Sprawdź poprawność konfiguracji:
sudo sshd -t
Jeśli polecenie nie zwraca żadnych danych, konfiguracja jest poprawna.
Przed ponownym uruchomieniem SSH upewnij się, że podany adres IP jest poprawny i osiągalny. Jeśli powiążesz SSH z błędnym adresem IP, utracisz dostęp do serwera. Pozostaw otwartą drugą sesję SSH jako zabezpieczenie lub skorzystaj z dostępu do konsoli udostępnianego przez dostawcę.
Uruchom usługę ponownie:
sudo systemctl restart sshd
W niektórych systemach usługa może nazywać się ssh zamiast sshd.
Sprawdź, czy SSH nasłuchuje teraz wyłącznie na podanym adresie IP:
ss -tlnp | grep sshd
Oczekiwany wynik:
LISTEN 0 128 203.0.113.10:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
Jeśli widzisz 0.0.0.0:22, zmiana nie zadziałała. Sprawdź konfigurację pod kątem literówek lub sprzecznych wierszy ListenAddress.
Krok 3: Powiązanie Nginx z wybranym adresem IP
Dyrektywa listen określa, jakiego adresu IP i portu używa Nginx. Aby powiązać aplikację z adresem IP, należy skonfigurować dyrektywę listen w NGINX.
Wykonaj kopię zapasową konfiguracji:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
Otwórz konfigurację witryny:
sudo nano /etc/nginx/sites-available/default
W CentOS/RHEL domyślna ścieżka konfiguracji to /etc/nginx/conf.d/default.conf. Składnia jest taka sama.
Zmień dyrektywę nasłuchiwania (listen) z:
listen 80; listen [::]:80;
na:
listen 203.0.113.10:80;
Jeśli używasz również HTTPS:
listen 203.0.113.10:443 ssl;
Przetestuj konfigurację i załaduj ją ponownie:
sudo nginx -t sudo systemctl reload nginx
Weryfikacja:
ss -tlnp | grep nginx
Oczekiwany wynik:
LISTEN 0 511 203.0.113.10:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
Krok 4: Powiązanie Apache z wybranym adresem IP
Apache używa dyrektywy Listen w głównym pliku konfiguracyjnym.
Debian/Ubuntu:
sudo cp /etc/apache2/ports.conf /etc/apache2/ports.conf.backup sudo nano /etc/apache2/ports.conf
CentOS/RHEL:
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup sudo nano /etc/httpd/conf/httpd.conf
Zmień:
Listen 80
na:
Listen 203.0.113.10:80
Dla HTTPS:
Listen 203.0.113.10:443
Zaktualizuj również wszystkie bloki <VirtualHost *:80>, aby korzystały z adresu IP:
<VirtualHost 203.0.113.10:80>
Przetestuj i załaduj ponownie:
Debian/Ubuntu:
sudo apachectl configtest sudo systemctl reload apache2
CentOS/RHEL:
sudo apachectl configtest sudo systemctl reload httpd
Weryfikacja:
ss -tlnp | grep -E 'apache|httpd'
Krok 5: Powiązanie MySQL/MariaDB z wybranym adresem IP
Domyślnie MySQL/MariaDB nasłuchuje na 127.0.0.1 (tylko localhost). Jeśli usługa ma być dostępna pod wybranym wewnętrznym adresem IP, zmień bind-address, aby powiązać aplikację z lokalnym adresem IP.
Debian/Ubuntu (MySQL 8.x / MariaDB 10.x):
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
CentOS/RHEL (MariaDB):
sudo cp /etc/my.cnf.d/mariadb-server.cnf /etc/my.cnf.d/mariadb-server.cnf.backup sudo nano /etc/my.cnf.d/mariadb-server.cnf
Dokładna ścieżka pliku konfiguracyjnego jest różna. Jeśli powyższy plik nie istnieje, poszukaj sekcji [mysqld] w /etc/my.cnf lub /etc/mysql/my.cnf.
Znajdź wiersz bind-address i zmień go:
bind-address = 198.51.100.5
Uruchom usługę ponownie:
sudo systemctl restart mysql # lub mysqld / mariadb
Weryfikacja:
ss -tlnp | grep 3306
Oczekiwany wynik:
LISTEN 0 80 198.51.100.5:3306 0.0.0.0:* users:(("mysqld",pid=9012,fd=22))
Jeśli zmieniasz bind-address z 127.0.0.1 na routowalny adres IP, upewnij się, że masz regułę zapory sieciowej zezwalającą na połączenia wyłącznie z zaufanych źródeł. Nigdy nie udostępniaj portu bazy danych w publicznym internecie bez zabezpieczeń.
Weryfikacja
Po skonfigurowaniu wszystkich usług wykonaj kontrolę podsumowującą:
ss -tlnp
Upewnij się, że każda usługa wyświetla zamierzony adres IP, a nie 0.0.0.0 ani *.
ssh [email protected] # powinno działać ssh [email protected] # powinno zostać odrzucone, jeśli SSH jest powiązane z drugim adresem IP
Wycofanie zmian
Aby cofnąć dowolną zmianę, przywróć konfigurację z kopii zapasowej i uruchom usługę ponownie.
Dla SSH:
sudo cp /etc/ssh/sshd_config.backup /etc/ssh/sshd_config sudo systemctl restart sshd
W przypadku pozostałych usług cofnij zmianę listen / bind-address w odpowiednim pliku konfiguracyjnym i uruchom usługę ponownie. Pierwotną wartością jest prawie zawsze 0.0.0.0, * lub 127.0.0.1.
Podsumowanie
To wszystko. Każdą usługę można ograniczyć, zmieniając jedną dyrektywę, uruchamiając usługę ponownie i weryfikując wynik poleceniem ss -tlnp.
Wersja dokumentu: 1.0
Ostatnia aktualizacja: kwiecień 2026
Właściciel: Zespół dokumentacji technicznej