Zanim zaczęliśmy brakować adresów IPv4, nie korzystaliśmy (powszechnie) z NAT. Każdy komputer podłączony do Internetu miałby swój unikalny globalnie adres. Kiedy NAT został wprowadzony po raz pierwszy, miał przejść od podania klientom ISP 1 rzeczywistego adresu na urządzenie, z którego klient korzystał / był właścicielem, do podania 1 klientowi 1 rzeczywistego adresu. To rozwiązało problem przez jakiś czas (lata), podczas gdy mieliśmy przejść na IPv6. Zamiast przejścia na IPv6 (głównie) wszyscy czekali, aż wszyscy inni się przełączą, więc (głównie) nikt nie wdrożył IPv6. Teraz znów napotykamy ten sam problem, ale tym razem wdrażana jest druga warstwa NAT (CGN), aby dostawcy usług internetowych mogli współdzielić 1 prawdziwy adres między wieloma klientami.
Wyczerpanie adresu IP nie jest wielkim problemem, jeśli NAT nie jest straszny, w tym w przypadku, gdy użytkownik końcowy nie ma nad nim kontroli (NAT klasy Carrier lub CGN).
Twierdziłbym jednak, że NAT jest okropny, szczególnie w przypadku, gdy użytkownik końcowy nie ma nad nim kontroli. I (jako osoba, której praca polega na inżynierii sieci / administracji, ale ma stopień inżyniera oprogramowania) argumentowałbym, że wdrażając NAT zamiast IPv6, administratorzy sieci przesunęli ciężar rozwiązania wyczerpania adresu poza swoje pole i na użytkowników końcowych i twórcy aplikacji.
Więc (moim zdaniem), dlaczego NAT jest straszną, złą rzeczą, której należy unikać?
Zobaczmy, czy mogę to sprawiedliwie wyjaśnić, co psuje (i jakie problemy powodują, że jesteśmy tak przyzwyczajeni, że nawet nie zdajemy sobie sprawy, że może być lepiej):
- Niezależność warstwy sieci
- Połączenia peer-to-peer
- Spójne nazewnictwo i lokalizacja zasobów
- Optymalne kierowanie ruchem, hosty znające swój prawdziwy adres
- Śledzenie źródła złośliwego ruchu
- Protokoły sieciowe oddzielające dane i sterujące w osobne połączenia
Zobaczmy, czy mogę wyjaśnić każdy z tych elementów.
Niezależność warstwy sieci
Dostawcy usług internetowych powinni po prostu ominąć pakiety warstwy 3 i nie dbać o to, co znajduje się w warstwach powyżej. Niezależnie od tego, czy omijasz TCP, UDP, czy coś lepszego / bardziej egzotycznego (może SCTP? Lub nawet inny protokół, który jest lepszy niż TCP / UDP, ale jest niejasny z powodu braku obsługi NAT), twój dostawca usług internetowych nie powinien opieka; wszystko to ma im przypominać dane.
Ale tak nie jest - nie wtedy, gdy wdrażają „drugą falę” NAT, NAT „Carrier Grade”. Następnie muszą koniecznie przyjrzeć się i wspierać protokoły warstwy 4, których chcesz użyć. W tej chwili praktycznie oznacza to, że możesz używać tylko TCP i UDP. Inne protokoły byłyby albo blokowane / upuszczane (zdecydowana większość przypadków z mojego doświadczenia), albo po prostu przekazywane do ostatniego hosta „wewnątrz” NAT, który używał tego protokołu (widziałem 1 implementację, która to robi). Nawet przekazywanie do ostatniego hosta, który używał tego protokołu, nie jest prawdziwą poprawką - gdy tylko dwa hosty go użyją, psuje się.
Wyobrażam sobie, że istnieją pewne protokoły zastępcze dla TCP i UDP, które są obecnie niesprawdzone i nieużywane tylko z powodu tego problemu. Nie zrozumcie mnie źle, TCP i UDP zostały imponująco dobrze zaprojektowane i zadziwiające jest to, jak udało im się skalować do dzisiejszego sposobu korzystania z Internetu. Ale kto wie, co przeoczyliśmy? Czytałem o SCTP i brzmi dobrze, ale nigdy go nie użyłem, ponieważ był niepraktyczny z powodu NAT.
Połączenia peer to peer
Ten jest duży. Właściwie największe według mnie. Jeśli masz dwóch użytkowników końcowych, którzy stoją za swoim NATem, bez względu na to, który z nich spróbuje się połączyć jako pierwszy, NAT drugiego użytkownika porzuci swój pakiet i połączenie się nie powiedzie.
Wpływa to na gry, czat głosowy / wideo (np. Skype), hosting własnych serwerów itp.
Istnieją obejścia. Problem polega na tym, że te obejścia kosztują albo czas programisty, czas użytkownika końcowego i niedogodności, albo koszty infrastruktury usługowej. I nie są niezawodne i czasami pękają. (Zobacz komentarze innych użytkowników na temat awarii spowodowanej przez Skype.)
Jednym obejściem jest przekierowanie portów, w którym programuje się urządzenie NAT do przekazywania określonego portu przychodzącego do określonego komputera za urządzeniem NAT. Istnieją całe strony internetowe poświęcone temu, jak to zrobić dla wszystkich różnych urządzeń NAT. Zobacz https://portforward.com/ . Zwykle kosztuje to czas użytkownika końcowego i frustrację.
Innym obejściem jest dodanie obsługi aplikacji, takich jak dziurkowanie, i utrzymanie infrastruktury serwera, która nie stoi za NAT, w celu wprowadzenia dwóch klientów NATed. Zwykle kosztuje to czas programowania i stawia programistów w pozycji potencjalnie utrzymującej infrastrukturę serwerów tam, gdzie nie byłaby wcześniej wymagana.
(Pamiętasz, co powiedziałem o wdrażaniu NAT zamiast IPv6, przenoszeniu ciężaru problemu z administratorów sieci na użytkowników końcowych i twórców aplikacji?)
Spójne nazewnictwo / lokalizacja zasobów sieciowych
Ponieważ wewnątrz NAT jest używana inna przestrzeń adresowa niż na zewnątrz, każda usługa oferowana przez urządzenie wewnątrz NAT ma wiele adresów, z których można do niej dotrzeć, a poprawny do użycia zależy od tego, skąd klient uzyskuje do niej dostęp . (Jest to nadal problem, nawet po uruchomieniu przekierowania portów).
Jeśli masz serwer WWW wewnątrz NAT, powiedzmy na porcie 192.168.0.23 port 80, a twoje urządzenie NAT (router / brama) ma adres zewnętrzny 35.72.216.228 i skonfigurowałeś przekierowanie portów dla portu TCP 80, teraz twój Dostęp do serwera WWW można uzyskać przy użyciu portu 80.1.1.1.0.0.23 80 LUB 35.72.216.228 portu 80. Ten, którego należy użyć, zależy od tego, czy znajdujesz się w NAT, czy poza nim. Jeśli jesteś poza NAT i używasz adresu 192.168.0.23, nie dotrzesz do miejsca, w którym się spodziewasz. Jeśli jesteś wewnątrz NAT i użyć adresu zewnętrznego 35.72.216.228, wy może dotrzeć tam, gdzie chcesz, jeśli NAT realizacja jest zaawansowanym, który obsługuje zakręt, ale wtedy serwer WWW obsługujący twoje żądanie zobaczy żądanie jako pochodzące z twojego urządzenia NAT. Oznacza to, że cały ruch musi przechodzić przez urządzenie NAT, nawet jeśli za NAT jest krótsza ścieżka w sieci, a to oznacza, że logi na serwerze WWW stają się znacznie mniej przydatne, ponieważ wszystkie one wymieniają urządzenie NAT jako źródło połączenie. Jeśli twoja implementacja NAT nie obsługuje szpilki do włosów, nie dotrzesz tam, gdzie się spodziewałeś.
Problem ten nasila się, gdy tylko użyjesz DNS. Nagle, jeśli chcesz, aby wszystko działało poprawnie dla czegoś hostowanego za NAT, będziesz chciał udzielić różnych odpowiedzi na adres usługi hostowanej wewnątrz NAT, w zależności od tego, kto pyta (DNS DNS split split, IIRC). Fuj
A wszystko to przy założeniu, że masz kogoś znającego się na przekierowywaniu portów i translacji adresów sieciowych NAT oraz DNS DNS z podziałem horyzontu. Co z użytkownikami końcowymi? Jakie są szanse, że wszystko to zostanie skonfigurowane, gdy kupią router konsumencki i kamerę bezpieczeństwa IP i chcą, żeby „po prostu działała”?
I to prowadzi mnie do:
Optymalne kierowanie ruchem, hosty znające swój prawdziwy adres
Jak widzieliśmy, nawet przy zaawansowanym ruchu NAT spinki do włosów nie zawsze przepływa przez optymalną ścieżkę. Dzieje się tak nawet w przypadku, gdy znający się na rzeczy administrator konfiguruje serwer i ma spinki do włosów NAT. (Przyznaję, DNS DNS z podzielonym horyzontem może prowadzić do optymalnego routingu wewnętrznego ruchu w rękach administratora sieci.)
Co się stanie, gdy twórca aplikacji utworzy program taki jak Dropbox i przekaże go użytkownikom końcowym, którzy nie specjalizują się w konfigurowaniu sprzętu sieciowego? W szczególności, co się stanie, gdy włożę plik 4 GB do mojego pliku udostępniania, a następnie spróbuję uzyskać dostęp na następnym komputerze? Czy transferuje się bezpośrednio między komputerami, czy też muszę czekać na przesłanie go do serwera w chmurze za pośrednictwem wolnego połączenia WAN, a następnie poczekać drugi raz, aż pobierze przez to samo wolne połączenie WAN?
W przypadku naiwnej implementacji zostanie on przesłany, a następnie pobrany przy użyciu infrastruktury serwerowej Dropbox, która nie stoi za NAT jako mediator. Ale jeśli te dwa komputery mogłyby tylko zorientować się, że są w tej samej sieci, mogłyby po prostu przenieść plik znacznie szybciej. Dlatego podczas naszej pierwszej mniej naiwnej próby wdrożenia możemy zapytać system operacyjny, jaki adres IP (v4) ma komputer, a następnie sprawdzić, czy w porównaniu z innymi komputerami zarejestrowanymi na tym samym koncie Dropbox. Jeśli jest w tym samym zakresie co my, po prostu prześlij plik bezpośrednio. To może działać w wielu przypadkach. Ale nawet wtedy pojawia się problem: NAT działa tylko dlatego, że możemy ponownie wykorzystywać adresy. A co jeśli adres 192.168.0.23 i 192.168.0. 42 adresy zarejestrowane na tym samym koncie Dropbox są w rzeczywistości w różnych sieciach (takich jak sieć domowa i sieć służbowa)? Teraz musisz wrócić do korzystania z infrastruktury serwera Dropbox do mediacji. (W końcu Dropbox próbował rozwiązać problem, każąc każdemu klientowi Dropbox nadawać w sieci lokalnej w nadziei na znalezienie innych klientów. Ale te transmisje nie przechodzą przez żadne routery, które możesz mieć za NAT, co oznacza, że nie jest to pełne rozwiązanie ,szczególnie w przypadku CGN .)
Statyczne adresy IP
Ponadto, ponieważ pierwszy niedobór (i fala NAT) miał miejsce, gdy wielu klientów nie zawsze korzystało z połączeń (takich jak połączenie telefoniczne), dostawcy usług internetowych mogliby lepiej wykorzystywać ich adresy, przydzielając publiczne / zewnętrzne adresy IP tylko wtedy, gdy użytkownik był faktycznie podłączony. Oznaczało to, że po nawiązaniu połączenia masz dostęp do dowolnego dostępnego adresu, zamiast zawsze otrzymywania tego samego adresu. To sprawia, że prowadzenie własnego serwera jest o wiele trudniejsze i utrudnia tworzenie aplikacji peer-to-peer, ponieważ muszą radzić sobie z poruszającymi się użytkownikami, zamiast przebywać pod ustalonymi adresami.
Zaciemnianie źródła złośliwego ruchu
Ponieważ NAT ponownie zapisuje połączenia wychodzące tak, jakby pochodziły z samego urządzenia NAT, całe zachowanie, dobre lub złe, jest zrolowane na jeden zewnętrzny adres IP. Nie widziałem żadnego urządzenia NAT domyślnie rejestrującego każde połączenie wychodzące. Oznacza to, że domyślnie źródło przeszłego złośliwego ruchu można prześledzić tylko do urządzenia NAT, przez które przeszło. Chociaż więcej urządzeń klasy korporacyjnej lub operatora można skonfigurować do rejestrowania każdego połączenia wychodzącego, nie widziałem żadnych routerów konsumenckich, które to robią. Z pewnością uważam, że interesujące będzie sprawdzenie, czy (i jak długo) dostawcy usług internetowych będą rejestrować wszystkie połączenia TCP i UDP nawiązywane za pośrednictwem CGN podczas ich wdrażania. Takie dane byłyby potrzebne do rozpatrywania skarg dotyczących nadużyć i skarg DMCA.
Niektórzy uważają, że NAT zwiększa bezpieczeństwo. Jeśli tak, robi to przez zaciemnienie. Domyślny spadek ruchu przychodzącego, który NAT jest obowiązkowy, jest taki sam, jak posiadanie zapory ogniowej z funkcją stanową. Rozumiem, że każdy sprzęt zdolny do śledzenia połączenia niezbędnego dla NAT powinien być w stanie uruchomić stanową zaporę ogniową, więc NAT tak naprawdę nie zasługuje na żadne punkty.
Protokoły korzystające z drugiego połączenia
Protokoły takie jak FTP i SIP (VoIP) zwykle używają oddzielnych połączeń do kontroli i rzeczywistej zawartości danych. Każdy protokół, który to robi, musi mieć oprogramowanie pomocnicze o nazwie ALG (brama warstwy aplikacji) na każdym urządzeniu NAT, przez które przechodzi, lub obejść ten problem za pomocą jakiegoś mediatora lub dziurkowania. Z mojego doświadczenia wynika, że ALG są rzadko, jeśli w ogóle aktualizowane, i były przyczyną co najmniej kilku problemów, z którymi miałem do czynienia w związku z SIP. Za każdym razem, gdy słyszę, że ktoś donosi, że VoIP nie działał dla nich, ponieważ dźwięk działał tylko w jedną stronę, od razu podejrzewam, że gdzieś jest brama NAT upuszczająca pakiety UDP, z którą nie może dowiedzieć się, co z tym zrobić.
Podsumowując, NAT ma tendencję do pękania:
- protokoły alternatywne do TCP lub UDP
- systemy peer-to-peer
- dostęp do czegoś hostowanego za NAT
- rzeczy takie jak SIP i FTP. ALG do obejścia tego problemu nadal powodują losowe i dziwne problemy, szczególnie w przypadku SIP.
U podstaw warstwowe podejście stosu sieciowego jest stosunkowo proste i eleganckie. Spróbuj wyjaśnić to nowicjuszowi w dziedzinie sieci, a oni nieuchronnie zakładają, że ich sieć domowa jest prawdopodobnie dobrą, prostą siecią do zrozumienia. Widziałem to w kilku przypadkach do dość interesujących (nadmiernie skomplikowanych) pomysłów dotyczących działania routingu z powodu pomieszania adresów zewnętrznych i wewnętrznych.
Podejrzewam, że bez NAT VoIP byłby wszechobecny i zintegrowany z PSTN, a wykonywanie połączeń z telefonu komórkowego lub komputera byłoby bezpłatne (z wyjątkiem Internetu, za który już zapłaciłeś). W końcu dlaczego miałbym płacić za telefon, skoro ty i ja możemy po prostu otworzyć strumień VoIP 64K i działa on równie dobrze jak PSTN? Wygląda na to, że dzisiaj problem numer 1 przy wdrażaniu VoIP dotyczy urządzeń NAT.
Podejrzewam, że zwykle nie zdajemy sobie sprawy, o ile prostsze mogłoby być wiele rzeczy, gdybyśmy mieli do końca łączność, która przerwała NAT. Ludzie nadal sami wysyłają pliki (lub Dropbox), ponieważ stanowią podstawowy problem z koniecznością korzystania z mediatora, gdy dwóch klientów stoi za NAT.