artykuły
Powrót do listy artykułów

Temat artykułu: NAT - translowanie adresów sieciowych
Tekst napisał Cisco_FAQ dnia 07-03-2006

W jakich wersjach oprogramowania obsługiwany jest NAT, PAT oraz mapowanie portów z adresów publicznych na prywatne?

NAT pojawił się w wersji IOS 11.2 w feature-set "IP Plus". Od wersji 12.0 cała funkcjonalność NAT dostępna jest już w standardowej wersji "IP".


Chcę uruchomić NAT - mam jeden interfejs publiczny i jeden prywatny. Jak to zrobić?

W trzech krokach.

  • Oznaczasz interfejsy jako publiczny (ip nat outside) i jako prywatny (ip nat inside) - może być wiele zarówno publicznych jak i prywatnych. Na przykład:

    router(config)# interface serial 0.99
    router(config-if)# ip nat outside
    router(config-if)# exit
    router(config)# interface fastethernet 0/0
    router(config-if)# ip nat inside
    router(config-if)# exit
    
    

    Zwróć uwagę, że nazwy Twoich interfejsów mogą być inne.

  • Definiujesz, jak ma być wykonywany NAT - na pulę przydzielonych adresów, czy na jakiś konkretny jeden adres - najczęściej publicznego interfejsu routera. Poniżej jak zdefiniować pulę:

    router(config)# ip nat pool Pula1 169.254.10.1 169.254.10.15 255.255.255.240
    
  • Na koniec określasz jaki ruch z interfejsów oznaczonych jako wewnętrzne będzie podlegał NATowaniu i na jakie adresy. Wpisy przeglądane są sekwencyjnie wg kolejności i jeśli router trafi na wpis pasujący do pakietu, nie przejrzy już wpisów późniejszych.

    Poniżej przykład, w którym sieć 192.168.10.0/24 NATowana jest na zdefiniowaną wcześniej pulę, a sieć 192.168.20.0/24 na adres interfejsu serial 0.99:

    ! w celu wybrania ruchu z podsieci 192.168.10.0/24 definiujemy
    ! listę ACL:
    
    router(config)# ip access-list extended Siec10NAT
    router(config-acl)# permit ip 192.168.10.0 0.0.0.255 any
    router(config-acl)# exit
    ! i to samo dla sieci 192.168.20.0/24:
    router(config)# ip access-list extended Siec20NAT
    router(config-acl)# permit ip 192.168.20.0 0.0.0.255 any
    
    router(config-acl)# exit
    ! adresy źródłowe pasujące do ACLki Siec10NAT NATowane są na pulę
    ! adresów zdefiniowanych wcześniej pod nazwą Pula1:
    router(config)# ip nat inside source list Siec10NAT pool Pula1 overload
    ! ...a adresy źródłowe pasujące do ACLki Siec20NAT na adres przypisany
    ! do interfejsu serial 0.99 routera:
    
    router(config)# ip nat inside source list Siec20NAT interface serial 0.99 overload
    

Mam router z jednym interfejsem i chcę robić NAT - czy to wykonalne?

Tak, taki układ nazywa się "NAT na patyku" (ang. NAT-on-a-stick). Na jednym interfejsie (zwykle Ethernetowym) obsługujesz zarówno ruch z sieci lokalnej jak i publicznej. Uważaj jednak, na aspekty bezpieczeństwa w takim układzie - zwykle w takiej topologii urządzenie dostawcy podpięte jest do koncentratora/przełącznika, a ten zarówno do routera jak i innych stacji. Oznacza to, że ktoś może zmienić sobie adres IP na stacji na publiczny i "obejść" Twój router w komunikacji z Internetem!

Na początek skonfigurujemy interfejs FastEthernet 0/0, który służyć nam będzie zarówno do obsługi sieci LAN jak i Internetu. Zakładam, że od dostawcy otrzymałeś publiczny adres 169.254.10.1, Twoją domyślną bramką jest 169.254.10.2 a sieć LAN ma numerację 192.168.0.0/24, przy czym interfejs routera w tej sieci posiada adres 192.168.0.1:

router(config)# interface FastEthernet0/0
router(config-if)# ip address 169.254.10.1 255.255.255.0
! Adresem głównym interfejsu jest adres publiczny

router(config-if)# ip address 192.168.0.1 255.255.255.0 secondary
! Dodatkowo przypisujemy do niego adres prywatny tak, by stacje
! w sieci LAN miały zapewnioną bramkę ze swojej podsieci
router(config-if)# ip nat outside
! Oznaczamy interfejs jako zewnętrzny
router(config-if)# ip policy route-map PetlaNAT

! ...i dodajemy do niego route-mapę, która obsługiwać będzie NAT

Teraz dodamy logiczny interfejs Loopback 0. Jest on potrzebny, ponieważ NAT na routerach Cisco wykonywany jest tylko i wyłącznie wtedy, gdy pakiet w czasie podróży przez router przechodzi przez interfejs oznaczony jako zewnętrzny (outside) i wewnętrzny (inside). Do interfejsu możesz przypisać dowolny adres, ale najlepiej żeby był to adres prywatny. W przykładzie użyjemy puli 172.16.0.1/24:

router(config)# interface Loopback0
router(config-if)# ip address 172.16.0.1 255.255.255.0

! Przypisujemy interfejsowi adres z innej puli prywatnej
router(config-if)# ip nat inside
! Oznaczamy interfejs jako wewnętrzny

Pozostaje teraz po pierwsze skonfigurować NAT, a po drugie route-mapę, która "wymusi" przejście pakietu przez dwa różnie oznaczone z punktu widzenia NATu interfejsy.

Zakładam, że NAT ma być realizowany na publiczny adres interfejsu routera:

router(config)# ip nat inside source list SiecDoNAT interface FastEthernet0/0 overload
! Wszystkie pakiety pasujące do ACL SiecDoNAT będą NATowane

! Pozostaje skonfigurować tą ACLkę:

router(config)# ip access-list extended SiecDoNAT
router(config-ext-nacl)# permit ip 192.168.0.0 0.0.0.255 any

A teraz konfiguracja route-mapy PetlaNAT. Każdy pakiet otrzymany z interfejsu FastEthernet 0/0 zostanie sprawdzony, czy nie pasuje do jej reguł. W naszym przypadku będzie tylko jedna - jeśli pasujesz do ACLki SiecDoNAT, musisz trafić na interfejs Loopback 0. W ten sposób ruch z sieci LAN zawsze zostanie sztucznie przerzucony na interfejs Loopback 0, gdzie dojdzie do jego zNATowania. Następnie pakiet już z publicznym adresem, zgodnie z normalnymi regułami routingu, zostanie wysłany interfejsem FastEthernet 0/0 w stronę sieci ISP:

router(config)# route-map PetlaNAT permit 10
router(config-route-map)# match ip address SiecDoNAT
router(config-route-map)# set interface Loopback0

Chcę przekierować port 25/tcp z adresu publicznego routera do sieci wewnętrznej - jak to zrobić?

Zakładam, że chodzi o ruch na adres IP 169.254.10.10 (nasz fikcyjny adres publiczny) na port 25/tcp, i ma on trafiać do stacji gdzieś za routerem, o adresie 192.168.0.10 na ten sam port:

router(config)# ip nat inside source static tcp 192.168.0.10 25 169.254.10.10 25 extendable

Jak sprawdzić, które interfejsy przypisane są do NAT i jak są skonfigurowane?

Poleceniem:

router(config)# show ip nat statistics
Total active translations: 0 (0 static, 0 dynamic; 0 extended)
Outside interfaces:
  Serial 0.99
Inside interfaces: 
  FastEthernet 0/0
[...]


NAT mi nie działa - co może być źle?

Po pierwsze sprawdź (poleceniem show ip nat stat), że faktycznie masz przynajmniej jeden interfejs inside i jeden outside. Polecenie wyświetli również w ostatnich linijkach kryteria dla ruchu NATowanego - sprawdź, czy w ogóle NAT zauważa jakieś pakiety godne NATowania (pozycja hits).

Po drugie sprawdź, że nie zamieniłeś interfejsu outside z inside - być może NAT chciałby tłumaczyć adresy, ale otrzymuje ruch nie pasujący do reguł.

Po trzecie, sprawdź czy ruchu do NATowania nie blokujesz w żaden sposób na interfejsie wewnętrznym, ani wracającego na interfejsie zewnętrznym. Zweryfikuj konfigurację routingu, jeśli NATujesz sieci nie podłączone bezpośrednio do routera - być może definicja co NATować jest zbyt wąska.