To jest kanoniczne pytanie dotyczące Hairpin NAT (Loopback NAT).
Ogólna forma tego pytania brzmi:
Mamy sieć z klientami, serwer i router NAT. Na routerze jest przekierowanie portów na serwer, więc niektóre z jego usług są dostępne zewnętrznie. Mamy DNS wskazujący na zewnętrzny adres IP. Klienci sieci lokalnej nie mogą się połączyć, ale działają zewnętrzne.
- Dlaczego to się nie udaje?
- Jak mogę stworzyć ujednolicony schemat nazewnictwa (nazwy DNS, które działają zarówno lokalnie, jak i zewnętrznie)?
To pytanie zostało połączone z wielu innych pytań. Początkowo odnosiły się do FreeBSD, D-Link, Microtik i innych urządzeń. Wszyscy jednak próbują rozwiązać ten sam problem.
networking
nat
port-forwarding
internet
adopilot
źródło
źródło
Odpowiedzi:
To, czego szukasz, nazywa się „spinką do włosów NAT”. Żądania z interfejsu wewnętrznego adresu IP przypisanego do interfejsu zewnętrznego powinny być NAT'owane tak, jakby przychodziły z interfejsu strony zewnętrznej.
W ogóle nie znam znajomości FreeBSD, ale czytam instrukcję „pf” dla OpenBSD ( http://www.openbsd.org/faq/pf/rdr.html ) proponowanych rozwiązań DNS z dzielonym horyzontem, używając Sieć DMZ lub proxy proxy prowadzą mnie do przekonania, że „pf” nie obsługuje NAT-spinki do włosów.
Spojrzałbym na wybranie trasy DNS z rozłożonym horyzontem i nieużywanie adresów IP w adresach URL wewnętrznie, ale zamiast używania nazw.
źródło
no nat on $int_if proto tcp from $int_if to $int_net
,nat on $int_if proto tcp from $int_net to $hairpin_int port $hairpin_ports -> $int_if
,rdr on $int_if proto tcp from $int_net to $ext_if port $hairpin_ports -> $hairpin_int
Ponieważ zostało to podniesione do rangi kanonicznego pytania na temat spinki do włosów NAT , pomyślałem, że prawdopodobnie powinna mieć odpowiedź bardziej ogólnie poprawną niż obecnie akceptowana, która (choć doskonała) dotyczy konkretnie FreeBSD.
To pytanie dotyczy usług świadczonych przez serwery w sieciach IPv4 zaadresowanych do RFC1918, które są udostępniane użytkownikom zewnętrznym poprzez wprowadzenie docelowego NAT (DNAT) w bramie. Użytkownicy wewnętrzni następnie próbują uzyskać dostęp do tych usług za pośrednictwem adresu zewnętrznego. Ich pakiet wychodzi od klienta do urządzenia bramy, które przepisuje adres docelowy i natychmiast wstrzykuje go z powrotem do sieci wewnętrznej. To właśnie ten ostry zakręt, jaki pakiet wykonuje w bramie, daje początek nazwie spinki do włosów NAT , analogicznie do skrętu spinki do włosów .
Problem pojawia się, gdy urządzenie bramy przepisuje adres docelowy, ale nie adres źródłowy. Serwer następnie otrzymuje pakiet z wewnętrznym adresem docelowym (własnym) i wewnętrznym adresem źródłowym (klienta); wie, że może odpowiedzieć bezpośrednio na taki adres, więc robi to. Ponieważ odpowiedź ta jest bezpośrednia, nie przechodzi ona przez bramę, która nigdy nie ma szansy na zrównoważenie wpływu przychodzącej docelowej translacji adresów sieciowych na pakiet początkowy poprzez przepisanie adresu źródłowego pakietu zwrotnego.
W ten sposób klient wysyła pakiet na zewnętrzny adres IP, ale otrzymuje odpowiedź z wewnętrznego adresu IP. Nie ma pojęcia, że dwa pakiety są częścią tej samej konwersacji, więc rozmowa się nie dzieje.
Rozwiązaniem jest to, że dla pakietów, które wymagają takiego docelowego NAT i które docierają do bramy z sieci wewnętrznej , również wykonują źródłowy NAT (SNAT) na pakiecie przychodzącym, zwykle przez przepisanie adresu źródłowego na adres bramy. Serwer następnie myśli, że klient jest samą bramą i odpowiada bezpośrednio na nią. To z kolei daje bramie szansę na zrównoważenie wpływu DNAT i SNAT na pakiet przychodzący poprzez przepisanie adresów źródłowych i docelowych na pakiecie zwrotnym.
Klient myśli, że rozmawia z zewnętrznym serwerem. Serwer myśli, że rozmawia z urządzeniem bramy. Wszystkie strony są szczęśliwe. W tym momencie pomocny może być schemat:
Niektóre urządzenia bramy klienta są wystarczająco jasne, aby rozpoznać te pakiety, dla których potrzebny jest drugi krok NAT, i prawdopodobnie będą one działać natychmiast po wyjęciu z pudełka w scenariuszu NAT z serpentyną. Inne nie są, a więc nie, i jest mało prawdopodobne, że można je zmusić do pracy. Dyskusja na temat urządzeń klasy konsumenckiej, która jest nie na temat błędu serwera.
Właściwe urządzenia sieciowe można na ogół powiedzieć, aby działały, ale - ponieważ nie zajmują się odgadywaniem swoich administratorów - trzeba im to powiedzieć. Linux używa
iptables
DNAT w ten sposób:który włączy prosty DNAT dla portu HTTP do wewnętrznego serwera na
192.168.3.11
. Ale aby włączyć NAT typu spinka do włosów, potrzebna byłaby również taka zasada:Należy pamiętać, że takie reguły muszą znajdować się we właściwym miejscu w odpowiednich łańcuchach, aby działać poprawnie, aw zależności od ustawień w
filter
łańcuchu mogą być potrzebne dodatkowe reguły, aby umożliwić przepływ ruchu NATted. Wszystkie takie dyskusje są poza zakresem tej odpowiedzi.Ale, jak powiedzieli inni, prawidłowo włączająca NAT spinka do włosów nie jest najlepszym sposobem na rozwiązanie problemu. Najlepszym rozwiązaniem jest DNS z podziałem horyzontu , w którym Twoja organizacja podaje różne odpowiedzi dla pierwotnego wyszukiwania, w zależności od tego, gdzie znajduje się klient żądający, albo przez posiadanie różnych serwerów fizycznych dla użytkowników wewnętrznych i zewnętrznych, lub przez skonfigurowanie serwera DNS, aby reagował inaczej zgodnie z adres klienta żądającego.
źródło
iptables
pewnością możesz coś skonfigurować, jeśli tak wybierzesz.Problem polega na tym, że router nie ma adresu NAT adresu wewnętrznego klienta. Dlatego uzgadnianie TCP kończy się niepowodzeniem.
Załóżmy następujące adresy IP
Oto co się dzieje:
źródło
Dlaczego nie używać wszędzie podzielonych horyzontów DNS zamiast twardych adresów IP? Miałbyś ext. Twoja domena wskazująca na 217.xxx na zewnątrz, a następnie 192.xxx wewnątrz.
źródło
Jeśli jest to oryginalny router D-Link (tj. Nie Rev. D / Firmware wersja 1.00VG z Virgin Media), powinieneś być w stanie dostosować ustawienia, aby obejść ten problem. (Zgadzam się jednak z sugestią DD-WRT poprzedniego autora z wielu innych powodów!)
Ten zrzut ekranu pochodzi z modelu Rev. C; twój może być nieco inny.
źródło
Ostatnio odpowiedziałem na podobne pytanie: statyczny NAT Cisco nie działa po stronie sieci LAN i właśnie zdałem sobie sprawę, że jest to pytanie kanoniczne. Pozwólcie, że streszczę tutaj rozwiązanie.
Po pierwsze: zapomnij o NAT (jeśli możesz) - w ogóle nie chodzi o konfigurację NAT. Chodzi o dostęp do serwera umieszczonego za NAT zarówno z Internetu, jak i LAN. Zastosowanie dwóch stref DNS jest realną alternatywą, ale nie zawsze rozwiązaniem. Ale rozwiązanie istnieje i jest niezwykle proste (choć prawdopodobnie nie idealne):
(1) na serwerze: dodaj publiczny adres IP jako dodatkowy adres IP w interfejsie sieciowym serwera za pomocą maski 255.255.255.255 (usługa internetowa lub cokolwiek chcesz na serwerze, powinno nasłuchiwać również na tym adresie IP); wszystkie nowoczesne systemy operacyjne pozwolą ci to zrobić (lub zamiast dodania drugiego adresu IP do interfejsu podstawowego można użyć interfejsu sprzężenia zwrotnego z przypisanym do niego publicznym adresem IP).
(2) na hostach LAN: dodaj trasę hosta dla publicznego adresu IP, na przykład dla hostów Windows użyj następującej komendy: route -p dodaj 203.0.113.130 mask 255.255.255.255 192.168.1.11 (możesz również użyć DHCP ” trasa statyczna ”, aby rozdzielić trasę). Lub, jeśli między klientami a routerem internetowym znajduje się (a) przełącznik (-y) L3 / router (y), skonfiguruj trasę hosta na tym (tych) przełącznikach / routerach pośrednich, a nie na klientach.
Dla osób zainteresowanych potrójnym uzgadnianiem TCP: będzie działać OK w proponowanej konfiguracji.
Prześlij opinię (przynajmniej głosuj).
źródło
Zła odpowiedź na moje pytania, aby poszerzyć horyzonty dla osób z podobnymi problemami.
Skontaktowano się z moim dostawcą usług internetowych i poprosiłem go, aby spróbował rozwiązać moje problemy. To, co mi zaoferowali, to inny publiczny adres IP tylko dla serwera. Teraz mam ruch lokalny po stronie WAN FreeBSD i stworzyliśmy specjalne potoki dla szybszej przepustowości lokalnego ruchu do publicznego adresu IP serwera
źródło
Z technicznego punktu widzenia najlepszym rozwiązaniem tego problemu jest włączenie IPv6 w sieci. Gdy protokół IPv6 jest włączony, musisz utworzyć rekord AAAA dla swojej domeny. Zachowaj istniejący rekord A wskazujący na zewnętrzny IPv4 routera . Utwórz rekord AAAA wskazujący na adres IPv6 serwera .
IPv6 ma wystarczającą liczbę adresów, aby uniknąć translacji NAT, więc nie będziesz potrzebować translacji NAT dla IPv6. Po włączeniu protokołu IPv6 i utworzeniu rekordów AAAA każdy klient obsługujący standard RFC 8305 wypróbuje protokół IPv6 przed IPv4. Oznacza to, że nie potrzebujesz też spinki do włosów dla IPv4, ponieważ klienci nie będą jej używać.
Nadal będziesz potrzebować istniejącego NAT IPv4 dla połączeń wychodzących i przekierowania portów dla połączeń przychodzących, dopóki większość świata nie włączy również IPv6.
Jest też szybszy.
Korzystanie z IPv6 zapewni lepszą wydajność niż NAT-spinka do włosów.
Dzięki hairpin NAT twój klient wyśle pakiet przez przełącznik do routera, router następnie wykona dwie rundy tłumaczenia i ostatecznie wyśle pakiet przez przełącznik do serwera. Pakiety z serwera do klienta przechodzą przez całą ścieżkę w odwrotnej kolejności.
Dzięki IPv6 unikasz NAT, zamiast tego pakiety są wysyłane bezpośrednio przez przełącznik między klientem a serwerem. Oznacza to, że podczas podróży w obie strony zmniejszasz liczbę przejść przez przełącznik z 4 do 2 i unikasz 2 podróży przez router i 4 tłumaczeń, które wykonałby router. Przekłada się to na lepszą wydajność.
Jest to prawdą, nawet jeśli używasz przełącznika wbudowanego w to samo urządzenie co router.
Co jeśli dostawca usług internetowych nie ma IPv6?
Jeśli używasz usługodawcy internetowego, który nie obsługuje protokołu IPv6, zapytam, czy powinieneś hostować serwery w tej sieci. To są moje sugestie, co zrobić, jeśli dostawca usług internetowych nie obsługuje obecnie protokołu IPv6.
Najpierw powiedz dostawcy usług internetowych, że potrzebujesz IPv6. A może przypomnieć im, że protokół IPv6 istnieje już od 20 lat, więc od dawna go obsługują. Jeśli to nie wystarczy, aby dostawca usług internetowych wziął cię na poważnie, zacznij szukać innych dostawców usług internetowych.
Jeśli znajdziesz usługodawcę internetowego obsługującego protokół IPv6, możesz korzystać z niego przez okres przejściowy. Na routerze podłączonym do nowego dostawcy usług internetowych możesz wyłączyć IPv4 po stronie LAN, a następnie podłączyć strony LAN obu routerów do tego samego przełącznika. IPv4 i IPv6 to dwa niezależne protokoły i jako takie nie stanowi żadnego problemu, jeśli połączenia te przechodzą przez różne routery. Dodatkową korzyścią jest pewna nadmiarowość, jeśli jedno z połączeń ma awarię.
Jeśli nie możesz znaleźć usługodawcy internetowego obsługującego protokół IPv6, powinieneś rozważyć przeniesienie serwera do hostingu. Dzięki serwerowi w obiekcie hostingowym jesteś mniej zależny od lokalizacji geograficznej, dlatego między dostawcami jest większa konkurencja, która pomoże zapewnić taki, który zaspokoi twoje potrzeby.
Przeniesienie serwera do obiektu hostingowego nie da klientom IPv6, ale przeniesienie serwera oznacza, że nie jest już potrzebny do tego dostęp do translacji NAT.
Czego nie powinieneś robić
Nie włączaj IPv6 i nie twórz rekordów AAAA, jeśli nie masz sposobu na skierowanie ruchu IPv6. Jeśli twój dostawca usług internetowych nie obsługuje IPv6, ale mimo to zdecydujesz się włączyć IPv6 w twojej sieci LAN (być może przy użyciu adresów RFC 4193) i utworzyć rekordy AAAA, będzie działać dla klientów w twojej sieci LAN, którzy docierają do serwera w twojej sieci LAN. Ale komunikacja między twoją siecią LAN a światem zewnętrznym najpierw spróbowałaby IPv6 (który nie działałby), a ty polegałbyś na powrocie do IPv4, który w najlepszym razie jest trochę wolniejszy lub w najgorszym przypadku nie.
źródło
Ponieważ zadałem również to pytanie (zobacz Jak uzyskać dostęp do usługi sieciowej NATed za zaporą wewnętrzną za pomocą jej zewnętrznego adresu IP? ) I zostałem przekierowany tutaj, ale odpowiedzi tutaj nie zapewniły rozwiązania (w przeciwieństwie do ogólnych wyjaśnień ) podaj tutaj moje (
iptables
specyficzne) rozwiązanie dla systemu Linux , aby zaoszczędzić wszystkim kilka godzin eksperymentów. Ten plik maiptables-restore
format i można go wczytać bezpośrednio do iptables (oczywiście po edycji adresów IP). Dotyczy to serwera WWW (port 80) i tylko IPv4 - zasady dla IPv6 i SSL (port 443) są analogiczne.Zastąpić
lan.local
,web.local
aweb.public.com
z sieci lokalnej (np. 10.0.x.0 / 24), na serwer za lokalny IP (np 10.0.1.2) i routera publiczny adres IP (np. 4.5.6.7). Ma-4
to na celu zezwolenie na reguły IPv6 i IPv4 w tym samym pliku (takie linie są ignorowane przezip6tables
). Pamiętaj również, aby umieszczać adresy IPv6 w [nawiasach], gdy zawierają deklaracje portów, np[fe0a:bd52::2]:80
.Były to wszystko rzeczy, które spowodowały, że ciągnąć moje włosy podczas próby rzeczywiście wdrożyć wyjaśnień w tej kwestii. Mam nadzieję, że nic nie pominąłem.
źródło
Dodam tutaj odpowiedź, ponieważ komentarze tutaj nie rozwiązały mojego konkretnego problemu. Podejrzewam, że to dlatego, że trafiłem w nieprzyjemny błąd jądra Linuksa. Konfiguracja jest następująca:
Pomimo złożonego obrazu jedyną istotną zmianą w sytuacjach opisanych w innych komentarzach jest dodanie mostka programowego, br0. Jest tam, ponieważ brama jest także bezprzewodowym punktem dostępu do sieci LAN.
Nasz moduł bramy nadal wykonuje obowiązki NAT dla maszyn w sieci LAN. Ponieważ ma tylko 1 port ethernetowy, jest zmuszony wykonać NAT. Podejrzewam, że powinien po prostu działać z regułami iptables podanymi w innych komentarzach tutaj, ale w jądrze Linuksa 4.9 przynajmniej tak nie jest. Poniżej wersji 4.9 nasze pole bramkowe może uzyskać dostęp do Internetu, a maszyny w sieci LAN próbujące uzyskać do niego dostęp za pośrednictwem NAT nie mogą.
tcpdump
pokazuje odpowiedzi na przychodzące pakiety uderzające w eth0, ale nie robią tego z br0. Uruchomienie tego polecenia naprawia:Przed uruchomieniem tej komendy przychodzące pakiety są przetwarzane zgodnie z domyślnym zachowaniem jądra, które polega na przekazaniu ich do mostu, a następnie przekazaniu ich modułom routingu jądra. Polecenie zmusza pakiety, które nie są z sieci LAN, do ominięcia mostu i przejścia bezpośrednio do routingu, co oznacza, że most nie ma szansy ich upuścić. Adresy rozgłoszeniowe i multiemisji muszą być zmostkowane, w przeciwnym razie takie rzeczy jak DHCP i mDNS nie będą działać. jeśli używasz IPv6, musisz również dodać dla niego reguły.
Możesz ulec pokusie rozwiązania problemu za pomocą tego:
Z pewnością byłem tak kuszony - to była moja pierwsza próba. Jak tylko to zrobiłem, maszyny w sieci LAN uzyskały dostęp do Internetu, więc działa przez chwilę. Potem miały miejsce następujące zdarzenia (i nie chciałem powtarzać eksperymentu):
Jedynym wyjściem było ponowne uruchomienie każdej maszyny w budynku. Jedynym wyjątkiem były przełączniki sprzętowe, których nie można zrestartować. Musiały być zasilane cyklicznie.
źródło
Ponieważ jest to pytanie kanoniczne. Odpowiem, jeśli masz router Sonicwall.
Wyrażeniem, które należy znać, jest zasada sprzężenia zwrotnego NAT
Zasady sprzężenia zwrotnego przy użyciu adresu IP interfejsu WAN
Sonicwall rozpozna usługę zewnętrzną, z którą próbujesz się skontaktować, i przepisze adres docelowy, aby pasował do wewnętrznego adresu serwera, dzięki czemu będzie przezroczysty dla komputera.
źródło
W FreeBSD przy użyciu PF jest to łatwe, ponieważ (w pliku pf.conf):
192.168.20.8 byłby wewnętrznym serwerem WWW.
źródło