modified on 20 lip 2010 at 12:42 ••• 62 444 views

IP/Firewall/NAT

Z MikroTik Wiki

Spis treści

Informacje ogólne

Wprowadzenie

Network Address Translatin (NAT) jest usługą routera, która zamienia źródłowe i (lub) docelowe adresy IP pakietu IP, który przechodzi przez router. Najczęściej używana jest aby umożliwić wielu hostom w prywatnej sieci dostęp do internetu przy użyciu pojedynczego publicznego adresu IP.

Specyfikacja

Wymagane pakiety: system

Wymagana licencja: level1

Poziom menu: /ip firewall nat

Standardy i technologie: IP, RFC1631, RFC2663

Wykorzystanie sprzętu: Zwiększa się z ilością reguł

NAT

Opis

Network Address Translation jest standardem Internetowym, który pozwala lokalnym sieciom używanie jednego zestawu adresów IP do wewnętrznej komunikacji i innego zestawu dla komunikacji zewnętrznej. LAN, który wykorzystuje NAT nazywany jest siecią natową (natted network). Aby NAT działał musi być bramka NAT w każdej sieci natowej. Bramka NAT (router NAT) wykonuje przepisywanie adresów IP na drodze pakietów z/do LAN'u.

Są dwa typy NAT'u:

  • źródłowy NAT lub srcnat. Ten typ NAT'u wykonywany jest na pakietach wychodzących z sieci wewnętrznej. Router NAT zamienia adresy źródłowe pakietu IP na nowy, publiczny adres IP gdy przechodzi przez router. Odwrotna operacja jest wykonywana, gdy odpowiadające pakiety wędrują w przeciwnym kierunku.
  • docelowy NAT lub dstnat. Ten typ NAT'u wykonywany jest na pakietach, których celem jest sieć wewnętrzna. Najczęściej wykorzystywany jest, gdy chcemy, aby hości z prywatnej sieci byli dostępni z internetu. Router NAT wykonujący dstnat zamienia docelowy adres IP pakietu, gdy przechodzi on przez router w kierunku sieci wewnętrznej.

Wady NAT

Hości za routerem z włączonym NAT'em nie posiadają prawdziwego połączenia koniec-koniec. Z tego powodu niektóre protokoły internetowe mogą nie działać. Usługi wymagające inicjalizacji połączeń TCP z poza sieci prywatnej, lub protokoły bezstanowe jak UDP, mogą nie działać. Poza tym niektóre protokoły są w zasadzie niekompatybilne z NAT. Przykładem jest protokół AH z zestawu IPsec.

RouterOS zawiera tzw. pomocniki NAT (NAT helpers), które umożliwiają działanie NAT dla wielu protokołów

Przekierowanie i Maskarada

Przekierowanie i maskarada są specjalnymi formami docelowego i źródłowego NATu. Przekierowanie jest podobne do normalnego docelowego NATu w taki sam sposób, jak maskarada jest podobna do źródłowego NATu - maskarada jest specjalną formą srcnat, w której nie ma potrzeby określać to-addresses - adres wychodzącego interfejsu jest używany automatycznie. To samo dotyczy przekierowania - jest formą dstnat, w której to-addresses nie jest używane - zamiast tego jest używany adres interfejsu wejściowego. Pamiętaj, że to-ports jest znaczący dla reguł przekierowania - to jest port usługi na routerze, która będzie obsługiwać te zapytania (np. web proxy).

Gdy pakiet ma zmieniony adres docelowy (dst-natted)(bez znaczenia czy action=nat czy action=redirect). Informacja o translacji adresów (włączając oryginalny adres dst) przetrzymywany jest w wewnętrznej tablicy na routerze. Przezroczyste web-proxy działające na routerze (gdy żądanie strony przekierowane jest na port proxy na routerze) może otrzymać tą informację z wewnętrznej tablicy i otrzymać adres serwera web. Jeżeli zamieniasz adres docelowy na inny serwer proxy, nie ma sposobu na odnalezienie adresu serwera web z nagłówka IP (ponieważ adres docelowy pakietu IP, którym wcześniej był serwera web się zmienił na adres serwera proxy). Od HTTP/1.1 występuje specjalny nagłówek w żądaniu HTTP, który informuje o adresie serwera web, więc serwer proxy może go używać zamiast adresu docelowego pakietu IP. Jeżeli nie ma takiego nagłówka (starsze wersje HTTP). serwer proxy nie może określić adresu serwera web i w efekcie nie działać.

Oznacza to, że niemożliwe jest poprawnie przekierowywać ruchu HTTP z routera na inne przezroczyste proxy. Jedynym poprawnym sposobem jest dodanie przezroczystego proxy na samym routerze, i skonfigurowanie go tak, że Twoje prawdziwe proxy jest rodzicem-proxy. W takiej sytuacji Twoje prawdziwe proxy nie będzie już przezroczyste, póki proxy na routerze będzie przezroczyste i będzie przenosić żądania proxypodobne (według standardu, te żądania zawierają wszystkie potrzebne informacje o serwerze web) do prawdziwego proxy.

Opis własności

action (accept | add-dst-to-address-list | add-src-to-address-list | dst-nat | jump | log | masquerade | netmap | passthrough | redirect | return | same | src-nat; default: accept) - wykonywana akcja, gdy pakiet pasuje do reguły

  • accept - akceptuj pakiet.
  • add-dst-to-address-list - adres docelowy pakietu jest dodany do listy określonej w address-list
  • add-src-to-address-list - adres źródłowy pakietu jest dodany do listy określonej w address-list
  • dst-nat - zamienia adres docelowy pakietu IP adresem okreslonym w address-list
  • jump - przeskocz do skoku określonego wartością jump-target
  • log - dodaj wiadomość do logów systemowych
  • masquerade - zamienia adres źródłowy pakietu IP na automatycznie określony przez usługę routingu
  • netmap - tworzy statyczne 1:1 mapowanie jednego zestawu adresów IP na drugi.
  • passthrough - ignoruje regułę i idzie do następnej
  • redirect - ramienia docelowy adres IP na jeden z adresów lokalnych
  • return - wraca do miejsca w łańcuchu, z którego wykonany był skok
  • same - podaje klientowi ten sam adres docelowy/źródłowy z obsługiwanego zakresu dla każdego połączenia. Najczęściej używane dla usług, które oczekują, że jest ten sam adres klienta dla wielu połączeń z tego samego klienta
  • src-nat - zamienia źródłowy adres pakietu IP na adres określony w to-address i to-ports

address-list (name) - określa nazwę listy adresów do której zapisywane będą adresy z reguł posiadających wpisy action=add-dst-to-address-list lub action=add-src-to-address-list.

address-list-timeout (time; default: 00:00:00) - przedział czasu, po którym adres zostanie usunięty z listy adresów określnej w address-list. Używane w połączeniu z add-dst-to-address-list lub add-src-to-address-list

  • 00:00:00 - zostaw adres na liście adresów na zawsze

chain (dstnat | srcnat | name) - określa łańcuch w który wstawiona jest reguła. Różny ruch przechodzi przez różne łańcuch. Bądź zawsze ostrożny w wybieraniu odpowiedniego łańcucha dla nowej reguły. Jeżeli ta wartość nie pasuje z nazwami już stworzonymi łańcuchami, nowy łańcuch zostanie utworzony

  • dstnat - reguła dodana do tego łańcucha zostanie zastosowana przed routingiem. Reguły, które zamieniają adresy docelowe powinny być umieszczone tutaj
  • srcnat - reguła dodana do tego łańcucha zostanie zastosowana po routingu. Reguły, które zamieniają adresy źródłowe powinny być umieszczone tutaj

comment (text) - opisowy komentarz dla reguły. Komentarz może być użyty w celu identyfikacji reguł ze skryptów

connection-bytes (integer-integer) - porównuje pakiety tylko jeżeli określona ilość bajtów została już przesłana przez konkretne połączenie

  • 0 - oznacza nieskończoność, np connection-bytes=2000000-0 oznacza, że reguła będzie działać jeżeli więcej niż2MB zostały przesłane przez odpowiednie połączenie

connection-limit (integer,netmask) - ogranicz liczbę połączeń na adres lub blok adresów (działa, gdy określona liczba połączeń została zestawiona)

connection-mark (name) - porównuje pakiety oznaczone przez usługę markowania pakietów z odpowiednim znakiem połączenia

connection-type (ftp | gre | h323 | irc | mms | pptp | quake3 | tftp) - porównuje pakiety z połączeń opartych o informację z ich pomocników śledzenia połączenia. Odpowiedni pomocnik połączenia musi być włączony w /ip firewall service-port

content (text) - pakiety muszą zawierać tekst, że by pasować do reguły

dscp (integer: 0..63) - wartość pola DSCP (ex-TOS) nagłówka IP

dst-address (IP address/netmask | IP address-IP address) - określa zakres adresów do których mogą być kierowane pakiety. Pamiętaj, że konsola konwertuje wpisane wartości address/netmask na poprawne wartości

dst-address-list (name) - porównuje adres docelowy pakietu z listą określonych przez użytkownika adresów

dst-address-type (unicast | local | broadcast | multicast) - porównuje typ docelowego adresu pakietu IP z jednym z:

  • unicast - adresy IP używane w transmisji punkt-punkt. Jest tylko jeden adresat i jeden odbiorca
  • local - porównuje wszystkie adresy przydzielone do interfejsów routera
  • broadcast - pakiet IP jest wysyłany z jednego punktu do wszystkich innych punktów w podsieci
  • multicast - ten tryb adresowania IP odpowiedzialny jest za transmisję z jednego lub wielu punktów do kilku innych punktów

dst-limit (integer/time{0,1},integer,dst-address | dst-port | src-address{+},time{0,1}) - ogranicza ilość pakietów na sekundę (pps) na adres docelowy IP lub na port docelowy. Każdy adres IP/ port docelowy ma swój własny limit. Opcje są poniższe:

  • count - maksymalna wartość średniej prędkości pakietów, liczona w pakietach na sekundę, chyba że po niej występuje opcja time
  • time - określa przedział czasu, w którym mierzona jest prędkość pakietów
  • burst - ilość pakietów do porównania w burst'cie
  • mode - klasyfikator ograniczania prędkości pakietów
  • expire - określa czas po którym wpis adresu IP/ portu zostanie usunięty

dst-port (integer: 0..65535-integer: 0..65535{*}) - numer (lub numery) portu docelowego

fragment (yes | no) - czy pakiet jest fragmentem pakietu IP. Początkowy pakiet (pierwszy) nie jest liczony. Pamiętaj, że jeżeli jest włączone śledzenie pakietów, nie będzie żadnych fragmentów ponieważ system automatycznie składa każdy pakiet

hotspot (multiple choice: auth | from-client | http | local-dst | to-client) - porównuje pakiety otrzymane od klientów w różnych warunkach HotSpot. Wszystkie wartości mogą być zanegowane

  • auth - prawda, jeżeli pakiet przychodzi od wiarygodnego klienta HotSpot
  • from-client - prawda, jeżeli pakiet przychodzi od klienta HotSpot
  • http - prawda, jeżeli klient HotSpot wysyła pakiet na adres i port wykryty wcześniej jako serwer poxy lub jeżeli docelowy port to 80 i przezroczyste proxy jest włączone dla tego klienta
  • local-dst - prawda, jeżeli pakiet ma docelowy lokalny adres IP
  • to-client - prawda, jeżeli pakiet jest wysłany do klienta

icmp-options (integer:integer) - porównuje pola ICMP Type:Code

in-bridge-port (name) - aktualny interfejs z którego przyszedł pakiet przechodzący przez router (jeżeli jest połączenie mostkowe, ten zapis porównuje aktualny port mostu, gdy in-interface jest sam w sobie mostem)

in-interface (name) - interfejs z którego przyszedł pakiet przechodzący przez router (jeżeli jest połączenie mostkowe, pakiet będzie pokazywał, że przyszedł z mostu)

ingress-priority (integer: 0..63) - priorytet pakietu INGRESS, jeżeli ustawiony (0 jeżeli nie). Priorytet może być dostarczony przez priorytet VLAN'u lub WMM'u

ipv4-options (any | loose-source-routing | no-record-route | no-router-alert | no-source-routing | no-timestamp | none | record-route | router-alert | strict-source-routing | timestamp) - opcje porównywania nagłówka ipv4

  • any - porównuje pakiet z przynajmniej jedną opcją ipv4
  • loose-source-routing - porównuje pakiety z opcją 'loose source routing'.
  • no-record-route - porównuje pakiety z opcją 'no record route'
  • no-router-alert - porównuje pakiety z opcją 'no router alter'
  • no-source-routing - porównuje pakiety z opcją 'no source routing'
  • no-timestamp - porównuje pakiety z opcją 'no timestamp'
  • record-route - porównuje pakiety z opcją 'record route'
  • router-alert - porównuje pakiety z opcją 'router alter'
  • strict-source-routing - porównuje pakiety z opcją 'strict source routing'
  • timestamp - porównuje pakiety z 'timestamp'

jump-target (dstnat | srcnatname) - nazwa łańcucha do którego będzie wykonany skok, jeżeli użyte jest action-jump

layer7-protocol (name) - nazwa filtru Layer 7, jak ustawiona w menu /ip firewall layer7-protocol. Uwaga: używana jest znaczna moc obliczeniowa

limit (integer/time{0,1},integer) - ogranicza szybkość porównywania pakietów do pewnego poziomu. Używane aby zmniejszyć ilość logów

  • count - maksymalna średnia prędkość pakietów, liczona w pakietach na sekundę, chyba, że po niej umieszczona jest opcja time
  • time - określa przedział czasu, w którym mierzona jest szybkość pakietów
  • burst - ilość pakietów do porównania w burst'cie

log-prefix (text) - wszystkie wiadomości zapisywane w logach będą zawierać prefiks określony tutaj. Używane w połączeniu z action=log

nth (integer,integer: 0..15,integer{0,1}) - porównuje konkretne pakiety Nth. Jeden z 16 dostępnych liczników może być używane do liczenia pakietów

  • every - porównuj każdy every+1 pakiet. Na przykład, jeżeli every=1 to reguła porównuje co drugi pakiet
  • counter - określa który licznik użyć. Licznik jest inkrementowany za każdym razem, gdy reguła zawierająca porównywanie nth porówna
  • packet - porównuj określoną liczbę pakietów. Wartość z oczywistych powodów musi zawierać się między 0 a every. Jeżeli opcja jest używana na liczniku, musi być przynajmniej jedna every+1 reguła z tą opcją.

out-bridge-port (name) - aktualny interfejs, z którego pakiet opuszcza router (jeżeli jest połączenie mostkowe, ten zapis porównuje aktualny port mostu, gdy out-interface jest sam w sobie mostem)

out-interface (name) - interfejs, z którego przyszedł pakiet opuszcza router router (jeżeli jest połączenie mostkowe, pakiet będzie pokazywał, że opuszcza przez ten most)

packet-mark (text) - porównuje pakiety oznaczone przez usługę markowania pakietów z określonym znakiem

packet-size (integer: 0..65535-integer: 0..65535{0,1}) - porównuje pakiet określonego rozmiaru lub rozmiaru z pewnym zakresem, w bajtach

  • min - określa dolną granicę zakresu lub pojedyncza wartość
  • max - określa górną granicę zakresu

port (port{0-16}) - porównuje, jeżeli port (źródłowy lub docelowy) pasuje do wpisu w liście portów, lub zakresów portów (protocol musi być wybrane, tak jak w standardowym porównywaniu src-port i dst-port)

protocol (ddp | egp | encap | ggp | gre | hmp | icmp | idrp-cmtp | igmp | ipencap | ipip | ipsec-ah | ipsec-esp | iso-tp4 | ospf | pup | rdp | rspf | st | tcp | udp | vmtp | xns-idp | xtp | integer) - porównuje protokół IP określony przez nazwę lub numer protokołu. Powinieneś ustawić tą wartość jeżeli chcesz określić porty

psd (integer,time,integer,integer) - próbuje wykryć skanowania TCP lub UDP. Zalecane jest ustawienie niskiej wartości dla portów z dużymi liczbami, aby ograniczyć częstotliwość błędnych trafień, takich jak transfery FTP w trybie pasywnym

  • WeightThreshold - całkowita wartość dla najnowszych pakietów TCP/UDP z różnych docelowych portów przychodzących z tego samego hosta traktowana jest jako sekwencja skanowana
  • DelayThreshold - opóźnienie pakietów z różnymi portami docelowymi przychodzących z tego samego hosta traktowane jako sekwencja skanowania
  • LowPortWeight - wartość pakietów z uprzywilejowanych (<=1024) portów docelowych
  • HighPortWeight - wartość pakietów z nieuprzywilejowanych portów docelowych

random (integer) - porównuj pakiety losowo z podanym prawdopodobieństwem

routing-mark (name) - porównuj pakiety oznaczone przez usługę markowania pakietów z określonym znakiem routingu

same-not-by-dst (yes | no) - określa czy zliczać docelowe adresy IP, gdy wybierany jest nowy źródłowy adres dla pakietów porównywanych z regułami z action=same

src-address (IP address/netmask | IP address-IP address) - określa zakres adresów z których pochodzi pakiet IP.

src-address-list (name) - porównuje źródłowy adres pakietu z wpisami dodanym przez użytkownika na liście adresów

src-address-type (unicast | local | broadcast | multicast) - porównuje typ źródłowego adresu pakietu

  • unicast - adresy IP używane w transmisji punkt-punkt. Jest tylko jeden adresat i jeden odbiorca
  • local - porównuje wszystkie adresy przydzielone do interfejsów routera
  • broadcast - pakiet IP jest wysyłany z jednego punktu do wszystkich innych punktów w podsieci
  • multicast - ten tryb adresowania IP odpowiedzialny jest za transmisję z jednego lub wielu punktów do kilku innych punktów

src-mac-address (MAC address) - adres MAC źródła

src-port (integer: 0..65535-integer: 0..65535{*}) - numer (lub zakres) portu źródłowego

tcp-mss (integer: 0..65535) - porównuje wartośi TCP MSS pakietu

time (time-time,sat | fri | thu | wed | tue | mon | sun{+}) - pozwala stworzyć filtr oparty na czasie i dacie przybycia pakietów lub, dla lokalnie wygenerowanych pakietów, czas i data wyjścia pakietu

to-addresses (IP address-IP address{0,1}; default: 0.0.0.0) - adres lub zakres adresów, które zastępią oryginalny adres pakietu IP

to-ports (integer: 0..65535-integer: 0..65535{0,1}) - port lub zakres portów, które zastąpią oryginalny port pakietu IP

Aplikacje NAT

Opis

W tej sekcji zostaną omówione niektóre aplikacje NAT oraz przykłady.

Prosta konfiguracja NAT

Przypuśćmy, że chcemy stworzyć router, który:

  • "ukrywa" prywatny LAN "za" jednym adresem
  • udostępnienie publicznego adresu IP lokalnemu serwerowi
  • stworzenie mapowania 1:1 adresów sieciowych

Przykład źródłowego NAT (Maskarada)

Jeżeli chcesz "ukryć" prywatną sieć LAN 192.168.0.0/24 "za" jednym adresem "10.5.8.109" przydzielonym przez Twojego ISP, powinieneś użyć usługę źródłowego NAT (maskarada) na routerze MikroTik. Maskarada zmieni źródłowe adresy IP i porty pakietów wychodzących z sieci 192.160.0.0/24 na adres 10.5.8.109 routera, gdy pakiety przechodzą przez niego.

Aby użyć maskarady, reguła srcnat z akcją 'masquerade' powinna być dodana do konfiguracji firewalla:

/ip firewall nat add chain=srcnat action=masquerade out-interface=Public

Wszystkie wychodzące połączenia z sieci 192.168.0.0/24 będą posiadały źródłowy adres routera 10.5.8.109 oraz źródłowy port powyżej 1024. Nie będzie możliwy dostęp z Internetu do lokalnych adresów. Jeżeli chcesz zezwolić na takie połączenia, powinieneś użyć docelowego Network Address Translation (NAT).

Przykład docelowego NAT

Jeżeli chcesz połączyć publiczny adres IP 10.5.8.200 z lokalnym 192.168.0.109, powinieneś użyć usługi docelowej translacji adresów na routerze MikroTik. Jeżeli jeszcze chcesz zezwolić lokalnemu serwerowi na komunikację z Internetem przez dany publiczny adres IP powinieneś użyć także srcnat.

Przydziel publiczny IP publicznemu interfejsowi:

/ip address add address=10.5.8.200/32 interface=Public   

Dodaj regułę pozwalającą na dostęp do wewnętrznego serwera z zewnętrznej sieci:

/ip firewall nat add chain=dstnat dst-address=10.5.8.200 action=dst-nat \
	to-addresses=192.168.0.109 

Dodaj regułę pozwalająca wewnętrznemu serwerowi na komunikację z zewnętrzną siecią przydzielając przetłumaczony adres źródłowy 10.5.8.200:

/ip firewall nat add chain=srcnat src-address=192.168.0.109 action=src-nat \
	to-addresses=10.5.8.200

Przykład mapowania 1:1

Jeżeli chcesz połączyć publiczną podsieć 11.111.11.0/24 z lokalną 2.2.2.0/24 powinieneś użyć translacji docelowego i źródłowego adresu z action=netmap.

/ip firewall nat add chain=dstnat dst-address=11.11.11.1-11.11.11.254 \
	action=netmap to-addresses=2.2.2.1-2.2.2.254

/ip firewall nat add chain=srcnat src-address=2.2.2.1-2.2.2.254 \
	action=netmap to-addresses=11.11.11.1-11.11.11.254