Listy kontrolne dostępu to zestawy poleceń, które określają, które pakiety mogą być przyjęte lub odrzucone przez sieć w zależności od zawartości segmentów w nagłówkach.
Filtrowanie może być wykonane na podstawie adresu IP źródłowego, co określa standardowe listy dostępowe, lub w bardziej rozbudowanej formie - na podstawie adresu IP źródłowego i/lub docelowego, protokołu oraz konkretnej liczby portu TCP/UDP.
Dodatkowo, każda lista ACL jest przypisywana do interfejsu w określonym kierunku (in lub out).
Poprawnie skonfigurowane listy ACL zapewniają:
- Podstawową optymalizację ruchu w sieci poprzez odrzucanie niepożądanych pakietów.
- Dodatkową warstwę zabezpieczeń poprzez ściśle określone reguły, które definiują, które hosty/podsieci mogą się ze sobą komunikować.
- Ograniczenie dostępu użytkownikom do zasobów sieciowych poprzez filtrowanie ruchu na podstawie protokołów, np. ftp lub http/https.
Logika ACL
Tworząc listę reguł, ważne jest pamiętanie, że router szuka dopasowania w kolejności, aż znajdzie pierwsze pasujące. Jeśli na początku listy znajdują się zbyt ogólne reguły, istnieje ryzyko, że ruch, który powinien być zablokowany przy właściwej konfiguracji, zostanie przepuszczony.
Dlatego kluczowe jest odpowiednie uporządkowanie reguł w liście, aby najbardziej szczegółowe reguły były umieszczone na początku. W ten sposób zapewnimy, że ruch sieciowy zostanie poprawnie zidentyfikowany i przetworzony zgodnie z oczekiwaniami.
Standardowe listy ACL
Listy ACL dzielą się zasadniczo na standardowe (tylko dla protokołu IPv4) i rozszerzone (dla protokołów IPv4/IPv6) oraz ze względu na sposób identyfikacji na numeryczne i nazwane.
Standardowe ACL tworzymy poprzez wpisanie polecenia access-list
, a następnie podanie identyfikatora listy (słownie lub numerycznie). Następnie określamy, czy ruch ma być zezwolony (permit) lub zabroniony (deny). Na końcu definiujemy zakres adresów objętych listą dostępu, podając adres IP podsieci/hosta oraz maskę odwrotną (wildcard mask) lub używając słowa kluczowego any.
R1(config)#access-list 1 permit 192.168.0.0 0.0.0.255
R1(config)#access-list 1 deny any
Wildcard mask tworzymy następująco:
255.255.255.255
– 255.255.255.000 odejmujemy maskę podsieci
= 000.000.000.255
Do każdej ACL możemy dodatkowo dodać opis, używając polecenia remark
.
R1(config)#access-list 1 remark Permit hosts from 192.168.0.0 LAN
R1#show running-config | include access-list 1
access-list 1 remark Permit hosts from 192.168.0.0 LAN
access-list 1 permit 192.168.0.0 0.0.0.255
access-list 1 deny any
Gotową listę ACL należy przypisać do odpowiedniego interfejsu w właściwym kierunku (ruch wchodzący – in lub wychodzący – out).
R1(config)#interface fastethernet 0/1
R1(config-if)#access-group 1 in
ACL dla dostępu do konsoli lub wirtualnego terminalu dodajemy za pomocą polecenia access-class.
R1(config)#line vty 0 4
R1(config-line)#access-class 1 in
Rozszerzone listy ACL
Rozszerzone listy ACL pozwalają bardziej precyzyjnie określić rodzaj ruchu dla konkretnej listy poprzez określenie adresu IP źródłowego i docelowego, rodzaju protokołu oraz numeru portu.
Tworzenie rozszerzonych ACL polega na wydaniu polecenia access-list
, podaniu identyfikatora listy (słownie lub numerycznie) oraz określeniu, czy ruch ma być przepuszczony (permit) czy odrzucony (deny).
Dodatkowo można zdecydować, czy router ma filtrować pakiety TCP/UDP lub inne protokoły, np. IGMP. W rozszerzonych listach ACL oprócz adresu IP źródłowego należy również zdefiniować zakres docelowych adresów objętych listą dostępową.
Ostatnim krokiem jest podanie portu lub zakresu portów. Ponieważ niektóre protokoły wymagają nawiązania połączenia w obu kierunkach, należy zezwolić na nawiązanie sesji na żądanie pochodzące z sieci wewnętrznej poprzez opcję established
.
R1(config)#access-list 103 permit tcp 192.168.0.0 0.0.0.255 any eq ssh
R1(config)#access-list 103 deny any any
R1(config)#access-list 104 permit tcp any 192.168.0.0 0.0.0.255 eq 80
R1(config)#access-list 105 permit tcp any 192.168.0.0 0.0.0.255 established
Modyfikacja ACL
Istniejące listy możemy edytować na dwa sposoby.
Pierwszym sposobem jest usunięcie konkretnej listy dostępowej i wprowadzenie jej od nowa. Należy jednak pamiętać, że dana lista dostępu nadal będzie widoczna pod interfejsami, do których została zastosowana. To może prowadzić do całkowitego zablokowania ruchu, ponieważ na końcu każdej listy dostępu znajduje się niejawne deny any.
R1(config)#no access-list 103
Drugi sposób to wykorzystanie numerów sekwencyjnych. Wprowadzając nowe pozycje do listy, są one automatycznie numerowane. Możliwe jest usunięcie lub nadpisanie konkretnej reguły, podając jej numer sekwencyjny.
R1#show access-lists
Extended IP access list 103
10 permit tcp 192.168.0.0 0.0.0.255 any eq ssh
20 deny any any
R1(config)#ip access-list extended 103
R1(config-ext-nacl)#no 10
R1#show access-lists
Extended IP access list 103
20 deny any any
Listy ACL w IPv6
Listy ACL dla adresów IP w wersji 6 są bardzo podobne do rozszerzonych list dostępowych IPv4, jednak mają kilka różnic. Wszystkie listy są nazwane (nazwy muszą się różnić od tych dla IPv4), nie ma już numerowanych list. Zniknęły również maski blankietowe.
Na końcu każdej ACL zawsze pojawiają się niejawnie:
- permit icmp any any nd-na
- permit icmp any any nd-ns
Ponieważ IPv6 porzuciło mechanizm ARP do wykrywania hostów w sieci lokalnej na rzecz usługi warstwy 3 Neighbor Discovery, automatycznie zezwalamy na stosowanie komunikatów Neighbor Discovery — Neighbor Advertisement (nd-na) oraz Neighbor Discovery — Neighbor Solicitation (nd-ns).
R1(config)#ipv6 access-list NO-ACCESS-LAN
R1(config-ipv6-acl)# deny ipv6 any 2001:db8:cafe:30::/64
R1(config-ipv6-acl)# end
Gotową listę ACL należy przypisać do odpowiedniego interfejsu w odpowiednim kierunku (ruch wchodzący – in lub wychodzący – out).
R1(config)#interface gigabitethernet 0/1
R1(config-if)# ipv6 traffic-filter NO-ACCESS-LAN in
Listę dostępu dla dostępu konsolowego lub terminala wirtualnego dodajemy w taki sam sposób jak w przypadku listy ACL dla protokołu IPv4.
R1(config)#line vty 0 4
R1(config-line)#access-class NO-ACCESS-LAN in
Najlepsze praktyki dotyczące konfiguracji ACL
Standardowe ACL powinno być umieszczone jak najbliżej celu, ponieważ filtrujemy ruch na podstawie źródła pakietu. Natomiast Extended ACL powinno być umieszczone jak najbliżej źródła ruchu, aby precyzyjnie określić, który rodzaj ruchu jest niepożądany. Dzięki takiej praktyce filtrowania możemy zaoszczędzić przepustowość w naszej sieci.
Na końcu każdej listy ACL zaleca się dodanie "permit" lub "deny any". Dzięki temu możliwe jest dokładniejsze monitorowanie statystyk listy. Warto zauważyć, że standardowo każde ACL kończy się domyślnie opcją "deny any".