Nie jest to pytanie proste, ale spróbujmy na nie zgrubnie odpowiedzieć.
Na początek warto wiedzieć, że ACLki z dodanym słowem kluczowym log (czyli logujące trafienie), powodują przejście procesora routera w tryb process switching. Dla dużego ruchu, korzyści z wykorzystania innych optymalizacji, w tym optymalniejszych ścieżek komutacji, zostają w tym momencie zniweczone.
Po pierwsze, dla długich ACLek (od 6 wpisów i więcej), w niektórych IOSach (od 12.0(6) linii S, oraz od 12.3 dla niektórych routerów mniejszych) istnieje możliwość pre-kompilowania reguł w kod optymalniejszy do testowania na każdym pakiecie. Funkcjonalność ta nazywa się Turbo Access List (Cisco używa jej zamiennie z compiled Access List i jako takie pojawiają się w słowach kluczowych konfiguracji routera) i włącza się ją poleceniem `access-list compiled'. Router wykona w tym momencie proces optymalizacji ACLek dłuższych niż 5 reguł, a później przy każdej zmianie w ACLkach, powtórzy ten proces. Skuteczność działania tej funkcji, oraz listę ACLek które zostały skompilowane można sprawdzić poleceniem `show access-lists compiled':
router# show access-lists compiled Compiled ACL statistics: ACL State Entries Config Fragment Redundant 10 Operational 1 1 0 0 98 Operational 1 1 0 0 99 Operational 7 7 0 0 100 Operational 2 2 0 0 110 Operational 14 12 2 0 antispoof Operational 42 43 0 1 block_mswin Operational 14 14 0 0 nachi_worm Operational 3 2 1 0 8 ACLs, 8 active, 1 builds, 89 entries, 3 mem fill, 762 updates L0: 1805Kb 5/6 42/43 11/12 2/3 2/3 13/14 14/15 4/5 L1: 9Kb 67/250 11/36 13/42 15/75 L2: 55Kb 69/350 105/300 L3: 217Kb 337/500 Misc: 30Kb Totl: 2119Kb 710 equivs (617 dynamic)
Należy pamiętać, że wykorzystanie tej funkcjonalności pochłonie trochę pamięci (w zależności od ilości i wielkości istniejących i tworzonych list), jednak w zamian za to, każdy pakiet zostanie sprawdzony najwyżej pięć razy (dla list rozszerzonych) - adres źródłowy, adres docelowy, protokół, opcje protokołu - i wynik, powodujący przejście do przetwarzania następnego pakietu. Funkcjonalność tą opisano szerzej pod tym adresem: http://www.cisco.com/univercd/cc/td/doc/product/software/ios120/120newft/120limit/120s/120s6/turboacl.htm.
Po drugie, staraj się ograniczyć liczbę reguł, zawierając w poszczególnych warunkach jak najogólniejsze stwierdzenia (jeśli nie powoduje to oczywiście przepuszczania niechcianego ruchu). Innymi słowy, na przykład zamiast wpisać ACLkę z 254 wpisami typu permit ip 192.168.0.1, permit ip 192.168.0.2, permit ip 192.168.0.3 zastosuj jeden wpis w ramach listy rozszerzonej, który będzie brzmiał permit ip 192.168.0.0 0.0.0.255 any.
Po trzecie, przemyśl konstrukcję ACLki starając się ocenić, jaki ruch najczęściej będzie docierał do Twojego routera - i jak najwcześniej w liście reguł akceptuj go lub odrzucaj. Pomocne jest w tym momencie polecenie `show ip access-lists'. Przeanalizujmy taką ACLkę:
10 permit ip host 169.254.10.1 host 169.254.9.4
20 permit gre any host 169.254.20.6
30 permit udp host 150.254.183.15 eq ntp host 169.254.9.4 eq ntp (11460 matches)
40 deny ip 192.168.0.0 0.0.255.255 any (9865451 matches)
50 deny ip 173.0.0.0 0.255.255.255 any (124 matches)
60 deny ip 10.0.0.0 0.255.255.255 any
70 deny ip 172.16.0.0 0.15.255.255 any (42 matches)
80 deny ip 0.0.0.0 1.255.255.255 any
90 deny ip 2.0.0.0 0.255.255.255 any
100 deny ip 5.0.0.0 0.255.255.255 any
110 deny ip 7.0.0.0 0.255.255.255 any
120 deny ip 23.0.0.0 0.255.255.255 any (847618 matches)
130 deny ip 27.0.0.0 0.255.255.255 any
140 deny ip 31.0.0.0 0.255.255.255 any
150 deny ip 36.0.0.0 1.255.255.255 any
160 deny ip 39.0.0.0 0.255.255.255 any
170 deny ip 41.0.0.0 0.255.255.255 any
180 deny ip 42.0.0.0 0.255.255.255 any
190 deny ip 49.0.0.0 0.255.255.255 any
200 deny ip 50.0.0.0 0.255.255.255 any
210 deny ip 58.0.0.0 1.255.255.255 any (749 matches)
220 deny ip 70.0.0.0 1.255.255.255 any
230 deny ip 72.0.0.0 7.255.255.255 any (6 matches)
250 deny ip 88.0.0.0 7.255.255.255 any
260 deny ip 169.254.0.0 0.0.255.255 any
270 deny ip 174.0.0.0 1.255.255.255 any
280 deny ip 176.0.0.0 7.255.255.255 any
290 deny ip 184.0.0.0 3.255.255.255 any
300 deny ip 189.0.0.0 0.255.255.255 any
310 deny ip 190.0.0.0 0.255.255.255 any
320 deny ip 192.0.2.0 0.0.0.255 any
330 deny ip 197.0.0.0 0.255.255.255 any
340 deny ip 198.18.0.0 0.1.255.255 any
350 deny ip 223.0.0.0 0.255.255.255 any
360 deny tcp any any range 135 139 (138750 matches)
370 deny ip 96.0.0.0 31.255.255.255 any (6974 matches)
380 deny udp any any range 135 netbios-ss (79235152 matches)
390 deny tcp any range 135 139 any (8371 matches)
400 deny udp any range 135 netbios-ss any
Widać od razu, że reguła pasująca do zdecydowanie największej ilości pakietów (nr. 380, 79,235,152 trafienia) znajduje się na szarym końcu - jest sprawdzana dopiero 38. Powoduje to niewielkie, ale jednak opóźnienia i oczywiście przyczyna się do zwiększonego obciążenia na routerze (pamiętaj, że ACLka przeglądana jest za każdym razem, gdy do interfejsu dotrze, lub ma go opuścić pakiet!). Porządkując listę według trafień otrzymamy coś takiego:
10 deny udp any any range 135 netbios-ss (79235152 matches)
20 deny ip 192.168.0.0 0.0.255.255 any (9865451 matches)
30 deny ip 23.0.0.0 0.255.255.255 any (847618 matches)
40 deny tcp any any range 135 139 (138750 matches)
50 permit udp host 150.254.183.15 eq ntp host 169.254.9.4 eq ntp (11460 matches)
60 deny tcp any range 135 139 any (8371 matches)
70 deny ip 96.0.0.0 31.255.255.255 any (6974 matches)
80 permit ip host 169.254.10.1 host 169.254.9.4
90 deny ip 58.0.0.0 1.255.255.255 any (749 matches)
100 deny ip 173.0.0.0 0.255.255.255 any (124 matches)
110 deny ip 172.16.0.0 0.15.255.255 any (42 matches)
120 deny ip 72.0.0.0 7.255.255.255 any (6 matches)
130 permit gre any host 169.254.20.6
140 deny ip 10.0.0.0 0.255.255.255 any
150 deny ip 0.0.0.0 1.255.255.255 any
160 deny ip 2.0.0.0 0.255.255.255 any
170 deny ip 5.0.0.0 0.255.255.255 any
180 deny ip 7.0.0.0 0.255.255.255 any
190 deny ip 27.0.0.0 0.255.255.255 any
200 deny ip 31.0.0.0 0.255.255.255 any
210 deny ip 36.0.0.0 1.255.255.255 any
220 deny ip 39.0.0.0 0.255.255.255 any
230 deny ip 41.0.0.0 0.255.255.255 any
240 deny ip 42.0.0.0 0.255.255.255 any
250 deny ip 49.0.0.0 0.255.255.255 any
260 deny ip 50.0.0.0 0.255.255.255 any
270 deny ip 70.0.0.0 1.255.255.255 any
280 deny ip 88.0.0.0 7.255.255.255 any
290 deny ip 169.254.0.0 0.0.255.255 any
300 deny ip 174.0.0.0 1.255.255.255 any
310 deny ip 176.0.0.0 7.255.255.255 any
320 deny ip 184.0.0.0 3.255.255.255 any
330 deny ip 189.0.0.0 0.255.255.255 any
340 deny ip 190.0.0.0 0.255.255.255 any
350 deny ip 192.0.2.0 0.0.0.255 any
360 deny ip 197.0.0.0 0.255.255.255 any
370 deny ip 198.18.0.0 0.1.255.255 any
380 deny ip 223.0.0.0 0.255.255.255 any
390 deny udp any range 135 netbios-ss any
Warto taką "optymalizację" przeprowadzić raz na jakiś czas - charakterystyki ruchu zmieniają się okresowo i coś co polepszyło sytuację pół miesiąca temu, może teraz ją pogarszać.
Po czwarte, w większości topologii w jakich router może się znaleźć, warto unikać filtrowania na interfejsie ruchu w obu kierunkach. Jeśli router posiada dwa interfejsy, to zakładając, że filtrujemy ruch wchodzący na obu interfejsach, nie trzeba już specjalnie sprawdzać ruchu wychodzącego drugim interfejsem - wiadomo, że przefiltrowaliśmy go już, gdy wchodził interfejsem pierwszym. Jeśli jednak wykonujesz routing, a jakiś ruch może być generowany z routera, być może będziesz musiał jednak coś filtrować - wszystko zależy od Twojej polityki bezpieczeństwa.
Po piąte, warto zastępować reguły odrzucające ruch do konkretnych adresów IP czy podsieci, statycznymi wpisami routingu wskazującymi na odpowiednio skonfigurowany interfejs Null 0. Routery dużo lepiej radzą sobie z routowaniem ruchu (nawet jeśli chodzi o routowanie do interfejsu będącego "czarną dziurą") niż jego filtrowaniem, czy wykonywaniem skomplikowanych operacji. Innymi słowy, po skonfigurowaniu wirtualnego interfejsu Null 0 w ten sposób:
interface Null0 description Interfejs wyrzucający pakiety no ip unreachables
Wpisy w ACLce odrzucającej ruch w ten sposób:
[...]
deny ip 10.0.0.0 0.255.255.255 any
deny ip 0.0.0.0 1.255.255.255 any
deny ip 2.0.0.0 0.255.255.255 any
deny ip 5.0.0.0 0.255.255.255 any
deny ip 7.0.0.0 0.255.255.255 any
deny ip 27.0.0.0 0.255.255.255 any
deny ip 31.0.0.0 0.255.255.255 any
deny ip 36.0.0.0 1.255.255.255 any
deny ip 39.0.0.0 0.255.255.255 any
deny ip 41.0.0.0 0.255.255.255 any
[...]
Można zastąpić następującymi wpisami statycznymi routingu (zwróć jednak uwagę, by nie dopisać takiego filtrowania dla adresów sieci, które w twojej konkretnej instalacji występują!):
router# ip route 10.0.0.0 255.0.0.0 null 0 router# ip route 0.0.0.0 254.0.0.0 null 0 router# ip route 2.0.0.0 255.0.0.0 null 0 router# ip route 5.0.0.0 255.0.0.0 null 0 router# ip route 7.0.0.0 255.0.0.0 null 0 router# ip route 27.0.0.0 255.0.0.0 null 0 router# ip route 31.0.0.0 255.0.0.0 null 0 router# ip route 36.0.0.0 254.0.0.0 null 0 router# ip route 39.0.0.0 254.0.0.0 null 0 router# ip route 41.0.0.0 255.0.0.0 null 0
Po szóste i ostatnie, jeśli filtrujesz ruch na interfejsach wewnętrznych pod kątem poprawności adresów (tzn. nie chcesz, by ktoś w Twojej sieci 192.168.0.0/24 mógł wysyłać pakiety z adresem źródłowym np. 172.16.0.0/16), a masz lub możesz włączyć mechanizm CEF, możesz ACLkę w tej postaci:
ip access-list extended RuchLAN deny tcp any any range 135 139 deny udp any any range 135 139 deny tcp any range 135 139 any deny udp any range 135 netbios-ss any permit ip 192.168.0.0 0.0.0.255 any deny ip any any
...zmodyfikować do postaci:
ip access-list extended RuchLAN deny tcp any any range 135 139 deny udp any any range 135 139 deny tcp any range 135 139 any deny udp any range 135 netbios-ss any permit ip any any
A w zamian za to, włączyć na interfejsie do którego przypisana była ta ACLka, mechanizm uRPF, czyli unicast Reverse-Path-Filtering, w ten sposób:
router# ip cef router# conf t router(config)# interface FastEthernet 0 router(config-if)# ip verify unicast reverse-path
Jak to działa? uRPF opiera swoje działanie o tablicę budowaną przez CEF - FIB (ang. Forwarding Information Base). Po otrzymaniu przez router pakietu, przechodzi on następującą drogę:
Sprawdzana jest wejściowa ACLka przypisana do interfejsu.
uRPF sprawdza, czy droga powrotna dla pakietu wskazuje na interfejs, którym dotarł on do routera - jeśli nie, pakiet jest odrzucany
CEF sprawdza FIB, by wyznaczyć dalszą drogę dla pakietu (jeśli nie został odrzucony)
Na interfejsie, którym pakiet ma opuścić router, sprawdzana jest ACLka wyjściowa
Pakiet jest wysyłany przez interfejs.
Innymi słowy, załóżmy, że masz router z dwoma interfejsami - Ethernetowym, o adresie 192.168.0.1/24 i szeregowy, z adresem 169.254.10.2/30. Po włączeniu mechanizmu CEF, budowany jest FIB. Znajdzie się w nim wpis dla sieci 192.168.0.0/24 jako "zaczepionej" na interfejsie Ethernet. Zarażona stacja w sieci LAN zaczyna generować pakiety, z losowo wybranymi adresami źródłowymi. Dla każdego pakietu otrzymanego interfejsem Ethernet, router sprawdza, czy jeśli przyszłaby na niego odpowiedź, miałby wysłać ją interfejsem, z którego właśnie ją odebrał. Załóżmy, że router otrzymał pakiet ze sfałszowanego adresu 10.7.65.2. Sprawdza tablicę FIB i nie znajduje wpisu, który mówiłby, że do sieci 10 należy wychodzić interfejsem Ethernetowym - pakiet jest w związku z tym odrzucany. Na tej samej zasadzie działa ochrona ruchu, otrzymywanego przez interfejs szeregowy - jeśli tylko włączono na nim mechanizm uRPF. Pakiet, który chciałby zostać "wstrzelony" do sieci LAN (załóżmy, że przyszedł z adresem należącym do Twojej sieci LAN), zostanie odrzucony, ponieważ przyszedł złym interfejsem.
Działanie funkcji uRPF na konkretnym interfejsie potwierdzić można wydając polecenie:
router# show ip interface fastethernet 0 FastEthernet0 is up, line protocol is up [...] IP verify source reachable-via RX, allow default ! włączona weryfikacja adresów źródłowych 642 verification drops ! ilość odrzuconych pakietów z uwagi na zły adres źródłowy
A ogólnie dla całego routera:
router# show ip traffic
IP statistics:
[...]
Drop: 0 encapsulation failed, 0 unresolved, 0 no adjacency
0 no route, 2512 unicast RPF, 0 forced drop