W co najmniej jednej implementacji istnieje twardy limit pojemności tabeli ARP. Co się stanie, gdy pamięć podręczna ARP jest pełna, a pakiet jest oferowany z miejscem docelowym (lub następnym przeskokiem), które nie jest buforowane? Co dzieje się pod maską i jaki jest wpływ na jakość usług?
Na przykład routery Brocade NetIron XMR i Brocade MLX mają konfigurowalne ip-arp
maksimum systemowe . Domyślna wartość w tym przypadku to 8192; rozmiar podsieci / 19. Z dokumentacji nie wynika jasno, czy dotyczy to interfejsu, czy całego routera, ale dla celów tego pytania możemy założyć, że dotyczy to interfejsu.
Niewielu sieci celowo skonfigurowałoby podsieć / 19 na interfejsie, ale tak się nie stało. Migrowaliśmy rdzeń routera z modelu Cisco do Brocade. Jedną z wielu różnic między Cisco a Brocade jest to, że Cisco akceptuje trasy statyczne, które są zdefiniowane zarówno za pomocą interfejsu wychodzącego, jak i adresu następnego przeskoku, ale Brocade nalega na jedno lub drugie. Porzuciliśmy adres następnego skoku i zachowaliśmy interfejs. Później dowiedzieliśmy się o błędach naszych metod i zmieniliśmy interfejs z adresu na następny przeskok, ale początkowo wszystko wydawało się działać.
+----+ iface0 +----+
| R1 |-----------| R2 |---> (10.1.0.0/16 this way)
+----+.1 .2+----+
10.0.0.0/30
Przed migracją R1 był Cisco i miał następującą trasę.
ip route 10.1.0.0 255.255.0.0 iface0 10.0.0.2
Po migracji R1 był Brokatem i miał następującą trasę.
ip route 10.1.0.0 255.255.0.0 iface0
R2 jest routerem Cisco, a routery Cisco domyślnie wykonują ARP proxy . Jest to (błędna) konfiguracja produkcyjna, która ustaliła przepełnienie pamięci podręcznej ARP.
- R1 odbiera pakiet przeznaczony dla sieci 10.1.0.0/16.
- Na podstawie statycznej trasy interfejsu R1 ARP dla miejsca docelowego
iface0
- R2 rozpoznaje, że może dotrzeć do miejsca docelowego i odpowiada na ARP własnym MAC.
- R1 buforuje wynik ARP, który łączy IP w sieci zdalnej z MAC R2.
Dzieje się tak dla każdego określonego miejsca docelowego w 10.1.0.0/16. W konsekwencji, mimo że / 16 jest właściwie podsieciowy poza R2 i istnieją tylko dwa węzły na łączu sąsiadującym z R1 i R2, R1 cierpi z powodu przeciążenia pamięci podręcznej ARP, ponieważ powoduje, że R2 zachowuje się tak, jakby wszystkie 65 000 adresów były bezpośrednio połączone.
Powodem, dla którego zadaję to pytanie, jest to, że mam nadzieję, że pomoże mi to zrozumieć raporty o problemach z usługą sieciową (dni później), które doprowadziły nas ostatecznie do przepełnienia pamięci podręcznej ARP. W duchu modelu StackExchange próbowałem wyjaśnić to, co uważam za ostre, konkretne pytanie, na które można obiektywnie odpowiedzieć.
EDYCJA 1 Aby być jasnym, pytam o część warstwy kleju między łączem danych (warstwa 2) a siecią (warstwa 3), a nie o tabelę przesyłania MAC w warstwie łącza danych. Host lub router buduje ten pierwszy, aby mapować adresy IP na adresy MAC, podczas gdy przełącznik buduje ten drugi, aby mapować adresy MAC na porty.
EDYCJA 2 Chociaż doceniam wysiłek, jaki podjęli respondenci, aby wyjaśnić, dlaczego niektóre implementacje nie podlegają przepełnieniu pamięci podręcznej ARP, uważam, że ważne jest, aby to pytanie dotyczyło tych, którzy są. Pytanie brzmi: „co się stanie, kiedy”, a nie „, czy sprzedawca X jest podatny na”. Wykonałem teraz swoją część, opisując konkretny przykład.
EDYCJA 3 Kolejnym pytaniem, na które nie ma odpowiedzi, jest „jak zapobiec przepełnieniu pamięci podręcznej ARP?”
Odpowiedzi:
Edycja 2 :
Jak wspomniałeś...
Zmusza Brocade do proxy-arp dla każdego miejsca docelowego w 10.1.0.0/16 tak, jakby był bezpośrednio podłączony
iface0
.Nie mogę odpowiedzieć na temat implementacji pamięci podręcznej ARP Brocade, ale po prostu wskazałbym łatwe rozwiązanie problemu ... skonfiguruj swoją trasę inaczej:
W ten sposób uniemożliwisz Brocade ARP-ing dla wszystkich wersji 10.1.0.0/16 (pamiętaj, że może być konieczna zmiana numeracji łącza między R1 i R2, aby znajdowała się poza 10.1.0.0/16, w zależności od implementacji rzeczy przez Brocade) .
Oryginalna odpowiedź :
Routery Cisco IOS CPU są ograniczone jedynie ilością pamięci DRAM w routerze, ale zwykle nie będzie to czynnikiem ograniczającym. Niektóre przełączniki (np. Catalyst 6500) mają twarde ograniczenia w tabeli sąsiedztwa (która jest skorelowana z tabelą ARP); Sup2T ma 1 milion sąsiedztw .
W routerach Cisco IOS CPU nie zabrakło miejsca w tabeli ARP, ponieważ te ARP są przechowywane w pamięci DRAM. Załóżmy, że mówisz o Sup2T. Pomyśl o tym w ten sposób, załóżmy, że miałeś Cat6500 + Sup2T i skonfigurowałeś wszystkie możliwe Vlany, technicznie rzecz biorąc, to jest
Załóżmy, że tworzysz każdego Vlana a / 24 (czyli 252 możliwe ARP) i pakujesz każdy Vlan pełny ... czyli 1 milion wpisów ARP.
Każdy z tych ARP zużywałby pewną ilość pamięci w samej tabeli ARP plus tabelę sąsiedztwa IOS. Nie wiem, co to jest, ale powiedzmy, że całkowity narzut ARP wynosi 10 bajtów ...
Oznacza to, że zużyłeś teraz 10 MB narzut ARP; wciąż nie ma zbyt wiele miejsca ... gdybyś miał tak mało pamięci, zobaczyłbyś coś takiego
%SYS-2-MALLOCFAIL
.Przy tak wielu ARP i czterogodzinnym limicie czasu ARP musiałbyś obsłużyć średnio prawie 70 ARP na sekundę; bardziej prawdopodobne jest, że utrzymanie 1 miliona wpisów ARP spowoduje wyczerpanie procesora routera (potencjalnie komunikaty CPUHOG).
W tym momencie możesz rozpocząć odbijanie sąsiadujących protokołów routingu i mieć adresy IP, które są po prostu nieosiągalne, ponieważ procesor routera był zbyt zajęty dla ARP dla adresu IP.
źródło
Jedyne rzeczywiste doświadczenie, jakie miałem z tym wydarzeniem, dotyczyło przełączników C3550 (limit MAC 2-8k, w zależności od szablonu sdm) i tam zrzuciłem najstarszy wpis z tabeli.
źródło
W przypadku IOS, JunOS i innych komercyjnych stosów, które musisz przetestować, na szczęście nie jest to trudne.
Ale dla Linuksa , freebsd, netbsd, openbsd, uIP, lwIP i prawdopodobnie wielu innych implementacji możesz po prostu sprawdzić kod źródłowy pod kątem zachowania.
W Linuksie musisz zaznaczyć „net / core / neighbour.c” (zacznij od linii ”if (wpisy> = tbl-> gc_thresh3 '||') i„ net / ipv4 / arp.c ”.
W Linuksie wydaje się, że mieć trzy pełne poziomy
Gdy gc_thresh3 próbuje przekroczyć, próbuje wymusić uruchomienie czyszczenia pamięci, chyba że ostatnio było już uruchomione. Wygląda na to, że funkcja odśmiecania usuwa wpisy, do których już się nie odwołuje, więc nie oznacza to najstarszego ani najnowszego, jednak przekroczenie gc_staletime wydaje się być jednym ze sposobów usunięcia wpisu, co ponownie przekłada się na najstarszy wpis.
Jeśli nie można uruchomić czyszczenia pamięci, nowy wpis po prostu nie jest dodawany. Wszystkie te gc_threshN i okresowe okresy zbierania śmieci można dostroić.
Kod jest niezależny od rodziny adresów (ipv4, ipv6), więc tabele ARP IPv6 ND i IPv4 są obsługiwane przez dokładnie tę samą ścieżkę kodu, a nie duplikat ścieżki.
źródło
Spowoduje to, że adres IP zapisze go w tabeli i w zależności od implementacji powinien usunąć najstarszy wpis. Wpływ na wydajność zależy od tego, czy jest to rzadkie zjawisko, nie ma dużego wpływu, ale jest to wektor ataku, więc ktoś może wysłać wiele plików ARP wpływających na wykorzystanie procesora
źródło
Przełącznik wybiera ARP dla tego docelowego adresu IP, aby uzyskać jego adres MAC (co również wypełniłoby tabelę CAM odpowiedzią). Żądanie ARP jest wysyłane do wszystkich portów. Wymaga to procesora i obejmuje
ARP Input
proces. Jeśli żądania ARP dotyczą tego samego adresu IP, ze względu na częste przepełnienie tabeli ARP przełącznik powinien ograniczać szybkość ARP do raz na dwie sekundy. Jeśli żądania mają losowe adresy IP wystarczająco często, procesor może gwałtownie wzrosnąć, ponieważ procesor bierze udział zarówno w żądaniach ARP, jak i w odpowiedziach.źródło
Na podstawie ataków, których nauczyłem się na przełącznikach Cisco 3550, 3560 itp., Możesz zmienić je w gigantyczny hub, gdy przeciążymy limit adresów MAC. Przełączniki mają ustawiony limit adresu MAC (około 6000), który można zapisać, a po osiągnięciu tego limitu zaleją wszystkie dane ze swoich interfejsów. Nie pamiętam, czy dotyczy to pakietów 802.1q, ponieważ nie musiałem tego robić od dłuższego czasu. Być może muszę odpalić moje laboratorium sieciowe w domu, aby się dowiedzieć.
źródło