Wybierz swój język

Podstawy sieci z Cisco IOS. Moduł 3: NAT/PAT

W sieci wewnętrznej najczęściej stosuje się adresy IP z podsieci prywatnych, które to zostały zdefiniowane w dokumencie RFC 1918. Mowa o blokach adresowych 10.0.0.0/8, 172.16.0.0/12 i 192.168.0.0/16, które to nie są routowalne w sieci Internet. Należy jednak pamiętać, że są to zwykłe adresy IP, stąd mogą być one bez problemów routowalne w naszej sieci wewnętrznej.

Aby móc komunikować się z innymi w sieci Internet wymagane jest zastąpienie tych adresów prywatnych, adresami publicznymi. Odbywa się to najczęściej na brzegu sieci i realizowane jest z użyciem funkcji NAT/PAT, opisanej w RFC 3022.

NAT (Network Address Translation) realizuje podmianę adresów IP. PAT (Port Address Translation) podmienia dodatkowo numery portów UDP/TCP lub jakiś ich odpowiedników w innych protokołach. NAT/PAT powstał w tym samym celu co już omówione w tym module: FLSM, VLSM i CIDR. Zatem głównym celem NAT/PAT było zmniejszenie zużycia adresów IPv4.

W trakcie realizacji funkcji NAT/PAT urządzenie prowadzi tablicę, nazywaną tablicą translacji. Jej zawartość została pokazana na slajdzie, gdzie widać jeden wpis NAT i kilka wpisów PAT. Dzięki niej urządzenie wykonujące translację wie dokładnie, jakie parametry uległy modyfikacji i jest w stanie ten proces odwrócić dla ruchu wracającego.

Biorąc pod uwagę, że dziś również możemy realizować translacje z użyciem IPv6 (NAT66), a nawet pomiędzy IPv4, a IPv6 (NAT64), to często się już spotyka określenie NAT44 dla translacji realizowanych pomiędzy adresami IPv4. Niemniej obecnie, kiedy ktoś używa samego sformułowania NAT, to zwykle chodzi właśnie o NAT44. NAT czy NAT44 został opisany w dokumencie RFC 3022.

Implementacja NAT/PAT w Cisco IOS wprowadza podział na adresy wewnętrzne (inside) i zewnętrzne (outside). Do pierwszych należy sieć wewnętrzna, a do drugich sieć zewnętrzna, czy też sieć Internet. Dodatkowo, każdy z tych światów może być inaczej postrzegany lokalnie czy też wewnątrz, a inaczej globalnie czy też na zewnątrz. Stąd wyróżnia się cztery typy adresów:

  • Inside Local - adres przynależny do wewnętrznych urządzeń, pod jakim są one widoczne w sieci lokalnej,
  • Inside Global - adres przynależny do wewnętrznych urządzeń, pod jakim są one widoczne w sieci globalnej,
  • Outside Local - adres przynależny do zewnętrznych urządzeń, pod jakim są one widoczne w sieci lokalnej,
  • Outside Global - adres przynależny do zewnętrznych urządzeń, pod jakim są one widoczne w sieci globalnej.

Mówimy tutaj zarówno o adresach lokalnych, jak i globalnych, jako że translacja może dotyczyć zarówno jednego z nich, jak i obu. Zatem możemy dokonywać translacji zarówno adresu źródłowego, jak i docelowego. My w tym module skupimy się na dość tradycyjnym zastosowaniu, jakim jest zamiana adresu źródłowego w pakietach wysłanych z sieci lokalnej do sieci globalnej, jaką jest sieć Internet. Funkcja taka jest realizowana najczęściej na styku z siecią Internet. Jest to tak zwany Source NAT.

Za sprawą NAT/PAT duża ilość urządzeń sieci wewnętrznej może być reprezentowana w sieci Internet pod jednym czy też pod mniejszą ilością adresów IP publicznych. Adresy publiczne czy też inaczej globalne muszą być w ramach sieci Internet unikalne. Jako że ich brakuje, a ilość użytkowników, usług i urządzeń w sieci Internet ciągle rośnie są one bardzo cenne. W przypadku adresów prywatnych, jakie stosowane są w różnych sieciach wewnętrznych wystarczy, że będę unikalne w ramach danej sieci wewnętrznej. Niemniej bez NAT/PAT urządzenia z adresami prywatnymi, nie mogłyby korzystać z zasobów dostępnych w sieci Internet.

Z czasem funkcja NAT/PAT znalazła o wiele szersze zastosowania. Obecnie wykorzystywana jest podczas łączenia różnych sieci, niekiedy nawet wewnątrz tuneli VPN Site-to-Site, również przy rozkładzie obciążenia na wiele serwerów, a także ukrywania sieci czy też blokowania bezpośredniego dostępu dla sieci wewnętrznej. Dlatego aktualnie z adresacji prywatnej i NAT/PAT korzysta się nawet tam, gdzie mamy wystarczającą ilość adresów publicznych. Z adresacją prywatną łatwiej da się opracować intuicyjny i bardzo skalowalny plan adresacji, który dalej można powielać na kolejne lokalizacje czy oddziały.


Zajmiemy się tu najbardziej tradycyjnym czy powszechnym wykorzystaniem NAT/PAT. Jest nim zapewnienie sieci wewnętrznej, która stosuje adresację prywatną, zgodną z RFC 1918, komunikacji z siecią Internet.

Na początku musimy określić, które interfejsy urządzenia podłączone są do sieci wewnętrznej, a które w stronę sieci zewnętrznej. Dokonać tego można z użyciem poleceń trybu konfiguracji interfejsu, odpowiednio "ip nat inside" lub "ip nat outside". Będziemy dokonywać zamiany źródłowego adresu wewnętrznego lokalnego (Inside Local), na adres wewnętrzny globalny (Inside Global), na drodze z "inside" do "outside". Dlatego określenie tych dwóch stron, części czy stref jest niezbędne. Translacja odwrotna będzie realizowana automatycznie na podstawie powstałych wcześniej wpisów w tablicy translacji.


Pierwszym typem translacji jest statyczny NAT. Tworzy on w tablicy translacji odwzorowanie jeden-do-jeden, pomiędzy adresem lokalnym i globalnym. Wpis ten jest statycznie wprowadzany do tablicy translacji i istnieje w niej do czasu, aż go ręcznie usuniemy. 

Do stworzenia tego wpisu służy polecenie trybu konfiguracji globalnej "ip nat inside source static", po którym najpierw podajemy adres wewnętrzny lokalny (Inside Local), a potem wewnętrzny globalny (Inside Global). W poleceniu tym pojawiają się parametry "inside source", jako że zamieniamy adres źródłowy (source) w pakietach, jakie wychodzą z sieci wewnętrznej (inside).

Statyczny NAT często też jest nazywany przekierowaniem adresu IP. 

Ruch z sieci Internet, jaki będzie zaadresowany do adresu globalnego, będzie automatycznie trafiał do adresu lokalnego. Adres lokalny nie musi inicjować połączenia jako, że wpisy statyczne są w tablicy translacji od momentu ich wprowadzenia. Dlatego ten rodzaj translacji najczęściej stosowany jest dla serwerów usługowych, które potrzebują mieć swój indywidualny adres globalny.


Drugim typem translacji jest dynamiczny NAT. Również tworzy on odwzorowanie jeden-do-jeden, niemniej wpisy translacji tworzone są dynamicznie na podstawie listy ACL określającej ruch czy też adresy lokalne (Inside Local) oraz puli określającej zakres adresów globalnych (Inside Global). Widzimy zatem tutaj kolejne zastosowanie omówionych wcześniej list ACL.

W dynamicznym NAT, dla każdego kolejnego adresu lokalnego przydzielany jest adres globalny. Niemniej, wpis pojawia się w tablicy translacji dopiero, kiedy z sieci wewnętrznej zostanie zainicjowany ruch do sieci zewnętrznej. Dopiero wtedy też będziemy wiedzieli, który z adresów globalnych z puli został przydzielony i powiązany z danym adresem lokalnym. Wpisy te mają ważność, zatem wygasają i są usuwane automatycznie z tablicy translacji, kiedy przez określony czas nie ma powiązanego z nimi ruchu.

Zastosować możemy tutaj dowolny typ listy kontroli dostępu, niemniej w praktyce często stosuje się rozszerzone listy nazwane, jako iż są one najbardziej elastyczne i intuicyjne. W naszym przykładzie użyliśmy standardowej listy numerowanej. Zależy nam tu tylko na określeniu adresów źródłowych, które mają podlegać translacji do każdego miejsca w sieci zewnętrznej, jaką jest sieć Internet.

Do określenia adresów wewnętrznych globalnych (Inside Global), na które będzie odbywała się translacja służy polecenie trybu konfiguracji globalnej "ip nat pool", po którym podajemy nazwę puli, pierwszy i ostatni adres (zakres łączny, stąd kiedy ma to być tylko 1-adres, to trzeba go powtórzyć) oraz maskę podsieci lub długość prefiksu. Ten ostatni parametr może wydawać się zbędny, skoro już podaliśmy przedział, z którego chcemy brać kolejne globalne adresy IP. Niemniej, często dochodziło do pomyłek i zdarzało się, że ktoś podawał w tym zakresie adresy nieużyteczne, jak adres sieci i rozgłoszeniowy. Stąd, gdybyśmy przez przypadek tak zrobili, to ta maska czy prefiks zabezpiecza nas przed konsekwencjami i wykluczy te adresy z puli. Jedyną niedogodnością będzie niespójność statystyk, bo może się okazać, że pula nie będzie w 100% wykorzystana, a nie będziemy mogli przydzielić już kolejnego adresu. Dlatego mimo tego zabezpieczenia, zalecamy podawanie poprawne zakresu (bez adresu sieci i rozgłoszeniowego).

Kiedy mamy już listę ACL oraz pulę NAT, należy je powiązać ze sobą. Dokonać tego można z użyciem polecenia trybu konfiguracji globalnej "ip nat inside source", gdzie część Inside Local wskazujemy z użyciem parametru "list", a część "Inside Global" z użyciem parametru "pool". Zatem składnia jest dość analogiczna do tej, jaką widzieliśmy przy statycznym NAT.


Trzeci rodzaj translacji to statyczny PAT. Tworzy on odwzorowanie jeden-do-jeden, pomiędzy wewnętrzny adresem i portem lokalnym, a wewnętrzny adresem i portem globalnym. Podobnie jak przy statycznym NAT, statyczny PAT tworzy trwały wpis w tablicy translacji. Zatem będzie on w niej dopóki nie zostanie usunięty ręcznie.

Statyczny PAT nazywany jest często przekierowaniem portu. Umożliwia on przekierowanie z danego adresu globalnego różnych portów do wybranych adresów i portów lokalnych. Należy jednak pamiętać, że dany numer portu w ramach danego protokołu (TCP/UDP) w adresie globalnym może zostać użyty tylko jeden raz.

Sposób konfiguracji jest bardzo analogiczny. Znowu używamy polecenia trybu konfiguracji globalnej "ip nat inside source static", ale tym razem musimy określić protokół parametrem "tcp" lub "udp" i dalej podać część "Inside Local" oraz część "Inside Global". Niemniej, części te składają się już z adresu i portu. Wartość portu w obu częściach może być taka sama lub różna.

Statyczny PAT można także ustawić ze wskazaniem interfejsu wyjściowego w stronę sieci Internet w miejscu przeznaczonym na część Inside Global. Stosowane jest to często tam, gdzie adres globalny przydzielany jest dynamicznie, dla przykładu z użyciem DHCP i może się zmieniać. Wpis z użyciem interfejsu jest aktualizowany za każdym razem, gdy zmieni się adres IP interfejsu.


Czwartym typem translacji jest dynamiczny PAT. Tworzy on odwzorowania wiele-do-jeden lub wiele-do-kilku, pomiędzy adresem i portem lokalnym, a adresem i portem globalnym. Wpisy w tablicy translacji powstają dopiero, kiedy zainicjowany zostanie ruch z sieci wewnętrznej do sieci zewnętrznej i mają czas ważności.

Sposób konfiguracji jest bardzo podobny do dynamicznego NAT. Cała różnica polega na dodaniu parametru "overload" na samym końcu polecenia "ip nat inside source", które wiąże listę ACL definiującą adresy wewnętrzne lokalne z ustawioną pulą adresów wewnętrznych globalnych lub interfejsem wyjściowym użytym do translacji.

O ile statyczny PAT lub NAT stosowany jest, kiedy chcemy udostępnić dla sieci Internet usługi znajdujące się w sieci wewnętrznej, to dynamiczny PAT stosowany jest najczęściej dla wszystkiego co potrzebuje korzystać z zasobów znajdujących się w sieci Internet.


Do weryfikacji konfiguracji i statystyk NAT/PAT służy polecenie EXEC "show ip nat statistics". Wyświetla ono podsumowanie naszej konfiguracji, w tym podział na sieć wewnętrzną i zewnętrzną (widoczne na niebieskawym tle), ilość wszystkich translacji z podziałem na wpisy statyczne (static) i dynamiczne (dynamic) oraz informacją ile z nich to wpisy rozszerzone (extended), czyli posiadające w tablicy translacji dodatkowe informacje, jak dla przykładu numery portów TCP/UDP (widoczne jest to na żółtawym tle).

Te rozszerzone wpisy tworzone są domyślnie również dla dynamicznego NAT, choć nie wydaje się to potrzebne, jak w przypadku PAT. Da się to wyłączyć z użyciem polecenia trybu konfiguracji globalnej "no ip nat create flow-entries", niemniej nie jest to zwykle zalecane. Te rozszerzone wpisy są dodawanie do tak zwanego "Flow Cache", co zwiększa wydajność przy wyszukiwaniu właściwego wpisu. Niemniej zużywa to też zasoby urządzenia, dlatego przy bardzo dużej ilości translacji czy dużej skali NAT, wyłączenie tego mechanizmu może być wymagane. Szczególnie, gdy w takim scenariuszu zaczyna nam brakować pamięci RAM.

Na naszym zrzucie widać wpis o "Id: 5", który dotyczy translacji dynamicznej NAT oraz wpis o "Id: 6" dotyczący translacji dynamicznej PAT. Na kolejnym slajdzie będziemy mogli zobaczyć parametr "Map-Id(In):", który się odnosi do tych identyfikatorów. Mamy też wskazany tutaj parametr "refcount", który wskazuje ilość wpisów tablicy translacji powiązanych z konfiguracją NAT/PAT o danym "Id". Zatem z pierwszy wpisem, gdzie "refcount" wynosi jeden, jest powiązany jeden wpis w tablicy translacji. Z drugim, gdzie "refcount" wynosi dwa, są powiązane dwa wpisy w tablicy translacji.

Wpisy statyczne (NAT/PAT) nie będą tu widoczne i należy szukać ich w konfiguracji bieżącej lub tablicy translacji.


Zawartość tablicy translacji można wylistować poleceniem trybu EXEC "show ip address translations" lub też jego rozszerzoną wersją "show ip address translations verbose". Wynik wykonania obu tych poleceń widać poniżej. Są na nim widoczne cztery typy translacji, jakie omówiliśmy. W związku z tym, że robiliśmy tak zwany Source NAT, czyli zamianę adresu źródłowego w pakietach wychodzących z naszej sieci wewnętrznej (stąd polecenie "ip nat inside source"), to mapowania pomiędzy różnymi adresami IP będzie widać tylko w kolumnach "Inside Global" i "Inside Local". Za to kolumny "Outside Local" i "Outside Global" będą takie same, jako że nie manipulujemy tym, jak adresy z sieci Internet czy sieci zewnętrznej mają być widoczne w naszej sieci wewnętrznej.

Warto odnieść te informacje do tego co widać na poprzednim slajdzie. Głównie chodzi o pola "Id:" i "Map-Id(In):", które określają powiązanie. Z lewej strony zrzutu mamy typ wpisu ("static", "extended" lub "none"). Mamy 6 wpisów translacji, z tego 1 typu "static". To co w tablicy translacji powstało na skutek statycznego NAT i statycznego PAT zostało oznaczone zielonymi klamrami na lewo od pola zrzutu poleceń. Zawartość powiązana z dynamicznym NAT i dynamicznego PAT oznaczona jest żółtymi klamrami. Widać, że dynamiczny NAT pomimo jednej translacji tworzy też wpis nadrzędny dla adresu, który jest typu "none", a dynamiczny PAT tego nie robi. Zarówno wpisy dynamiczne, jak i statyczne PAT są klasyfikowane jako typu "extended". Stąd mamy 4 wpisy typu "extended".

Z każdym wpisem powiązany jest czas ważności. Czas życia dla wpisów PAT zależy też od tego, z jakim protokołem mamy do czynienia oraz stanem sesji TCP. Czasy te można modyfikować, a ich domyślne wartości widać w lewym dolnym rogu slajdu.


Wpisy dynamiczne można usunąć z tablicy translacji z wykorzystaniem polecenia trybu EXEC "clear ip nat translation". Z użyciem odpowiedniego parametru tego polecenia można usunąć wszystko lub tylko wskazane wpisy.

Wpisy statyczne widoczne są w konfiguracji bieżącej i usuwa się je klasycznie, poprzez zanegowanie wcześniej wydanego polecenia z użyciem "no". Wpisy statyczne nie mają czasu ważności, stąd działają od momentu ich wprowadzenia do momentu ich usunięcia.


Funkcja NAT/PAT jest transparentna dla komunikujących się stron, zatem nie są one świadome zachodzącego procesu translacji, co czasem może powodować pewne problemy. Dlatego tam, gdzie potrzebny jest proces wykrywania obecności NAT/PAT oraz możliwości zestawienia optymalnego, a czasem i bezpośredniego połączenia pomiędzy komunikującymi się stronami, stosowane są dodatkowe rozwiązania, jak m.in. STUN (Session Traversal Utilities for NAT), TURN (Traversal Using Relays Around NAT) i ICE (Interactive Connectivity Establishment). Są one szczególnie powszechnie stosowane w dzisiejszej komunikacji głosowej i wideo.

W takim największym skrócie, STUN (RFC 5389) służy do wykrywania NAT/PAT oraz naszych globalnych adresów IP i portów. TURN (RFC 8656) stosowany jest wtedy, gdy obie strony są za symetrycznym czy dynamicznym NAT/PAT, gdzie nie zostają zachowane numery portów i nie mogą bezpośrednio zestawić kanału komunikacji. Natomiast ICE (RFC 8445) pomaga w określeniu najbardziej optymalnego wyboru czy najbardziej optymalnego sposobu nawiązania komunikacji. Im bardziej bezpośrednio, tym lepiej.

Zatem w rozwiązaniach Cisco Collaboration do pomocy przy NAT/PAT stosowany jest Cisco Expressway posiadający wszystkie te funkcjonalności i/lub czasem funkcja CUBE (Cisco Unified Border Element) dostępna w m.in. routerach Cisco Catalyst 8000.

A w rozwiązaniu Cisco SD-WAN pomaga nam w tym vBond (SD-WAN Validator). Dzięki dostępnej w nim funkcjonalności STUN jest on w stanie pomóc urządzeniu brzegowemu zarówno w określeniu tego, czy na danym jego połączeniu stosowany jest NAT/PAT, jak i tego, pod jakim adresem jest ono widoczne w sieci publicznej. Dzięki temu możliwe jest zestawianie tuneli VPN nawet z urządzeniami będącymi za niektórymi typami NAT/PAT.

Ogólnie NAT/PAT może wprowadzać pewne niedogodności w bezpośredniej komunikacji, czego powinniśmy być świadomi.


Przed kolejną porcją wiedzy zachęcamy do przećwiczenia i utrwalenia tej poznanej tutaj. Skorzystaj z naszych ćwiczeń!


Zachęcamy do śledzenia nas w mediach społecznościowych Facebook i LinkedIn.


Zapraszamy do kontaktu drogą mailową Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript. lub telefonicznie +48 797 004 932 lub +48 797 004 938.