Przekieruj ruch z jednego adresu IP i portu na inny adres IP i port

Coś bardzo częstego podczas zarządzania serwerami to przekierowywanie ruchu.

Załóżmy, że mamy serwer z uruchomionymi pewnymi usługami, ale z jakiegokolwiek powodu zmieniamy jedną z tych usług (Nie wiem, na przykład pop3, który jest portem 110) na inny serwer. Normalną i najczęstszą rzeczą byłaby po prostu zmiana adresu IP w rekordzie DNS, jednak jeśli ktoś używałby adresu IP zamiast subdomeny, będzie to miało wpływ.

Co robić? ... proste, przekieruj ruch, który serwer otrzymuje przez ten port na inny serwer z tym samym portem.

serwer-węzeł-lan-ethernet

Jak zacząć przekierowywać ruch?

Po pierwsze, musieliśmy włączyć przekierowanie na serwerze, w tym celu umieścimy:

echo "1" > /proc/sys/net/ipv4/ip_forward

Wszystkie polecenia pokazane w tym samouczku muszą być wykonywane z uprawnieniami administratora, zalecam, aby były wykonywane bezpośrednio z użytkownikiem root.

Możesz także użyć tego innego polecenia, na wypadek gdyby poprzednie nie działało dla Ciebie (tak mi się przydarzyło na CentOS):
sysctl net.ipv4.ip_forward=1
Następnie zrestartujemy sieć:

service networking restart

W dystrybucjach RPM, takich jak CentOS i inne, byłoby to:

service nertwork restart

Teraz przejdziemy do ważnej rzeczy, poinformuj serwer o tym iptables co przekierować:

iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>

Innymi słowy, idąc za przykładem, o którym wspomniałem, załóżmy, że chcemy przekierować cały ruch, który nasz serwer otrzymuje przez port 110, na inny serwer (np .: 10.10.0.2), który nadal będzie odbierać ten ruch przez 110 (to ta sama usługa):

iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110

Serwer 10.10.0.2 zobaczy, że wszystkie pakiety lub żądania pochodzą z adresu IP klienta, na wypadek gdyby chciał je przepłynąć, to znaczy, że drugi serwer widzi, że żądania przychodzą z adresem IP pierwszego serwera (i które stosujemy przekierowanie), należałoby również umieścić tę drugą linię:

iptables -t nat -A POSTROUTING -j MASQUERADE

Kilka pytań i odpowiedzi

W przykładzie użyłem tego samego portu w obu przypadkach (110), jednak mogą one bez problemu przekierowywać ruch z jednego portu do drugiego. Na przykład przypuśćmy, że chcę przekierować ruch z portu 80 do 443 na innym serwerze, w tym przypadku będzie to:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443

To jest iptables, mogą używać wszystkich innych parametrów, które znamy, na przykład jeśli chcemy przekierować ruch tylko z określonego adresu IP, byłoby to dodanie -s … Na przykład przekieruję tylko ruch pochodzący z 10.10.0.51:

iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443

Lub cała sieć (/ 24):

iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443

Możemy również określić interfejs sieciowy za pomocą -i :

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443

Koniec!

To jak już powiedziałem, to iptables, możesz zastosować to, co już jest znane, aby serwer robił dokładnie to, co chcesz 😉

Pozdrowienia!

DedicatedServer_SubImage


Treść artykułu jest zgodna z naszymi zasadami etyka redakcyjna. Aby zgłosić błąd, kliknij tutaj.

19 komentarzy, zostaw swoje

Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Fer powiedział

    Możemy to również zrobić za pomocą zapory, która umożliwia przekierowanie portów, prawda? (stosując odpowiednie zasady).

    1.    KZKG ^ Gaara powiedział

      Tak, oczywiście, w końcu firewall, taki jak Pfsense lub inne, używaj iptables od tyłu.

      1.    łowca powiedział

        Dokładnie mówiąc, pfsense nie używa iptables, ale pf, pamiętaj, że jest to plik bsd.

        1.    KZKG ^ Gaara powiedział

          O racja, moja wina!

  2.   Nicolas powiedział

    Bardzo dziękuję za wskazówkę 🙂

    Mam kilka wątpliwości:
    1 - Czy zmiana jest trwała? czy jest zgubiony podczas restartu serwera?
    2 - Mam wiele instancji (powiedzmy A, B i C) w tej samej podsieci. Na przykład A Stosuję regułę, aby kierować ruch do zewnętrznego adresu IP, a testując z lokami z instancji B i C, wszystko działa cuda. Problem w tym, że z instancji A to nie działa. Próbowałem użyć zarówno twojego adresu IP, jak i interfejsu sprzężenia zwrotnego, ale żadne z nich nie działa:
    $ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –do miejsca docelowego xxxx: 8080
    $ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –do miejsca docelowego xxxx: 8080

    $ curl ip-yyyy: 8080 / hello_world
    curl: (7) Nie można połączyć się z portem ip-yyyy 8080: Odmowa połączenia
    $ curl localhost: 8080 / hello_world
    curl: (7) Nie można połączyć się z portem hosta lokalnego 8080: Odmowa połączenia

    Masz pojęcie, w czym może być problem?

    1.    KZKG ^ Gaara powiedział

      Tak, zmiana zostanie utracona po ponownym uruchomieniu, będziesz musiał użyć iptables-save & iptables-restore lub czegoś podobnego, aby tego uniknąć.
      Nie do końca rozumiałem, co chcesz zrobić, przykład A?

      1.    Nicolas powiedział

        Mam serwer, który obsługuje tylko połączenia z określonego adresu IP (serwera A), nie mogę lub chcę dodać więcej adresów IP do białej listy (ze względu na problemy ze skalowalnością), więc chcę, aby cały ruch do serwera zewnętrznego przechodził wspomniany serwer (A).
        Ze względów praktycznych mam globalne konfiguracje, które definiują, którego adresu IP użyć dla każdej usługi, więc w tym przypadku jest to coś w rodzaju „każdy, kto chce korzystać z usługi zewnętrznej, musi używać adresu IP A”
        Udało mi się to osiągnąć za pomocą metody opisanej w tym artykule, ale napotykam problem polegający na tym, że po jej zastosowaniu serwer A nie może uzyskać dostępu do usługi przy użyciu własnego adresu IP (ale wszystkie inne serwery to robią).
        Jak dotąd najlepsze, co znalazłem, to dodanie mapowania w pliku / etc / hosts serwera A, wskazując na zewnętrzny adres IP, nadpisując ustawienie globalne.

  3.   braybaut powiedział

    Bardzo dobrze, jeśli mam inny serwer pocztowy, mógłbym przekierować ruch z portu 143 z server1 do server2 i e-maile dotrą do mnie na server2, prawda?

    pozdrowienia

    1.    KZKG ^ Gaara powiedział

      W teorii tak, to tak działa. Jasne, musisz mieć poprawnie zainstalowany serwer pocztowy na serwerze server2 🙂

  4.   msx powiedział

    Takie posty, które lubimy czytać, dziękujemy!

  5.   Abraham Ibarra powiedział

    Świetny artykuł, mam projekt w którym pracuję i chciałem zadać Ci pytanie, są przełączniki przemysłowe z funkcją NAT (chyba używają IPTables poniżej), do przetłumaczenia adresu IP bez robienia zmian w sprzęcie, na przykład mam serwer 10.10.2.1, który komunikuje się z komputerami 10.10.2.X i przez przełącznik jest zaprogramowany tak, że komputer o adresie 192.168.2.4 jest faktycznie widziany z serwera jako 10.10.2.5, przetłumaczył ten adres IP, aby był widoczny Z innych komputerów o tym adresie chcę to zrobić z serwera z Ubuntu lub inną dystrybucją, jakie byłyby reguły iptables?

  6.   Kuku powiedział

    Bardzo dobre informacje, dziękuję ^ _ ^

  7.   Yisus powiedział

    Dzień dobry.
    Mam problem z przekierowaniem. Wyjaśniam:
    Mam serwer proxy w Ubuntu z 2 kartami sieciowymi:
    eth0 = 192.168.1.1 jest połączony z resztą sieci lokalnej.
    eth1 = 192.168.2.2 jest połączony z routerem.
    Potrzebuję wszystkiego, co przechodzi przez eth0, aby przejść przez eth1, a także przez proxy (używam Squid, którego domyślny port to 3128) i nie mogę znaleźć klucza w konfiguracji IPTABLES.
    Nie potrzebuję żadnych ograniczeń, tylko, że w dzienniku pozostaje zapis odwiedzanych adresów internetowych.

    Mam nadzieję, że możesz mi pomóc, ponieważ jest to dość uciążliwe zadanie, które martwi mnie od kilku dni.

    Dziękuję.

  8.   Gabriel powiedział

    Przyjacielu, jestem bardzo nowy na innych serwerach, nie mam pojęcia ale rozumiem temat i szybko się uczę, moje pytanie brzmi następująco Mam 2 serwery serv_1 i serv_2 które podłączyłem do tego samego intranetu, na tych serwerach mam ustawioną własną chmurę, Chciałbym wykonać następujące czynności:

    że pewien zakres ips, na przykład rangeip_1 podczas umieszczania adresu IP dostępu do owncloud (ipowncloud) jest skierowany na serv_1, a jeśli jest to inny rangeip_2 umieszczony ten sam ipowncloud jest kierowany do serv_2, to po to, aby 2 serwery były zlokalizowane w dwóch różnych miastach i zakresy adresów IP są różne, ale wszystkie znajdują się w tej samej sieci, to byłaby pierwsza część, druga byłaby jasna, aby zsynchronizować te 2 serwery tak, aby były lusterkami lub aby doradzili mi to w celu optymalizacji szerokości zespół, proszę, jeśli zamierzasz mi wyjaśnić, jak to zrobić krok po kroku, a nie w trybie super programisty = (

  9.   Antonio Carrizosa powiedział

    Witam, przepraszam, mam przełącznik odpowiadający za komunikację wszystkich urządzeń tworzących moją sieć, a potem zaporę ogniową i wreszcie wyjście z Internetu, co się dzieje, że chciałbym, aby przekierowanie było podane w przełącznika i nie musi łączyć się z zaporą, chyba że żądaną usługą jest Internet.

  10.   John powiedział

    Czy korzystając z tej metody, możesz przekierować HTTPS na HTTP?

  11.   mati powiedział

    Cześć, może jest trochę za późno, ale chciałem cię zapytać, jak mam sprawić, by squid nie modyfikował IP klienta, gdy chcę połączyć się z serwerem WWW w tej samej sieci?

  12.   Lafat32 powiedział

    Nie traktuj mnie źle, że pytam. Czy można to zrobić w systemie Windows?

  13.   jaskółka oknówka powiedział

    Ta informacja była dla mnie przydatna. Jak zawsze, można wam zaufać, kiedy nie mogę znaleźć czegoś po angielsku, zwykle w końcu szukam po hiszpańsku, przy takich okazjach prawie zawsze odwiedzam tę stronę. Dziękuję.