Hairpin NAT czyli łączenie w sieci LAN po publicznym adresie IP

Wiele osób posiada w domu różnego rodzaju usługi do których łączy się z zewnątrz (serwery plików, monitoring czy inteligentny dom). Od zewnątrz robimy to po publicznym adresie IP lub nazwie domenowej odpowiadającej temu adresowi. A co w przypadku gdy jesteśmy w sieci lokalnej i chcemy się połączyć z np. rejestratorem monitoringu? Możemy mieć dwa profile w aplikacji lub pamiętać dwa adresy sieciowe. Jednak prościej jest używać jednego profilu niezależnie od swojej pozycji LAN/WAN. I o tym w tym artykule.


Na początku zaznaczę że temat dotyczy konfiguracji gdzie publiczny adres IP do którego będziemy się łączyć jest podniesiony bezpośrednio na samym MikroTik’u. Jeżeli korzystałeś wcześniej z prostych routerów (TP-Link, DLink, urządzenie dostarczone przez ISP) prawdopodobnie nie musiałeś konfigurować Hairpin NAT. Takie routery mają obsługę takiego przypadku/rozwiązania domyślnie zaimplementowaną w oprogramowaniu. Jednak MikroTik z uwagi że jest zaawansowanym urządzeniem wymaga konfiguracji tej funkcjonalności.

Na czym polega problem ?

A zatem załóżmy że nasz komputer ma adres 192.168.10.50/24, serwer (na który mamy przekierowanie portów) 192.168.10.100/24 a router ma od strony LAN adres 192.168.10.1/24. Dla przykładu masz publiczny IP to 86.238.93.18.

Gdy wpisujemy publiczny adres IP na komputerze wysyła on pakiet do routera jako do swojej bramy domyślnej (w końcu ten adres jest poza siecią LAN). Router widzi że docelowy IP tego pakietu to jego adres od strony WAN, następnie dochodzi do wniosku że przecież ma przekierowania portów z tego adresu. Więc kieruje ten pakiet do serwera zmieniając docelowy adres IP pakietu na lokalny adres IP serwera. Jednak źródłowym adresem jest nadal lokalny IP komputera. Czyli teraz serwer dostaje pakiet z IP 192.168.10.50 na swój adres 192.168.10.100, po przetworzeniu serwer chce wysłać odpowiedź na ten pakiet. Patrzy więc w swoją tablicę routingu i widzi że przecież nadawca tego pakietu jest z nim w jednej sieci. Więc nie zastanawiając się długo wysyła pakiet z adresem źródłowym ustawionym na jego IP, oraz z adresem docelowym ustawionym na adres LAN komputera (no bo przecież dostał pakiet z tego adresu więc mu odpowiada). I tutaj pojawia się problem, otóż komputer wysłał na początku pakiet z docelowym IP 86.238.93.18 i z tego adresu oczekuje odpowiedzi. Jednak dostaje ją z adresu 192.168.10.100 i odrzuca ten pakiet ponieważ jest on dla niego niezrozumiały i nie spodziewał się takiego.


Hairpin NAT

Rozwiązaniem tego problemu jest tzn. Hairpin NAT. Rozwiązanie sprowadzania jest to jednej reguły firewall->NAT.

/ip firewall nat
add chain=srcnat src-address=192.168.10.0/24 dst-address=192.168.10.100 out-interface=LAN action=masquerade

Należy ją dodać na górze reguł srcnat oraz uzupełnić o protokół i dst-port jeśli jest taka potrzeba. Jako out-interface wybieramy interfejs LAN naszego routera.

Po jej zastosowaniu przebieg pakietu będzie wyglądał następująco. Komputer 192.168.10.50 wyśle pakiet o docelowym IP przez router 192.168.10.1 (default gateway). Router mając powyższą regułę srcnat stosuje maskaradę na tym pakiecie. Czyli w tym przypadku podmieni jego źródłowy IP na swój własny po stronie LAN i doda wpis w connection tracking (co to connection tracking postaram się opisać w osobnym wpisie). Następnie też na postawie wpisu dst-nat zmieni jego docelowy IP na adres lokalny serwera. Więc teraz serwer dostanie pakiet z źródłowym IP 192.168.10.1. Odpowiedź serwer kieruje do routera (bo jest święcie przekonany ze to router wysłał mu ten pakiet). Router dostając odpowiedź wie (na postawie tablicy connection tracking) do jakiego połączenia on należy. Następnie zmienia adresy w nagłówku pakietu tak że komputer dostaje odpowiedź z adresu 86.238.93.18.

W ten oto sposób można używać publicznego adresu serwera będąc w sieci lokalnej.