Przekierowanie portów, zwane również mapowaniem portów, to metoda umożliwiająca urządzeniom zdalnym łączenie się z określoną usługą w ramach prywatnej sieci lokalnej (LAN). Jak sama nazwa wskazuje, proces ten polega na przekazywaniu żądań dotyczących określonego portu do innego portu lub sieci. Modyfikuje on cel pakietu w locie i jest uważany za rodzaj operacji translacji adresów sieciowych (NAT).
Włączenie przekierowania portów umożliwia urządzeniom lub hostom niepołączonym z siecią wewnętrzną uzyskanie dostępu do siebie nawzajem, co w przeciwnym razie jest ograniczone, gdy funkcja ta jest wyłączona. Możesz wykorzystać zalety przekierowania portów, aby blokować docelowe strony internetowe, zwiększyć bezpieczeństwo i w dogodny sposób ominąć zaporę sieciową NAT.
W tym samouczku przeprowadzimy Cię przez kroki przekierowywania portów za pomocą iptables w systemie Linux.
Wymagania wstępne
Aby móc postępować zgodnie z tym samouczkiem, będziesz potrzebować:
- Zainstalowanego systemu Ubuntu na swoim systemie.
- Dwóch hostów z systemem Ubuntu 20.04 w tym samym centrum danych z włączoną siecią prywatną.
- Konto użytkownika innego niż root ze skonfigurowanymi uprawnieniami sudo na każdej maszynie.
Szczegóły hosta
Najpierw musimy poznać szczegóły interfejsów i adresów działających serwerów. Sprawdźmy interfejsy sieciowe naszego systemu:
|
1 |
ip -4 addr show scope global |
Zobaczysz następujący wynik:
|
1 2 3 4 5 6 7 8 9 |
Przykładowy wynik 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
W tym miejscu wyróżniony wynik pokazuje dwa interfejsy, z których pierwszy eth0 przypisany do adresu 192.51.100.45, a drugi eth1 przypisany do adresu 192.168.1.5. Z tych dwóch interfejsów jeden jest publiczny, a drugi prywatny. Uruchomimy polecenie, aby je rozróżnić i ustalić, który interfejs jest publiczny (ten połączony z domyślną bramą). Aby je rozróżnić, wpisz:
|
1 |
ip route show | grep default= |
Zobaczysz następujący wynik:
|
1 2 3 |
Wynik: ip route show | grep default |
Przykładowe dane na potrzeby samouczka
W tym samouczku będziemy używać fikcyjnych adresów i przypisań interfejsów. Możesz swobodnie korzystać z tych danych lub zastąpić je własnymi, według uznania.
Szczegóły sieciowe serwera WWW:
-
Publiczny adres IP: 203.0.113.2
-
Prywatny adres IP: 192.0.2.2
-
Interfejs publiczny: eth0
-
Interfejs prywatny: eth1
Szczegóły sieciowe zapory sieciowej:
-
Publiczny adres IP: 203.0.113.15
-
Prywatny adres IP: 192.0.2.15
-
Interfejs publiczny: eth0
-
Interfejs prywatny: eth1
Konfiguracja serwera WWW
Zacznijmy od naszego hosta serwera WWW. Najpierw zaloguj się za pomocą swojego sudo użytkownika.
Instalacja Nginx
Najpierw zainstalujemy Nginx na naszym hoście serwera WWW i zablokujemy go tak, aby nasłuchiwał tylko na swoim prywatnym interfejsie. Dzięki temu nasz serwer WWW będzie dostępny tylko wtedy, gdy poprawnie skonfigurujemy przekierowanie portów.
Następnie zaktualizuj lokalną pamięć podręczną pakietów i użyj apt, aby pobrać i zainstalować Nginx:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Dodawanie ograniczeń
Po zainstalowaniu Nginx na naszym hoście serwera WWW zablokujemy go, aby upewnić się, że akceptuje dane wejściowe tylko z prywatnych interfejsów i znikąd indziej. Zapewni to również, że nasze serwery WWW będą aktywne tylko wtedy, gdy konfiguracja przekierowania portów będzie poprawna.
Aby dodać ograniczenia, otwórz domyślny plik konfiguracyjny bloku serwera /etc/nginx/sites-enabled/default w dowolnym edytorze tekstu (tutaj używamy edytora nano) i wpisz:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
W danych wyjściowych zobaczysz, że dyrektywa listen pojawia się dwukrotnie:

W tym samouczku używamy pierwszej dyrektywy do zademonstrowania przekierowania IPv4. Druga, skonfigurowana dla IPv6, może zostać usunięta. Dodaj prywatny adres IP swojego serwera WWW z dwukropkiem tuż przed 80, aby poinformować Nginx, aby przyjmował dane wejściowe tylko z interfejsu prywatnego. Następnie edytuj dyrektywę:

Po zakończeniu zapisz i zamknij plik. Zanim przejdziesz dalej, upewnij się, że nie ma błędów składniowych. Przetestujmy plik:
|
1 |
sudo nginx -t |

Jeśli nie wyświetli się żaden błąd, możesz zrestartować Nginx i włączyć nową konfigurację:
|
1 |
sudo service nginx restart |
Weryfikacja ograniczenia sieciowego
Zweryfikujmy poziom dostępu do naszego serwera WWW. Spróbuj uzyskać dostęp do serwera WWW za pomocą prywatnego interfejsu, używając polecenia curl :
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Zobaczysz dane wyjściowe:

Jeśli spróbujemy użyć interfejsu publicznego, nie będziemy mogli się połączyć:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Failed to connect to 203.0.113.2 port 80: Connection refused |
To jest dokładnie to, czego się spodziewaliśmy.
Skonfiguruj zaporę sieciową do przekierowywania portu 80
Przejdźmy do wdrożenia przekierowania portów na naszej maszynie z zaporą sieciową.
Włącz przekierowanie w jądrze
Domyślnie większość systemów ma wyłączone przekierowanie portów. Wprowadzimy zmiany, aby włączyć przekierowanie portów, dokonując kilku edycji. Istnieje również opcja włączenia przekierowania portów na stałe przy użyciu uprawnień sudo , jak pokazano w kolejnych krokach.
Aby włączyć przekierowanie ruchu na poziomie jądra, wpisz:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Aby włączyć przekierowanie portów na stałe, edytuj plik /etc/sysctl.conf . Otwórz plik z uprawnieniami sudo i wpisz:
|
1 |
sudo nano /etc/sysctl.conf |
Wewnątrz znajdź i odkomentuj linię, która wygląda tak:
|
1 |
net.ipv4.ip_forward=1 |
Po zakończeniu zapisz i zamknij plik. Następnie użyj poleceń sysctl , aby zastosować zmiany w ustawieniach, aby weszły w życie:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Podstawowa konfiguracja zapory sieciowej
Najpierw zapoznaj się z przewodnikiem dotyczącym jak skonfigurować podstawową zaporę sieciową na swojej maszynie. Po zakończeniu będziesz mieć:
- Zainstalowany pakiet iptables-persistent
- Zapisany domyślny zestaw reguł w /etc/iptables/rules.v4
- Wszechstronną wiedzę na temat dodawania i modyfikowania reguł za pomocą polecenia iptables command
Możesz również sprawdzić jak wyświetlić i usunąć reguły zapory iptables.
Dodawanie reguł przekierowania
Skonfigurujemy naszą zaporę sieciową, aby upewnić się, że ruch wpływający do naszego interfejsu publicznego ( eth0 ) na porcie 80 jest przekierowywany do naszego interfejsu prywatnego ( eth1). Domyślnie nasza podstawowa zapora sieciowa ma łańcuch FORWARD ustawiony na DROP ruchu. Dodanie reguł zapory pozwoli na przekierowywanie połączeń do naszego serwera WWW. Aby zwiększyć bezpieczeństwo, zablokujemy reguły zapory, aby zezwalały tylko na określone żądania przekierowania.
W łańcuchu FORWARD będziemy akceptować nowe połączenia przeznaczone dla portu 80 pochodzące z naszego interfejsu publicznego i zmierzające do naszego interfejsu prywatnego. Zidentyfikujemy nowe połączenia za pomocą rozszerzenia conntrack i przedstawimy je jako pakiet TCP SYN :
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Musisz zezwolić na wszelki kolejny ruch w obu kierunkach wynikający z połączenia przychodzącego. Wpisz poniższe polecenia, aby zezwolić na ruch ESTABLISHED oraz RELATED między naszymi interfejsami publicznymi i prywatnymi:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Sprawdźmy, czy nasza polityka dla łańcucha FORWARD jest ustawiona na DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Do tej pory dodaliśmy kilka reguł, które pozwalają na ruch między naszym interfejsem publicznym a prywatnym przez naszą zaporę sieciową. Jednakże iptables nie jest jeszcze poinformowany o kierowaniu ruchem, ponieważ konfiguracja reguł zapory sieciowej nie została jeszcze zakończona. W kolejnych krokach dodamy reguły NAT i dostosujemy stały zestaw reguł do kierowania ruchem.
Dodawanie reguł NAT do kierowania pakietami
Wykonamy dwie oddzielne operacje, aby iptables mógł poprawnie modyfikować pakiety i usprawnić komunikację z klientami oraz serwerem WWW.
DNAT to pierwsza operacja, która rozpoczyna łańcuch PREROUTING tabeli nat Ta operacja zmienia adres docelowy pakietu i umożliwia jego poprawne trasowanie podczas przechodzenia między sieciami. Jednak klienci w sieci publicznej będą łączyć się z naszym serwerem zapory i nie będą mieli żadnych informacji o topologii naszej sieci prywatnej. Aby przekazywać informacje w sieci prywatnej, zmień adres docelowy każdego pakietu, aby umożliwić mu poprawne dotarcie do naszego docelowego serwera WWW.
Należy pamiętać, że skupiamy się na konfiguracji przekierowania portów. Wykonywanie NAT na każdym pakiecie trafiającym do zapory nie jest częścią tego poradnika. Będziemy dopasowywać pakiety na porcie 80 do prywatnego adresu IP naszego serwera WWW:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
Pakiet zostanie poprawnie przekierowany do naszego serwera WWW, zawierając oryginalny adres klienta jako adres źródłowy. Pomimo prób podjętych przez serwer w celu wysłania odpowiedzi bezpośrednio na ten adres, nie będzie możliwości ustanowienia prawidłowego połączenia TCP.
Aby skonfigurować prawidłowe trasowanie, zmodyfikujemy adres źródłowy pakietu. Zmieńmy adres źródłowy na prywatny adres IP naszego serwera zapory. Po modyfikacji odpowiedź zostanie odesłana do zapory, która przekaże ją z powrotem do klienta.
Aby włączyć tę funkcjonalność, dodaj regułę do łańcucha POSTROUTING tabeli nat ewaluowanego tuż przed wysłaniem pakietów do sieci. Następnie dopasuj pakiety przeznaczone dla naszego serwera WWW według adresu IP i portu:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Po wdrożeniu tej reguły nasz serwer WWW powinien być dostępny poprzez skierowanie przeglądarki internetowej na publiczny adres naszej maszyny zaporowej:
|
1 |
curl 203.0.113.15 |
Zobaczysz dane wyjściowe:

Nasza konfiguracja przekierowania portów jest kompletna.
Dostosowanie stałego zestawu reguł
Po zakończeniu konfiguracji przekierowania portów zapiszemy to w naszym stałym zestawie reguł. Jeśli chcesz zachować komentarze w bieżącym zestawie reguł, użyj usługi iptables-persistent do zapisania swoich reguł:
|
1 |
sudo service iptables-persistent save |
Możesz go również otworzyć i edytować ręcznie, aby zachować komentarze w pliku:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Następnie skonfiguruj tabelę filter oraz tabelę nat aby dodać odpowiednio reguły łańcucha FORWARD oraz reguły ROUTING. Dostosowanie tabeli nat pozwoli nam dodać reguły PREROUTING oraz POSTROUTING jak pokazano w poniższym przykładzie:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/rules.v4 *filter # Zezwalaj na cały ruch wychodzący, ale domyślnie odrzucaj pakiety przychodzące i przekazywane :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Niestandardowe łańcuchy dla poszczególnych protokołów :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Dopuszczalny ruch UDP # Dopuszczalny ruch TCP -A TCP -p tcp --dport 22 -j ACCEPT # Dopuszczalny ruch ICMP # Standardowa polityka akceptacji -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Odrzucaj nieprawidłowe pakiety -A INPUT -m conntrack --ctstate INVALID -j DROP # Przekazuj ruch do łańcuchów specyficznych dla protokołów ## Zezwalaj tylko na nowe połączenia (nawiązane i powiązane powinny być już obsłużone) ## Dla TCP dodatkowo zezwalaj tylko na nowe pakiety SYN, ponieważ jest to jedyna prawidłowa ## metoda nawiązywania nowego połączenia TCP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Odrzuć wszystko, co dotarło do tego miejsca ## Spróbuj dopasować komunikat odrzucenia do konkretnego protokołu -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Reguły przekierowania portu 80 do naszego serwera WWW # Szczegóły sieciowe serwera WWW: # * Publiczny adres IP: 203.0.113.2 # * Prywatny adres IP: 192.0.2.2 # * Interfejs publiczny: eth0 # * Interfejs prywatny: eth1 # # Szczegóły sieciowe zapory: # # * Publiczny adres IP: 203.0.113.15 # * Prywatny adres IP: 192.0.2.15 # * Interfejs publiczny: eth0 # * Interfejs prywatny: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Koniec reguł filtrowania Forward # Zatwierdź zmiany COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Reguły tłumaczenia żądań dla portu 80 interfejsu publicznego # tak, abyśmy mogli poprawnie przekierować je do serwera WWW za pomocą # interfejsu prywatnego. # Szczegóły sieciowe serwera WWW: # * Publiczny adres IP: 203.0.113.2 # * Prywatny adres IP: 192.0.2.2 # * Interfejs publiczny: eth0 # * Interfejs prywatny: eth1 # # Szczegóły sieciowe zapory: # # * Publiczny adres IP: 203.0.113.15 # * Prywatny adres IP: 192.0.2.15 # * Interfejs publiczny: eth0 # * Interfejs prywatny: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Koniec translacji NAT dla ruchu serwera WWW COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
Po dodaniu powyższych wartości zapisz i zamknij plik. Następnie wpisz poniższe polecenie, aby przetestować składnię swoich reguł:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Jeśli nie widzisz żadnych błędów, załaduj zestaw reguł:
|
1 |
sudo service iptables-persistent reload |
Zweryfikujmy, czy nasz serwer WWW jest nadal dostępny za pośrednictwem publicznego adresu IP zapory sieciowej:
|
1 |
curl 203.0.113.15 |
Podsumowanie
Po ukończeniu tego samouczka powinieneś swobodnie radzić sobie z przekierowywaniem portów na serwerze Linux za pomocą iptables. Możesz wykorzystać możliwości przekierowywania portów, aby ukryć topologię swojej sieci prywatnej, jednocześnie usprawniając ruch usług, tak aby swobodnie przepływał przez maszynę bramy sieciowej (zapory).
Ponieważ proces ten zależy bezpośrednio od bezpieczeństwa Twojej sieci i używanych portów, jest on bezpieczny. Istnieje jednak ryzyko, jeśli nie posiadasz zapory sieciowej ani zabezpieczeń VPN w swojej sieci. Dlatego zaleca się skonfigurowanie zapory sieciowej w sposób omówiony w tym samouczku. Mamy nadzieję, że ten przewodnik pomoże Ci zachować bezpieczeństwo w Internecie podczas korzystania z sieci prywatnej.
Aby dowiedzieć się więcej o innych rozwiązaniach zapór sieciowych, które możesz wdrożyć w swoim systemie, zapoznaj się z poniższymi materiałami z naszego bloga:
- Konfiguracja zapory sieciowej za pomocą UFW na Ubuntu 18.04
- Konfiguracja zapory sieciowej za pomocą FirewallD na CentOS 7
- Podstawy UFW: Nauka najważniejszych poleceń zapory sieciowej
Miłej pracy z komputerem!
Komentarze
Brak komentarzy. Bądź pierwszy.