> ## Content Index
> Fetch the complete content index at: https://innasiec.pl/llms.txt
> Use this file to discover other available public pages before exploring further.

# NAT i PAT - Network/Port Address Translation
- URL: https://innasiec.pl/nat-network-address-translation/
- Published: 2019-08-16T07:00:24.000Z
- Updated: 2024-06-25T11:49:45.000Z
- Author: Rafał Rudewicz
- Tags: Routing & Switching, #wordpress, #toc

Już **w połowie lat dziewięćdziesiątych ubiegłego wieku pula adresów IP w wersji 4 została całkowicie rozdysponowana**. Obecnie, aby ubiegać się o blok adresów, należy zapisać się na listę oczekujących lub odkupić od kogoś innego. Oczywiście nadal możliwe jest otrzymanie pojedynczego adresu IPv4 od swojego dostawcy usług internetowych, ale co w sytuacji, kiedy potrzebujemy więcej niż jeden taki adres?

Rozwiązaniem tego problemu jest oczywiście [przejście na IPv6](https://innasiec.pl/ipv6-nastepca-ipv4/). Dostępna tam pula pozwala na przydzielenie po kilka milionów adresów każdej osobie na ziemi i wciąż pozostanie jeszcze wiele dla kolejnych pokoleń. Brzmi świetnie, ale jak to w życiu bywa, nie zawsze możemy skorzystać z IPv6\. W takim przypadku możemy wyłożyć pieniądze na stół i kupić dodatkowe adresy, albo skorzystać z prywatnych adresów oraz zastosować NAT.

### Network Address Translation

Zasada działania NAT został zdefiniowany w dokumencie RFC 3022 i umożliwia hostom, które nie posiadają poprawnego, zarejestrowanego oraz unikalnego adresu IP, komunikację z innym hostem.

Wewnątrz naszej sieci możemy korzystać z adresacji prywatnej, takiej jak 10.0.0.0/8 lub adresacji należącej do innej organizacji, na przykład 1.0.0.0/8, w naszej sieci lokalnej.

**Jeśli nie korzystamy z usług, które powinny być dostępne spoza naszej sieci, nie ma potrzeby przypisywania hostom adresów publicznych**. W niektórych przypadkach, na przykład dla drukarek, nie jest to nawet wskazane.

![Zasada działania NAT](https://innasiec.pl/content/images/2024/06/nat-zasada-dzialania.webp)

Komunikacja jest możliwa dzięki temu, że router wykorzystuje właściwy, publiczny adres IPv4 do reprezentowania adresów prywatnych z sieci LAN. W tym celu adres IP nadawcy (**źródłowy IP**) jest podmieniany w każdym wychodzącym pakiecie.

Poniższy obrazek przedstawia przykładową translację adresów oraz wprowadza nowe terminy, o których za chwilę omówimy.

![](https://innasiec.pl/content/images/2024/06/nat-destination-nat.webp)

**INSIDE LOCAL** 

  - Słowo "**Inside**" odnosi się do faktu, że adres permanentnie należy do jednej z naszych podsieci. Patrząc z naszej perspektywy, adres należy do nas.
  - Termin "**local**" oznacza, że adres będzie stosowany do komunikacji lokalnie, wewnątrz naszej sieci, a nie w internecie.

**INSIDE GLOBAL**

- Słowo "**Inside**" odnosi się do faktu, że adres permanentnie należy do jednej z naszych podsieci. Patrząc z naszej perspektywy, adres należy do nas.
- Termin "**global**" oznacza, że adres będzie stosowany do komunikacji na zewnątrz, z hostami dostępnymi w internecie.

**OUTSIDE GLOBAL** 

- W procesie NAT ten adres reprezentuje adres dostępny w internecie i nie jest podmieniany w procesie Source NAT.

**OUTSIDE LOCAL** 

- Termin ten ma zastosowanie jedynie w przypadku, gdy bierzemy pod uwagę **Destination NAT**.
- Słowo "**outside**" odnosi się do faktu, że host, do którego wysłany został pakiet, jest ogólnodostępny w internecie.
- Termin "**local**" oznacza, że prawdziwy odbiorca pakietu korzysta z adresacji prywatnej.

### Adresy prywatne – RFC 1918

Adresy prywatne w IPv4 to takie, które nie muszą być unikatowe w skali internetu. Oznacza to, że każdy w ramach swojej sieci może z nich korzystać. W tym celu IETF wydzieliło 3 specjalne podsieci:

- **10.0.0.0/8** 10.0.0.0 – 10.255.255.255
- **172.16.0.0/12** 172.16.0.0 – 172.31.255.255
- **192.168.0.0/16** 192.168.0.0 – 192.168.255.255

Adresy prywatne stosujemy zawsze tam, gdzie nie potrzebujemy udostępniać zasobów w Internecie. Nie oznacza to oczywiście, że odłączasz się od sieci. Nadal masz możliwość komunikowania się z hostami posiadającymi publiczny, routowalny adres IPv4.

### Translacja źródłowa (Source NAT)

**Najczęściej spotykaną formą jest translacja źródłowa (source NAT)**. Kiedy host w naszej sieci lokalnej wysyła pakiet do innego hosta w Internecie, router, który dokonuje translacji (zazwyczaj będzie to router brzegowy na styku do Internetu), podmienia **źródłowy adres IP (inside local)** na **adres dostępny globalnie (inside global).**

Aby osiągnąć ten cel, mamy dwie opcje do wyboru. Możemy zdefiniować statycznie pary adresów **(inside local – inside global)** lub pozwolić, aby tworzyły się dynamicznie, na zasadzie kto pierwszy, ten lepszy. W chwili dokonania translacji router zapisuje w swojej pamięci daną parę, aby następnie wracając pakiet przekazać do właściwego hosta w sieci wewnętrznej.

![NAT w wersji statycznej, czyli translacja adresów jest z góry określona](https://innasiec.pl/content/images/2024/06/nat-statyczny.webp)

### Konfiguracja statycznego NAT

NAT statyczny jest najprostszy do skonfigurowania, ale nadal wymaga uwagi. Należy odpowiednio skonfigurować interfejsy, na których ma zostać wykonana translacja, oraz utworzyć pary adresów prywatnych i publicznych. Pamiętaj, że istotna jest kolejność, w jakiej podajesz te adresy.

1. Użyj polecenia `ip nat inside` do konfiguracji interfejsu od strony LAN.
2. Zastosuj polecenie `ip nat outside` do konfiguracji interfejsu od strony spoza naszej sieci.
3. Na zakończenie, za pomocą komendy `ip nat source static inside-local inside-global`, utwórz statyczną mapę adresów do translacji.

```
interface GigabitEthernet0/0
 ip address 10.0.0.2 255.0.0.0
 ip nat inside
!
interface GigabitEthernet0/1
 ip address 150.0.0.1 255.255.255.0
 ip nat outside
!
ip nat inside source static 10.0.0.2 150.0.0.1
Router#show ip nat translation
Pro Inside global Inside local Outside local Outside global
--- 150.0.0.1   10.0.0.2          ---          ---
Router#show ip nat statistics
Total translations: 1 (1 static, 0 dynamic, 0 extended)
Outside Interfaces: GigabitEthernet0/1
Inside Interfaces: GigabitEthernet0/0
Hits: 21  Misses: 0
Expired translations: 0
Dynamic mappings:
```

### Konfiguracja dynamicznego NAT

Konfiguracja dynamicznego NAT różni się od statycznego. Nadal musimy zdefiniować, które interfejsy będą wejściowe (inside), a które wyjściowe (outside). Jednak zamiast tworzenia par statycznych, będziemy korzystać z innych mechanizmów. Stworzymy listę ACL, która będzie wskazywała adresy IP prywatne. Adresy publiczne (globalne) definiujemy, tworząc pulę (ang. pool). Na koniec pozostaje nam tylko połączyć te elementy razem.

1. Komendę `p nat inside` stosujemy w konfiguracji interfejsu po stronie naszej sieci wewnętrznej (tak jak w przypadku statycznego NAT).
2. Polecenie `ip nat outside` używamy w konfiguracji interfejsu po stronie sieci zewnętrznej (tak jak przy statycznym NAT).
3. Tworzymy **listę ACL (access control list)**, która określi, które adresy prywatne IPv4 mogą być przetłumaczone.
4. Tworzymy pulę adresów NAT za pomocą polecenia `ip nat pool nazwa pierwszy adres ostatni adres netmask maska podsieci`.
5. Na zakończenie łączymy wszystko w całość za pomocą polecenia `ip nat inside source list numer listy pool nazwa puli`.

```
interface GigabitEthernet0/0 
 ip address 10.0.0.2 255.0.0.0 
 ip nat inside 
! 
interface GigabitEthernet0/1 
 ip address 150.0.0.1 255.255.255.0  
 ip nat outside 
! 
ip nat pool INTERNET 150.0.0.1 150.0.0.5 netmask 255.255.255.0
!
ip nat inside list 1 pool INTERNET
!
access-list 1 permit 10.0.0.2
!
Router#show  ip nat statistics 
Total translations: 4 (0 static, 4 dynamic, 4 extended)
Outside Interfaces: GigabitEthernet0/1
Inside Interfaces: GigabitEthernet0/0
Hits: 7  Misses: 8
Expired translations: 4
Dynamic mappings:
-- Inside Source
access-list 1 pool INTERNET refCount 4
 pool INTERNET: netmask 255.255.255.0
       start 150.0.0.1 end 150.0.0.5
       type generic, total addresses 5 , allocated 1 (20%), misses 0
```

### PAT, czyli NAT overload

NAT w swojej podstawowej postaci, zarówno statyczny, jak i dynamiczny, boryka się z istotnym problemem. Podczas tworzenia pary adresów inside local – inside global, przypisujemy jeden adres globalny do jednego prywatnego. W przypadku posiadania w domu 10 urządzeń, potrzebujemy 10 adresów publicznych.

```
Router#show ip nat translations
Pro  Inside global  Inside local  Outside local Outside global
icmp 150.0.0.1:10  10.0.0.3:10   200.0.0.1:10 1200.0.0.1:10
icmp 150.0.0.2:1 10.0.0.2:1   200.0.0.1:1  200.0.0.1:1
```

Rozwiązaniem tego problemu jest **PAT (Port Address Translation)**, który pozwala na translację wielu adresów prywatnych na jeden - lub kilka - publicznych. Dzieje się tak, ponieważ **w przypadku przeciążenia NAT następuje podmiana nie tylko adresu IP, ale również numeru portu**. Dzięki temu jesteśmy w stanie obsłużyć do 65 000 adresów prywatnych tylko przy użyciu jednego adresu IP publicznego.

![](https://innasiec.pl/content/images/2024/06/pat-nat-overload.webp)

PAT czyli NAT overload

### Konfiguracja NAT overload 

Konfiguracja NAT overload przebiega w sposób identyczny jak NAT dynamiczny, z tą różnicą, że na końcu dodajemy słowo "overload".

Musimy wskazać interfejsy, na których będzie dokonywana translacja **(ip nat inside oraz ip nat outside)**, **zdefiniować listę ACL** określającą adresy prywatne do tłumaczenia oraz **określić zakres adresów publicznych**. Możemy wskazać konkretny interfejs z adresem publicznym lub stworzyć pulę adresów.

1. Podobnie jak przy NAT, używamy komendy `ip nat inside` do konfiguracji interfejsu. Interfejs zewnętrzny konfigurujemy poleceniem ip nat outside.
2. Tak jak przy NAT dynamicznym, **tworzymy listę ACL**, która określa, które prywatne adresy IP będą tłumaczone na adresy publiczne.
3. **OPCJONALNIE** tworzymy pulę adresów publicznych: ip nat pool nazwa pierwszy IP ostatni IP netmask maska podsieci.
4. Na zakończenie łączymy wszystko w całość: `ip nat inside source list numer listy {interface nazwa interfejsu | pool nazwa} overload`.

```
interface GigabitEthernet0/0 
 ip address 10.0.0.2 255.0.0.0  
 ip nat inside
! 
interface GigabitEthernet0/1 
 ip address 150.0.0.1 255.255.255.0 
 ip nat outside 
! 
ip nat inside source list 1 interface GigabitEthernet0/1 overload
! 
access-list 1 permit 10.0.0.2
access-list 1 permit 10.0.0.3
! 
Router#show  ip nat statistics 
Total translations: 7 (0 static, 7 dynamic, 7 extended)
Outside Interfaces: GigabitEthernet0/1
Inside Interfaces: GigabitEthernet0/0
Hits: 28  Misses: 2
Expired translations: 0
Dynamic mappings:
Router#show  ip nat translation
Pro  Inside global     Inside local       Outside local      Outside global
tcp 150.0.0.1:1024    10.0.0.3:1025        200.0.0.1:23   200.0.0.1:23
tcp 150.0.0.1:1025     10.0.0.2:1025         200.0.0.1:23    200.0.0.1:23
```

### Rozwiązywanie problemów z NAT

Na samym końcu omówmy troubleshootingu NAT, czyli rozwiązywaniu problemów z tą usługą. Problemy, z którymi możesz się spotkać, zazwyczaj wynikają z złej konfiguracji. Do najczęstszych błędów należą:

1. **Odwrócenie interfejsów inside i outside:** Upewnij się, że odpowiednie interfejsy mają przypisane polecenia ip nat inside oraz ip nat outside. Jeśli obie komendy są poprawne, zweryfikuj, czy interfejsy są ustawione w odpowiednich kierunkach, tj. inside w stronę sieci prywatnej, a outside w kierunku Internetu.
2. **Odwrócenie adresów IP w NAT statycznym:** Upewnij się, że najpierw podałeś adres IP prywatny, a następnie adres IP publiczny. Nie na odwrót.
3. **ACL:** Sprawdź, czy skonfigurowałeś ACL prawidłowo, tak aby obejmowało wszystkie adresy prywatne, które mają być przetłumaczone na adresy publiczne.
4. **Zbyt mała pula adresów publicznych:** W przypadku NAT dynamicznego pamiętaj, aby stworzyć pulę adresów publicznych o takiej samej wielkości jak liczba adresów prywatnych.
5. **Brak `overload` na końcu polecenia:** Jeśli nie dodasz overload na końcu konfiguracji PAT, router potraktuje polecenie jako NAT dynamiczny i przepuści jedynie pierwszego hosta, który wysyła pakiet.
6. **Brak ruchu:** PAT i NAT dynamiczny tworzą pary adresów dopiero w momencie otrzymania pakietów ze strony sieci inside. Jeśli nie będzie przekazywany żaden ruch, polecenie show ip nat translation nie pokaże żadnych wyników.