NAT ang. Network Address Translation dr inż. Gerard Bursy
NAT ang. Network Address Translation NAT technika przesyłania ruchu sieciowego poprzez router, która wiąże się ze zmianą źródłowych lub docelowych adresów IP, zwykle również numerów portów TCP/UDP pakietów IP podczas ich przepływu. Zmieniane są także sumy kontrolne (zarówno w pakiecie IP jak i w segmencie TCP/UDP), aby potwierdzić wprowadzone zmiany. Większość systemów korzystających z NAT ma na celu umożliwienie dostępu wielu hostom sieci prywatnej do internetu przy wykorzystaniu pojedynczego publicznego adresu IP. Niemniej NAT może spowodować komplikacje w komunikacji między hostami oraz może mieć pewien wpływ na osiągi.
NAT ang. Network Address Translation Translacja adresów sieciowych NAT została opisana po raz pierwszy w dokumencie RFC 1631 (The IP Network Address Translator (NAT) w roku 1994. Autorzy tego dokumentu próbowali rozwiązać problem wyczerpywania się adresów IPv4 i zaproponowali proste, lecz bardzo pomysłowe rozwiązanie polegające na pozwoleniu urządzeniom w sieci wewnętrznej używać standardowej puli niezarejestrowanych adresów IP zdefiniowanych w dokumencie RFC 1918 (Address Allocation for Private Internets). Router albo zapora ogniowa pomiędzy wewnętrzną siecią prywatną a zewnętrzną siecią publiczną może np. programowo przepisywać wewnętrzne adresy IP w każdym pakiecie, zastępując je prawidłowymi zarejestrowanymi adresami. Istnieją cztery rodzaje adresów: wewnętrzne lokalnie (ang. inside local), wewnętrzne globalne (ang. inside global), zewnętrzne lokalne (ang. outside local), zewnętrzne globalne (ang. (outside global). Gdy łączymy dwie sieci prywatne, terminy wewnętrzny i zewnętrzny są względne. Jednak gdy łączymy sieć prywatną z internetem, internet zawsze uznajemy za sieć zewnętrzną. Adres lokalny jest z reguły adresem prywatnym, natomiast adres globalny jest niepowtarzalnym adresem publicznym.
NAT ang. Network Address Translation W dokumencie RFC 1918 adresy prywatne zostały podzielone na następujące grupy: klasę A 10.0.0.0/8 (10.0.0.0 10.255.255.255), klasę B 172.16.0.0/12 (172.16.0.0 172.31.255.255), klasę C 192.168.0.0/16 (192.168.0.0 192.168.255.255). NAT pozwala na reprezentację ogromnej sieci wewnętrznej z tysiącami adresów lokalnych przez kilka adresów globalnych (w skrajnym przypadku przez jeden). Właśnie dlatego translację adresów uważa się lekarstwem na niedobór adresów IP. Zaletą technologii NAT jest wyższy poziom bezpieczeństwa sieci prywatnej, ponieważ routery ukrywają komputery pracujące w tej sieci.
NAT ang. Network Address Translation NAT realizowany jest w celu: umożliwienia dostępu do sieci większej ilości hostów niż ilość dostępnych adresów IP, podniesienia poziomu bezpieczeństwa sieci prywatnej, uproszczenia administracji siecią prywatną. Podział sposobu realizacji translacji adresów: translacja statyczna (NAT), translacja dynamiczna (NAT), translacja z przeciążeniem (PAT).
Translacja statyczna NAT (ang. static NAT) Translacja statyczna (ang. static NAT) polega na przypisaniu jednego adresu wewnętrznego do jednego adresu zewnętrznego. Gdy w sieci wewnętrznej istnieje dwadzieścia adresów (z możliwością połączenia z siecią zewnętrzną), tyle samo potrzebnych jest adresów zewnętrznych. Podczas konfiguracji translacji statycznej konieczne jest wyznaczenie interfejsów wewnętrznych (znajdujących się po stronie sieci wewnętrznej) oraz interfejsów zewnętrznych (znajdujących się po stronie sieci zawietrznej).
Translacja dynamiczna NAT (ang. dynamic NAT) Translacja dynamiczna (ang. dynamic NAT) polega na przypisaniu w sieci odpowiednio dużej puli adresów IP, która będzie wykorzystywana do translacji. Oznacza to, że w sieci lokalnej składającej się z dwudziestu hostów administrator może przypisać pulę tylko dla dziesięciu hostów. W taki sposób redukuje się ilość adresów wymaganych do translacji. Liczba hostów, które będą mogły komunikować się z siecią zewnętrzną jest ograniczona przez ilość dostępnych adresów NAT (adresy na które tłumaczymy). Gdy wszystkie adresy NAT zostaną użyte kolejne połączania nie mogą być realizowane i muszą być odrzucone przez router NAT powiadamiając nadawcę. Dynamiczny NAT jest bardziej złożony od statycznego gdyż musi przechowywać informacje o dodatkowej translacji.
Translacja z przeciążeniem (ang. overloaded NAT czyli PAT) Translacja z przeciążeniem (ang. overloaded NAT) do swojego działania standardowo wykorzystuje jeden wewnętrzny adres globalny. Aby umożliwić hostom w sieci wewnętrznej komunikację z siecią zewnętrzną NAT z przeciążeniem wykorzystuje numery portów. W związku z tym, NAT z przeciążeniem często zwany jest PAT (ang. Port Address Translation). Oznacza to, że każdy adres wewnętrzny komunikuje się z zewnętrznym adresem globalnym za pomocą portów adresu globalnego. Wewnętrzny adres lokalny Wewnętrzny adres globalny 192.168.10.112:23575 217.97.150.34:23575 192.168.10.114:23576 217.97.150.34:23576 192.168.10.115:23577 217.97.150.34:23577 192.168.10.118:34574 217.97.150.34:34574 Przyglądając się powyższej tabeli, można zauważyć, że tak naprawdę wszystkie adresy sieci lokalnej widoczne są w internecie jako adres 217.97.150.34.
Konfiguracja statycznego NATu Konfiguracja statycznego NAT, gdzie występuje translacja jeden-do-jednego, czyli na jeden adres prywatny przypada jeden publiczny, nie jest skomplikowana. Najpierw należy określić interfejsy zewnętrzne i wewnętrzne. Na schemacie dla routera R2 interfejsami wewnętrznymi będą FastEthernet0/1 oraz Serial0/0, natomiast interfejsem zewnętrznym będzie FastEthernet0/0. Zakładając że posiadamy jeden adres publiczny i chcemy, aby podczas translacji korzystała z niego stacja robocza 172.16.5.2. Konfiguracja będzie wyglądała następująco: R2#config t Enter configuration commands, one per line. End with CNTL/Z. R2(config)#interface fastethernet 0/1 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/0 R2(config-if)#ip nat outside R2(config-if)# W kolejnym kroku należy wydać polecenie ip nat inside source static [adres_ip_stacji_lokalnej] [adres_ip_publiczny]: R2(config)#ip nat inside source static 172.16.5.2 95.160.155.172 R2(config-if)#
Konfiguracja dynamicznego NATu Podczas konfiguracji NAT dynamicznego powstaje pula adresów publicznych. Pula ta wykorzystywana jest do dynamicznej translacji określonych hostów w sieci lokalnej. Na początek należy określić role poszczególnych interfejsów, np. tak jak poniżej: R2#config t Enter configuration commands, one per line. End with CNTL/Z. R2(config)#interface serial 0/0 0/1 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/1 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/0 R2(config-if)#ip nat outside R2(config-if)# Następnie należy zdefiniować pulę adresów publicznych (globalnych), które będą brały udział w translacji (przykładowo 9 adresów od 95.160.155.172 do 95.160.155.180) ip nat pool [nazwa_puli] [przedział_adresów_publicznych] netmask [maska_sieci_wykorzystywana_w_adresach_publicznych]: R2(config)#ip nat pool PULA_NAT_TESTOWA 95.160.155.172.95 95.160.155.180 netmask 255.255.255.224
Konfiguracja dynamicznego NATu Podczas konfiguracji NAT dynamicznego powstaje pula adresów publicznych. Pula ta wykorzystywana jest do dynamicznej translacji określonych hostów w sieci lokalnej. Na początek należy określić role poszczególnych interfejsów, np. tak jak poniżej: R2#config t Enter configuration commands, one per line. End with CNTL/Z. R2(config)#interface serial 0/0 0/1 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/1 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/0 R2(config-if)#ip nat outside R2(config-if)# Następnie należy zdefiniować pulę adresów publicznych (globalnych), które będą brały udział w translacji (przykładowo 9 adresów od 95.160.155.172 do 95.160.155.180) ip nat pool [nazwa_puli] [przedział_adresów_publicznych] netmask [maska_sieci_wykorzystywana_w_adresach_publicznych]: R2(config)#ip nat pool PULA_NAT_TESTOWA 95.160.155.172.95 95.160.155.180 netmask 255.255.255.224
Konfiguracja dynamicznego NATu c.d. Następnie należy utworzyć listę ACL, w której zdefiniowane zostaną hosty sieci lokalnej, które będą mogły korzystać z translacji. W tym celu należy wydać polecenie access-list [nr_listy] permit [adres_sieci_lokalnej] [maska odwrócona]: R2(config)#access-list 1 permint 172.16.0.0 0.0.255.255 zgodnie z powyższym listingiem wszystkie hosty z sieci 172.16.0.0/16 będą mogły uczestniczyć w translacji. Ostatnim krokiem jest korelacja listy dostępu z utworzoną pulą. W tym celu należy wydać polecenie ip nat inside source [nr_listy_dostepu] pool [utworzona-lista]: R2(config)#ip nat inside soutce list 1 pool PULA_NAT_TESTOWA
Konfiguracja NAT z przeciążeniem Rysunek przedstawia prostą sieć z dwoma hostami i routerem, na którym zostanie uruchomiona usługa NAT, będzie to R2. Interfejsowi FastEthernet0/0 jest przypisany adres IP publiczny. Konfigurację zaczynamy od wyznaczenia interfejsów zewnętrznego oraz wewnętrznych. W przykładzie interfejsami wewnętrznymi będą Serial0/0 oraz FastEthernet0/1. Interfejs zewnętrzny to interfejs, do którego podpięta jest sieć zewnętrzna, w przykładzie internet czyli FastEthernet0/0. Konieczna jest ich konfiguracja. Polecenie ip nat inside umożliwia konfigurację wybranego interfejsu jako interfejsu wewnętrznego. Natomiast polecenie ip nat outside interfejsu zewnętrznego. Taka konfiguracja odbywa się w trybie pracy interfejsu: R2#conf t Enter configuration commands. one per line. End with CNTL/Z. R2(config)#interface serial 0/0 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/1 R2(config-if)#ip nat inside R2(config-if)#exit R2(config)#interface fastethernet 0/0 R2(config-if)#ip nat outside R2(config-if)#
Konfiguracja NAT z przeciążeniem c.d. Na tym etapie router nie zna adresów, które będą brać udział w translacji. Dlatego konieczne jest wskazanie" routerowi, jakie to adresy lub całe sieci będą mogły korzystać z usługi NAT. Świetnym narzędziem, które się do tego nadaje, jest lista ACL. W przykładzie Utworzymy standardową listę nazywaną. Załóżmy, że naszym celem jest umożliwienie całej sieci korzystania z natowania" na routerze R2, jednak z wyjątkiem sieci hostów w sieci 172.16.4.0. Taką listę musimy zatem utworzyć. Oto przykład: R2#conf t Enter configuration commands. one per line. End with CNTL/Z. R2(config)#ip access-list? extended Extended Access List log-update Control access list log updates logging Control access list logging resequence Resequence Access List standard Standard Access List po wpisaniu znaku zapytania za poleceniem ip acces-list pojawiają się różne tryby tworzonej listy dostępu. Wcześniej założyliśmy, że będzie to lista nazy wana standardowa, dlatego wybieramy parametr standard: R2(config)#ip access-list standard? <l-99> Standard IP access-list number <1300-1999> Standard IP access-list number (expanded range) WORD Access-list name
Konfiguracja NAT z przeciążeniem c.d. Za parametrem standard ponownie wpisujemy pytajnik, aby sprawdzić, jakie dostępne parametry można wybrać. Oczywiście, można nadać tworzonej liście ACL numer, jednak w naszym przypadku lista będzie nazywana. Wybieramy więc dowolną nazwę, np. NATOWANIE. Oto przykład: R2(config)#ip access-list standard NATOWANIE R2(config-std-nacl)#deny 172.16.4.0 0.0.0.255 R2(config-std-nacl)#permit 172.16.0.0 0.0.255.255 R2(config-std-nacl)# Po przejściu do trybu konfiguracji listy ACL podajemy odpowiednie instrukcje. Pierwszą deny jest blokada całej sieci 172.16.4.0/24. Druga instrukcja permint umożliwia dostęp do usługi natowania całej sieci 172.16.0.0/16. Aby sprawdzić utworzoną listę ACL należy wydać polecenie show access - list. Oto przykład: R2#sh access-list Standard IP access list NATOWANIE 10 deny 172.16.4.0. wildcard bits 0.0.0.255 20 permit 172.16.0.0. wildcard bits 0.0.255.255 R2# Jak widać, powstała jedna lista o nazwie NATOWANIE posiadająca dwie jawne instrukcje. Jednak należy pamiętać, że w każdej liście ACL istnieje jeszcze instrukcja niejawna zabraniająca całego ruchu niepasującego do reszty instrukcji.
Konfiguracja NAT z przeciążeniem c.d. Po skonfigurowaniu interfejsów i list ACL można włączyć NAT z przeciążeniem i umożliwić stacjom roboczym korzystanie z internetu. Służy do tego polecenie wydane w konfiguracji globalnej routera R2 ip nat inside source list [nazwa_lub_numer_listy_acl] interface [interfejs] overload: R2#conf t Enter configuration commands, one per line. End with CNTL/Z. R2(config)#ip nat inside source list NATOWANIE interface FastEthernet 0/0 overload R2(config)# Może powyższe polecenie wydaje się skomplikowane, jednak jest całkiem logiczne. Parametr inside określa, jakie adresy będą poddane translacji. Ponieważ chcemy, aby były jej poddane adresy wewnętrzne, dlatego za poleceniem ip nat podaliśmy inside. Parametr source list [nazwa_lub_numer_listy_acl] określa, że adresy wewnętrzne będą natowane na podstawie następującej listy ACL. Kolejny parametr - interface - określa, przez jaki interfejs odbędzie się translacja. I na końcu występuje najważniejszy parametr, czyli overload, który jest informacją dla routera, że translacja ma być translacją z przeciążeniem. Reasumując, wydane polecenie może być zinterpretowane następująco: chcę natować adresy z sieci wewnętrznej do sieci zewnętrznej (ip nat inside). Adresy źródłowe będą natowane na podstawie listy ACL NATOWANIE (source list NATOWANIE). Chcąc je natować na zewnątrz przez interfejs FastEthernet0/0 (interface FastEthernet 0/0) z przeciążeniem (overload).
Translacja mieszana: niektóre adresy w sposób statyczny, a inne dynamiczny W niektórych przypadkach zachodzi potrzeba translacji części adresów w sposób statyczny, a innych w sposób dynamiczny. Wówczas niektóre urządzenia wewnętrzne będą zawsze otrzymywały określone adresy wewnętrzne, a pozostałe będą używały puli dynamicznej. Przydaje się to wtedy, gdy mamy kilka wewnętrznych serwerów, które muszą być dostępne z zewnątrz sieci, a inne urządzenia dokonują tylko połączeń wychodzących: Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#access-list 15 dany 192.168.1.15 0.0.0.0 Router(config)#access-list 15 deny 192.168.1.16 0.0.0.0 Router(config)#access-list 15 permit 192.168.0.0 0.0.255.255 Router(config)#ip nat inside source static 192.168.1.15 172.16.1.10 Router(config)#ip nat inside source static 192.168.1.16 172.16.1.11 Router(config)#ip nat pool PULANAT 172.16. 1. 100 1 72.16.1.150 netnask 255.255.255.0 Router(config)#ip nat inside source list 15 pool PULANAT overload Router(config)#interface FastEthernet0/0 Router(conflg-if)#ip address 192.168.1.1 255.255.255.0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)#interface FastEthernet0/l Router(config-if)#ip address 192.168.2.1 255.255.255.0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)#interface Ethernet0/0 Router(config-if)#ip address 172.16.1.2 255.255.255.0 Router(config-if)#ip nat outside Router(config-if)#end Router#
Translacja mieszana: niektóre adresy w sposób statyczny, a inne dynamiczny c.d. W przykładowej recepturze jako pulę adresów dynamicznych wybrano adresy z zakresu od 172.16.1.100 do 172.16.1.150, łącząc ją z dwiema translacjami statycznymi 172.16.1.10 i 172.16.1.11. Takie łączenie technik NAT bywa przydatne zwłaszcza, jeśli połączenie między sieciami ma kilka różnych zastosowań. Niektóre aplikacje muszą działać z dobrze znanymi adresami IP, a inne mogą bez problemu korzystać z puli dynamicznej. Lista dostępu w przykładzie jawnie wyklucza dwa adresy, które będą używać translacji statycznej (a nie dynamicznej). Nie jest to konieczne, ponieważ statyczne polecenia NAT mają w routerze pierwszeństwo przed poleceniami dynamicznymi. Warto to jednak zrobić, aby każdy, kto obejrzy konfigurację routera, mógł łatwo zrozumieć intencje administratora. Inną ważną kwestią w tym przykładzie jest to, że jawnie usunięto statyczne adresy NAT z dynamicznej puli NAT. Pula dynamiczna obejmuje zakres 172.16.1.100-172.16.1.150, a adresy statyczne to 172.16.1.10 i 172.16.1.11. Jest to szczególnie ważne, ponieważ dynamiczna translacja NAT nie sprawdza, czy dany adres z puli jest skonfigurowany do statycznej translacji NAT. Jeśli nie nastąpi jawne oddzielenie adresów statycznych od dynamicznych, można doprowadzić do poważnych konfliktów adresów.
Jednoczesna (mieszana) translacja w obu kierunkach Czasem zachodzi potrzeba aby tłumaczyć adresy IP zarówno w interfejsie wewnętrznym, jak i zewnętrznym. Może się tak zdarzyć, na przykład, wtedy, gdy chcemy połączyć się z inną siecią, która używa nakładającego się zakresu niezarejestrowanych adresów. Routery Cisco potrafią jednocześnie tłumaczyć adresy w interfejsach zewnętrznych i wewnętrznych: Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#access-list 15 deny 192.168.1.15 Router(config)#access-list 15 permit 192.168.0.0 0.0.255.255 Router(config)#access-list 16 deny 172.16.5.25 Router(config)#access-list 16 permit 172.16.0.0 0.0.255.255 Router(config)#ip nat pool PULANAT 172.16.1.100 172.16.1.150 netmask 255.255.255.0 Router(config)#ip nat pool WEJSCIOWYNAT 192.168.15.100 192.168.15.200 netmask 255.255.255.0 Router(config)#ip nat inside source list 15 pool PULANAT overload Router(config)#ip nat outside source list 16 pool WEJSCIOWYNAT overload Router(config)#ip nat inside source static 192.168.1.15 172.16.1.10 Router(config)#ip nat outside source static 172.16.5.25 192.168.25.5 Router(config)#ip route 192.168.15.0 255.255.255.0 Ethernet0/0 Router(config)#interface FastEthernet0/0 Router(config-if)#ip address 192.168.1.1 255.255.255.0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)#interface FastEthernet0/1 Router(config-if)#ip address 192.168.2.1 255.255.255.0 Router(config-if)#ip nat inside c.d.n.
Jednoczesna (mieszana) translacja w obu kierunkach c.d. c.d. Router(config-if)#interface Ethernet0/0 Router(config-if)#ip address 172.16.1.2 255.255.255.0 Router(config-if)#ip nat outside Router(config-if)#end Router# W tym przypadku router będzie przepisywał adresy zewnętrzne z zakresu 172.0.0.0/16 w taki sposób, żeby pozornie należały do podsieci 192.168.15.0/24 w zakresie określonym przez pulę WEJSCIOWYNAT. Jednocześnie będzie przepisywał adresy wewnętrzne stanowiące część podsieci 192.168.0.0/16 w taki sposób, aby na zewnątrz pojawiały się jako adresy stanowiące część podsieci 172.16.1.0/24 w zakresie określonym przez pulę PULANAT. Należy zauważyć, że listy dostępu definiujące, które adresy powinny używać dynamicznej puli adresów, odnoszą się do rzeczywistych adresów (wewnętrznych lokalnych i zewnętrznych globalnych). Zatem w przypadku urządzeń wewnętrznych lista dostępu powinna odnosić się do prawdziwych adresów wewnętrznych, a lista dla urządzeń zewnętrznych powinna odnosić się do rzeczywistych adresów zewnętrznych.
Jednoczesna (mieszana) translacja w obu kierunkach c.d. (wariant II) Podstawowym powodem korzystania z tej funkcji jest rozwiązanie konfliktu wynikającego z nakładania się zakresów adresów. Poniższy przykład pokazuje, jak rozwiązać konflikt między dwiema sieciami, które używają wszechobecnego zakresu adresów 10.0.0.0/8. Odwzorujemy sieć zewnętrzną na zakres 11.0.0.0/8, a sieć wewnętrzną na zakres 12.0.0.0/8. Zauważmy, że oba te zakresy adresów są zarejestrowanymi numerami sieci, więc operacja ta może spowodować problemy z dostępem do internetu. Jest to tylko środek tymczasowy, który pozwala rozwiązać konflikt adresów IP spowodowany scaleniem dwóch sieci z nakładającymi się zakresami adresów: Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#access-list 17 permit 10.0.0.0 0.255.255.255 Router(config)#access-list 13 permit 10.0.0.0 0.255.255.255 Router(config)#ip nat pool PULAWYJSC 11.0.0.1 11.255.255.254 netmask 255.0.0.0 type match-host Router(config)#ip nat pool PULAWEJSC 12.0.0.1 12.255.255.254 netmask 255.0.0.0 type match-host Router(config)#ip nat inside source list 17 pool PULAWEJSC Router(config)#ip nat outside source list 13 pool PULAHYJSC Router(config)#ip route 11.0.0.0 255.0.0.0 Ethernet0/0 Router(config)#ip route 12.0.0.0 255.0.0.0 FastEthernet1/0 Router(config)#interface FastEthernet1/0 Router(config-if)#ip address 10.1.1.1 255.255.255.0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)#interface Ethernet0/0 Router(config-if)#ip address 10.2.1.2 255.255.255.0 Router(config-if)#ip nat outside Router(config-if)#end Router#
Jednoczesna (mieszana) translacja w obu kierunkach c.d. (wariant II) Zauważmy, że w definicjach pul NAT użyto słowa kluczowego match-host: Router(config)#ip nat pool PULAHYJSC 11.0.0.1 11.255.255.254 netmask 255.0.0.0 type match-host Kiedy użyjemy tej opcji, router będzie tłumaczył tylko prefiks sieci, a część adresu określająca host pozostanie niezmieniona. Tak więc w tym przykładzie adres IP 10.1.2.3 zostanie zmieniony na 11.1.2.3 zmieniony zostałby tylko pierwszy bajt. Największą zaletą tej metody jest to, że translacje są zawsze takie same, można więc niezawodnie nawiązywać połączenia między dowolnymi urządzeniami wewnętrznymi i zewnętrznymi w obu kierunkach. Nie da się tego zrobić za pomocą dynamicznych pul adresów. Należy zwrócić uwagę, że w tej konfiguracji słowo kluczowe overload nie ma sensu. Używając dwukierunkowej translacji adresów, trzeba pamiętać o kilku kwestiach. Po pierwsze, w tablicy routingu routera muszą znajdować się wpisy dotyczące fikcyjnych adresów IP. Jest bardzo prawdopodobne, że przetłumaczone adresy urządzeń zewnętrznych nie będą częścią fizycznej sieci IP, do której router potrafi dotrzeć. Właśnie dlatego skonfigurowaliśmy trasę statyczną, która kieruje ruch należący do tego zakresu przez interfejs zewnętrzny: Router(config)#ip route 11.0.0.0 255.255.255.0 Ethernet0/0 W przypadku dynamicznego tłumaczenia adresów router nie tworzy translacji dla każdego urządzenia, dopóki nie musi. Jeśli chcemy się łączyć przez router z określonym przetłumaczonym adresem, musimy sprawić, aby router zachowywał informacje w tablicy translacji. Oznacza to, że jeśli potrzebujemy połączeń każdy z każdym" w obu kierunkach, musimy użyć albo odwzorowań statycznych, albo słowa kluczowego match-host. Dynamiczna translacja nie pozwoli na dostęp w obu kierunkach. Dodatkowo wszystkie inne routery muszą wiedzieć, jak dotrzeć pod przetłumaczony adres. Jeśli więc sieć zewnętrzna jest tłumaczona z zakresu 10.0.0.0/8 w 11.0.0.0/8, trzeba poinformować routery wewnętrzne, że mogą dotrzeć do tej fikcyjnej sieci 11.0.0.0/8 przez router NAT. Najlepiej zrobić to, po prostu redystrybuując statyczne trasy fikcyjnych sieci za pośrednictwem dynamicznego protokołu routingu.
Regulowanie zegarów NAT Router przechowuje wpisy NAT w tablicy translacji przez konfigurowalny czas. W przypadku połączeń TCP domyślny limit czasu wynosi 86 400 sekund, czyli 24 godziny. Ponieważ protokół UDP nie obsługuje połączeń, jego domyślny limit czasu jest znacznie krótszy - tylko 300 sekund (5 minut). Router usuwa z tablicy translacji wpisy dotyczące zapytań DNS już po 60 sekundach. Można zmodyfikować te parametry za pomocą polecenia ip nat translation, podając argumenty w sekundach: Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ip nat translation tcp-timeout 500 Router(config)#ip nat translation udp-timeout 30 Router(config)#ip nat translation dns-timeout 30 Router(config)#ip nat translation icmp-ti/neout 30 Router(config}#ip nat translation finrst-tiraeout 30 Router(config)#ip nat translation syn-timeout 30 Router(config)#end Router# Aby oszczędzić pamięć routera, można również zdefiniować maksymalną liczbę wpisów w tablicy translacji NAT: Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ip nat translation max-entries 1000 Router(config)#end Router#
Regulowanie zegarów NAT c.d. Istnieje wiele powodów modyfikowania tych limitów czasu; większość z nich wiąże się z wydajnością routera. Jeśli sesje są zwykle krótkotrwałe, długie przechowywanie wpisów NAT byłoby marnotrawstwem pamięci. Parametry finrst-timeout i syn-timeout przydają się również wtedy, gdy router jest podłączony do internetu, ponieważ pomagają w zapobieganiu atakom DoS opartym na wysyłaniu pakietów sterujących TCP takich jak SYN, ACK i FIN. Jeśli router przechowuje wpisy związane z tymi pakietami przez krótki czas, można ograniczyć konsekwencje takich ataków. Polecenia max-entries należy używać ze szczególną rozwagą: Router(config)#ip nat translation max~entries 1000 Gdy ustawimy taki limit, router będzie odrzucał dodatkowe próby użycia NAT. W tym przykładzie, gdybyśmy mieli już 1000 wpisów w tablicy, router po prostu odrzucałby próby nawiązania nowych połączeń. Może to być przydatny sposób zapobiegania przeciążeniu routera przez nadmierne przetwarzanie NAT, ale w ten sposób można również zablokować uzasadnione próby dostępu. Ogólnie rzecz biorąc, trudno określić użyteczny górny limit rozmiaru tablicy NAT. W większości przypadków najlepiej użyć ustawienia domyślnego, które nie narzuca górnego limitu. Polecenia tego należy używać tylko wtedy, gdy mamy poważne problemy z wykorzystaniem pamięci albo procesora. Ograniczenie rozmiaru tablicy powoduje odrzucanie dalszych żądań przez router, więc tą metodą należy posługiwać się tylko w ostateczności. W większości przypadków lepiej jest zmniejszyć różne limity czasu, jak pokazano w tej recepturze. Aby dobrać rozmiar tablicy najpierw obejrzyjmy tablicę translacji NAT i ustalmy, jak wygląda większość wpisów. Jeśli używamy opcji overload, może się okazać, że istnieje po kilka różnych wpisów na każdy wewnętrzny host z innymi numerami portów lub protokołów. Prawdopodobnie najlepiej zacząć od względnie długiego, 24- godzinnego limitu czasu sesji TCP. Zmniejszenie rozmiaru tablicy NAT przez zredukowanie tego limitu czasu nie spowoduje żadnych problemów z aplikacjami.
Regulowanie zegarów NAT c.d. Istnieje wiele powodów modyfikowania tych limitów czasu; większość z nich wiąże się z wydajnością routera. Jeśli sesje są zwykle krótkotrwałe, długie przechowywanie wpisów NAT byłoby marnotrawstwem pamięci. Parametry finrst-timeout i syn-timeout przydają się również wtedy, gdy router jest podłączony do internetu, ponieważ pomagają w zapobieganiu atakom DoS opartym na wysyłaniu pakietów sterujących TCP takich jak SYN, ACK i FIN. Jeśli router przechowuje wpisy związane z tymi pakietami przez krótki czas, można ograniczyć konsekwencje takich ataków. Polecenia max-entries należy używać ze szczególną rozwagą: Router(config)#ip nat translation max-entries 1000 Gdy ustawimy taki limit, router będzie odrzucał dodatkowe próby użycia NAT. W tym przykładzie, gdybyśmy mieli już 1000 wpisów w tablicy, router po prostu odrzucałby próby nawiązania nowych połączeń. Może to być przydatny sposób zapobiegania przeciążeniu routera przez nadmierne przetwarzanie NAT, ale w ten sposób można również zablokować uzasadnione próby dostępu. Ogólnie rzecz biorąc, trudno określić użyteczny górny limit rozmiaru tablicy NAT. W większości przypadków najlepiej użyć ustawienia domyślnego, które nie narzuca górnego limitu. Polecenia tego należy używać tylko wtedy, gdy mamy poważne problemy z wykorzystaniem pamięci albo procesora. Ograniczenie rozmiaru tablicy powoduje odrzucanie dalszych żądań przez router, więc tą metodą należy posługiwać się tylko w ostateczności. W większości przypadków lepiej jest zmniejszyć różne limity czasu, jak pokazano w tej recepturze. Aby dobrać rozmiar tablicy najpierw obejrzyjmy tablicę translacji NAT i ustalmy, jak wygląda większość wpisów. Jeśli używamy opcji overload, może się okazać, że istnieje po kilka różnych wpisów na każdy wewnętrzny host z innymi numerami portów lub protokołów. Prawdopodobnie najlepiej zacząć od względnie długiego, 24- godzinnego limitu czasu sesji TCP. Zmniejszenie rozmiaru tablicy NAT przez zredukowanie tego limitu czasu nie spowoduje żadnych problemów z aplikacjami.
Zmiana portów TCP używanych przez FTP Gdy serwer FTP, który używa niestandardowego numeru portu. Protokół FTP umieszcza informacje adresowe IP w treści pakietu. Implementacja NAT w routerach Cisco zwykle przepisuje informacje adresowe w pakietach FTP, sprawdzając każdy pakiet wysyłany na port TCP 21, czyli na port używany domyślnie przez FTP do przekazywania informacji sterujących sesją. Jeśli więc serwer FTP używa niestandardowego numeru portu do sterowania sesją, trzeba skonfigurować router tak, aby oczekiwał pakietów FTP na porcie o innym numerze: Router#configure terminal Enter configuration commands, one per line. End with CNTL/Z. Router(config)#access-list 29 permit 192.168.55.5 Router(config)#ip nat service list 19 ftp tcp port 8021 Router(config)#ip nat service list 19 ftp tcp port 21 Router(config)#end Router# Jak wspomniano we wprowadzeniu do tego rozdziału, protokół FTP dołącza informacje adresowe IP do treści pakietu. Routery Cisco uwzględniają to i odpowiednio przepisują informacje, jednak niektóre serwery FTP używają niestandardowego numeru portu TCP, co oznacza, że translacja NAT zakłóci działanie protokołu, i dlatego począwszy od wersji 11.3 systemu IOS firma Cisco wprowadziła możliwość wykrywania informacji adresowych w treści pakietów wysyłanych z portów o innych numerach. Powyższy przykład konfiguruje router tak, aby oczekiwał pakietów FTP przeznaczonych do serwera o adresie 192.168.55.5 zarówno na porcie domyślnym o numerze 21, jak i na niestandardowym porcie o numerze 8021. Można łatwo dodać podobne polecenia na użytek innych serwerów albo rozszerzyć listę dostępu tak, aby obejmowała kilka serwerów używających tego samego niestandardowego numeru portu FTP.
Sprawdzenie działania NATu Aby sprawdzić bieżące informaq'e NAT. Istnieje kilka przydatnych poleceń EXEC do sprawdzania stanu NAT w routerze. Tablicę translacji NAT można obejrzeć, używając polecenia: Router#show ip nat translation Można usunąć całą tablicę translacji NAT albo jej część, podając gwiazdkę (*) albo konkretny adres. Aby usunąć określony wpis, trzeba podać albo globalny adres urządzenia, które znajduje się wewnątrz, albo lokalny adres urządzenia, które znajduje się na zewnątrz: Router#clear ip nat translation * Router#clear ip nat translation inside 172.18.3.2 Router#clear ip nat translation outside 192.168.1.10 Warto również obejrzeć dane statystyczne NAT, aby dowiedzieć się, które interfejsy używają NAT, ile wpisów znajduje się w tablicy NAT, jak często z nich korzystano i - co najważniejsze - jak często pakiety omijały NAT. W tym celu należy wydać polecenie show ip nat statistics: Router#show ip nat statistics Dane statystyczne można wyzerować poleceniem: Router#clear ip nat statistics
Sprawdzenie działania NATu c.d. Tablica translacji NAT zawiera informacje o wszystkich translacjach obecnie śledzonych przez router. W tym przykładzie nawiązano dwa połączenia między wewnętrznym (192.168.1.10) a zewnętrznym (172.18.3.2) urządzeniem. Pierwsze z tych połączeń jest oznaczone jako ICMP: Router#show ip nat translation Pro Inside global Inside local Outside local Outside global icmp 172.16.1.100:21776 192.168.1.10:21776 172.18.3.2:21776 172.18.3.2:21776 tcp 172.16.1.100:1029 192.168.1.10:1029 172.18.3.2:23 172.18.3.2:23 --- 172.16.1.10 192.168.1.15 --- --- --- 172.16.1.11 192.168.1.16 --- --- Router# Polecenie to pokazuje tylko aktywne wpisy tablicy NAT. Można, na przykład, dowiedzieć się, że router tłumaczy wewnętrzny adres lokalny 192.168.1.10 na wewnętrzny adres globalny 172.16.1.100, ale ten router nie jest skonfigurowany do tłumaczenia adresów zewnętrznych, więc zewnętrzne adresy lokalne są takie same jak zewnętrzne adresy globalne. Router usuwa dynamiczne wpisy NAT po zdefiniowanym (przez administratora lub domyślnie) czasie. W przypadku połączeń TCP wpisy NAT są domyślnie usuwane po 24 godzinach. Wyniki zawierają pięć kolumn. Pierwsza kolumna to protokół. Jest ona pusta, chyba że użyjemy opcji overload w konfiguracji NAT. Kolumna Inside global (adres wewnętrzny globalny) to przetłumaczony adres urządzenia wewnętrznego, natomiast kolumna Inside local (adres wewnętrzny lokalny) pokazuje prawdziwy wewnętrzny adres tego urządzenia. Kolumna Outside local (adres zewnętrzny lokalny) pokazuje przetłumaczone adresy urządzeń zewnętrznych, a kolumna Outside global (adres zewnętrzny globalny) - ich prawdziwe adresy.
Sprawdzenie działania NATu c.d. Na początku może się to wydawać nieco mylące. Wewnątrz sieci prawdziwy adres jest lokalny", a przetłumaczony jest globalny", natomiast na zewnątrz prawdziwy adres jest globalny", a przetłumaczony jest lokalny". Aby to zrozumieć, wystarczy sobie przypomnieć, że adresy globalne są zawsze na zewnątrz, a adresy lokalne - zawsze wewnątrz sieci. Ostatnie dwa wiersze reprezentują proste, statyczne wpisy NAT. Widać, na przykład, że prawdziwy adres wewnętrznego urządzenia 192.168.1.15 jest tłumaczony na 172.16.1.10, kiedy pakiety tego urządzenia przechodzą przez router. Ponieważ jest to wpis statyczny, translacja ta jest taka sama w przypadku każdego urządzenia zewnętrznego, jednakże w poprzednim wierszu pojawiają się wszystkie cztery wpisy: tcp 172.16.1.100:1029 192.168.1.10:1029 172.18.3.2:23 172.18.3.2:23 Ten wiersz zawiera wiele przydatnych informacji. Pierwsza kolumna wskazuje, że wiersz reprezentuje połączenie TCP i że ta translacja jest wpisem dynamicznym. Wewnątrz sieci adres źródłowy to 192.168.1.10, a port źródłowy TCP to 1029, natomiast adres docelowy to 172.18. 3. 2, a port docelowy to 23. Na zewnątrz sieci adres i port docelowy są takie same, ale adres źródłowy jest przekształcany do postaci 172.16.1.100, a port źródłowy to 1029.
Sprawdzenie działania NATu (verbose( verbose) Słowo kluczowe verbose powoduje, że polecenie to pokazuje informacje o wieku każdego wpisu w tablicy: Router#show ip nat translation verbose Pro Inside global Inside local Outside local Outside global icmp 172.16.1.100:21776 192.168.1.10:21776 172.18.3.2:21776 172.18.3.2:21776 192.168.3.2:4235 create 00:00:36, use 00:00:36, left 00:00:23, flags: extended tcp 172.16.1.100:1029 192.168.1.10:1029 172.18.3.2:23 172.18.3.2:23 create 00:00:15, use 00:00:13, left 00:00:46, flags: extended, timing-out --- 172.16.1.10 192.168.1.15 --- --- create 1d00h, use 00:23:08, flags: static --- 172.16.1.11 192.168.1.16 --- --- create 1d00h, use 00:15:28, flags: static Router# Taki poziom szczegółowości przydaje się zwłaszcza wtedy, kiedy próbujemy zdiagnozować problem z limitami czasów w tablicy NAT.
Sprawdzenie działania NATu (verbose( verbose) Polecenie show ip nat statistics zawiera przydatne informacje o konfiguracji translacji adresów. Poniższy przykład pokazuje jeden zewnętrzny i dwa wewnętrzne interfejsy z dynamiczną pulą NAT rozciągającą się od adresu 172.16.1.100 do 172.16.1.150: Router#show ip nat statistics Total active translations: 3 (2 static, 1 dynamic; 1 extended) Outside interfaces: Ethernet0/0 Inside interfaces: FastEthernetO/0, FastEthernetO/l Hits: 2628 Misses: 44 Expired translations: 37 Dynamic mappings: -- Inside Source access-list 15 pool PULANAT refcount 1 pool PULANAT: netmask 255.255.255.0 start 172.16.1.100 end 172.16.1.150 type generic, total addresses 2, allocated 1 (50%), misses 9 Router# Pole Hits" pokazuje, ile razy router musiał tworzyć nowe wpisy w tablicy translacji. Pole Misses" zlicza wyjątki. W tym przypadku mamy listę dostępu, która wyklucza niektóre wewnętrzne adresy IP.
Sprawdzenie działania NATu (przykład) W celu sprawdzenia działania translacji w trybie uprzywilejowanym należy wpisać polecenie: show ip nat translations R2#show ip nat translations Pro Inside global Inside local Outside local Outside global tcp 95.160.155.172:50209 172.16.5.2:50209 91.199.212.171:80 91.199.212.171:80 udp 95.160.155.172:54964 172.16.5.2:54964 4.2.2.2:53 4.2.2.2:53 tcp 95.160.155.172:50210 172.16.5.2:50210 91.209.196.169:80 91.209.196.169:80 tcp 95.160.155.172:50211 172.16.5.2:50211 91.209.196.169:80 91.209.196.169:80 tcp 95.160.155.172:50207 172.16.5.2:50207 91.209.196.180:80 91.209.196.180:80 tcp 95.160.155.172:50212 172.16.5.2:50212 212.77.100.208:80 212.77.100.208:80 udp 95.160.155.172:63474 172.16.5.2:63474 4.2.2.2:53 4.2.2.2:53 udp 95.160.155.172:61651 172.16.5.2:61651 4.2.2.2:53 4.2.2.2:53 R2# Na listingu widać listę translacji przeprowadzonych przez router R2. W zależności od ilości połączeń, lista może być dłuższa lub krótsza i zawierać różne wpisy.
Debugowanie NAT Gdy chcemy zdiagnozować problem z NAT routery Cisco zawierają prosty, ale przydatny mechanizm debugowania NAT. Podstawowa forma polecenia to debug ip nat: Router#debug ip nat Można też dodać do tego polecenia słowo kluczowe detailed, aby uzyskać więcej informacji o każdym zdarzeniu NAT: Router#debug ip nat detailed Często warto użyć polecenia debug w połączeniu z listą dostępu. Można to zrobić, po dając numer listy dostępu. Pozwala to obejrzeć tylko zdarzenia NAT dotyczące adresów IP, które są dozwolone przez listę dostępu: Router#debug ip nat 25 Można również połączyć listę dostępu ze słowem kluczowym detailed, aby ograniczyć debugowanie: Router#debug ip nat 25 detailed
Debugowanie NAT Kilka typowych wpisów dziennika: Router#terminal monitor Router#debug ip nat Sep 8 19:51:08.396 EDT: NAT: s=192.168.3.1->192.168.19.1, d=192.168.3.2 [0] Sep 8 19:51:11.560 EDT: NAT*: s=192.168.1.10->192.168.19.55, d=192.168.3.2 [4909] Sep 8 19:51:11.568 EDT: NAT*: s=192.168.3.2, d=192.168.19.55->192.168.1.10 [4909] Sep 8 19:51:11.572 EDT: NAT: s=192.168.3.2, d=192.168.19.55->192.168.1.10 [4909] Sep 8 19:51:12.552 EDT: NAT*: s=192.168.1.10->192.168.19.55, d=192.168.3.2 [4911] Sep 8 19:51:12.564 EDT: NAT*: s=192.168.3.2, d=192.168.19.55->192.168.1.10 [4911] Powyższy ślad reprezentuje prostą serię pakietów ping. Urządzenie wewnętrzne o adresie 192.168.1.10 wysyła pakiety ICMP ping pod zewnętrzny adres docelowy 192.168.3.2. Router przekształca adres wewnętrzny do postaci 192.168.19.55 i przekazuje pakiet do miejsca przeznaczenia. Widać również odpowiedzi ping od urządzenia docelowego. Router przekształca adres wewnętrzny do rzeczywistej wartości i przekazuje pakiet w odpowiednie miejsce.
Terminologia NAT (ang. Network Address Translation) mechanizm umożliwiający adresom prywatnym dostęp do internetu, translacja adresów sieciowych opisana jest w dokumencie RFC 1631; sieć wewnętrzna (ang. inside network) w technologii NAT sieć lokalna klienta; sieć zewnętrzna (ang. outside network) w technologii NAT sieć publiczna, np. internet; tablica translacji (ang. translation table) tablica hostów wykorzystujących dostęp do sieci zewnętrznej za pośrednictwem NAT z przydzielonymi adresami IP sieci lokalnej; translacja dynamiczna (ang. dynamie NAT) polega na przypisaniu w sieci odpowiednio dużej puli adresów IP publicznych, która będzie wykorzystywana do translacji, każdy host w sieci lokalnej otrzymuje w tej metodzie adres publiczny; translacja statyczna (ang. static NAT) polega na przypisaniu jednego adresu wewnętrznego do jednego adresu zewnętrznego; translacja z przeciążeniem (ang. overloaded NAT) wykorzystuje do działania numery portów, każdy adres wewnętrzny komunikuje się z wewnętrznym adresem globalnym za pomocą portów adresu globalnego; wewnętrzny adres globalny (ang. inside global address) adres znany hostom pracującym w sieci wewnętrznej jako adres, przez który dostępny jest host końcowy; wewnętrzny adres lokalny (ang. inside local address) służy do komunikacji między hostami pracującymi wewnątrz sieci; zewnętrzny adres lokalny (ang. outside local address) służy do adresacji hosta końcowego w sieci.
Najczęściej używane polecenia ip acces-list standard tworzy standardową listę dostępu. ip domain-lookup włącza obsługę DNS. ip name-server [adres_ip_serwera_dns] określa serwer DNS, jaki ma być użyty do odwzorowania nazw DNS. ip nat inside umożliwia pracę określonego interfejsu jako interfejsu wewnętrznego. ip nat inside source list [nazwa_lub_numer_listy_acl] interface [interfejs] overload włącza NAT z przeciążeniem na określonym interfejsie oraz pod kontrolą określonej listy dostępu. ip nat outside umożliwia pracę interfejsu jako interfejsu zewnętrznego. ip nat pool [nazwa_puli] [przedział_adresów_publicznych] netmask [maska_sieci_ wykorzystywana_w_adresach_publicznych] tworzy pulę adresów, które wezmą udział w translacji. show access-list wyświetla właściwości utworzonej listy dostępu. show ip nat translations wyświetla informacje na temat translacji adresów.