Co się stanie, gdy przepełni się pamięć podręczna ARP?


14

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-arpmaksimum 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.

  1. R1 odbiera pakiet przeznaczony dla sieci 10.1.0.0/16.
  2. Na podstawie statycznej trasy interfejsu R1 ARP dla miejsca docelowego iface0
  3. R2 rozpoznaje, że może dotrzeć do miejsca docelowego i odpowiada na ARP własnym MAC.
  4. 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?”


szukasz informacji o przepełnieniu tabeli adresów MAC lub przepełnieniu tabeli ARP?
Mike Pennington

czy mógłbyś wyjaśnić, w jaki sposób według ciebie tabela arp przepełni się? czy jest to związane z prawdziwym problemem, czy czysto hipotetycznym? tak czy inaczej, potrzebujemy szczegółowych informacji na temat tego, na jaki konkretny scenariusz odpowiadamy
Mike Pennington

@MikePennington To jest prawdziwy problem. Pamięć podręczna ARP może się przepełnić, jeśli na przykład duża liczba adresów IP znajduje się lub działa tak, jakby istniała na jednym łączu.
neirbowj

Cisco IOS nie buforuje ARP na routerze, chyba że ARP pochodzi z podsieci skonfigurowanej na routerze. Kiedy mówię „prawdziwy problem”, mam na myśli problem z którym masz problem ... nie jesteś obrazowania może się zdarzyć
Mike Pennington

Dzięki za przeredagowanie pytania, ponieważ kiedy myślę o przełącznikach (warstwa 2), nie masz tabeli ARP. ARP ma związek z TCP / IP, a przełącznik warstwy 2 nie myśli tak, ale gdy przejdziesz do przełączania warstwy trzeciej, możesz mieć tabelę ARP. Jednak, jeśli dobrze pamiętam, interfejs na przełączniku warstwy 3 musi mieć adres IP, aby pojawił się w tabeli ARP. Naprawdę nie rozumiałem, co mówiłeś na początku, gość wcześnie rano jest dla mnie szorstki. Programista we mnie myśli, że gdy tablica ARP będzie pełna, albo zawiesi się, nadpisze, albo upuści wszelkie nowe wpisy ARP pro
SysEngT

Odpowiedzi:


4

Edycja 2 :

Jak wspomniałeś...

ip route 10.1.0.0 255.255.0.0 iface0

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:

ip route 10.1.0.0 255.255.0.0 CiscoNextHopIP

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ź :

Oczekuję, że w większości, a nawet we wszystkich implementacjach, istnieje twardy limit pojemności tabeli ARP.

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 .

Co się dzieje, gdy pamięć podręczna ARP jest pełna, a pakiet jest oferowany z miejscem docelowym (lub następnym przeskokiem), które nie jest buforowane?

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

4094 total Vlans - Vlan1002 - Vlan1003 - Vlan1004 - Vlan1005 = 4090 Vlans

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.

4094 * 252 = 1,030,680 ARP Entries

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.


2

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.


1
Wygląda na to, że mówisz o tabeli przekazywania MAC, a nie o pamięci podręcznej ARP. Proszę zobaczyć moją edycję.
neirbowj

1
Rozumiem co masz na myśli. Jednak w tym konkretnym przypadku efekt był taki sam, ponieważ przełączniki te były również zakończeniem L3 dla wielu bardzo dużych podsieci IP. Ostatecznie rozwiązany przez wymianę przełączników. Na L2 przełącznik zalewa ramki, dla których nie może buforować MAC, ale na L3 musi upuszczać starsze wpisy ARP i / lub ARP dla każdego pakietu, który szybko wyczerpuje na nich procesor.

2

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

  1. gc_thresh1 - nic się nie robi, dopóki nie zostanie trafione
  2. gc_thresh2 - można na chwilę trafić
  3. gc_thresh3 - tego rozmiaru nie można przekroczyć

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.


1

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


1

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 Inputproces. 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.


Gdzie znalazłeś limit „raz na dwie sekundy”?
Marco Marzetti,

„Żądania ARP dla tego samego adresu IP są ograniczone do jednego żądania co dwie sekundy” - cisco.com/en/US/products/hw/routers/ps359/…
generalnetworkerror

Czy nie jest to wartość specyficzna dla C7500? Na przykład C6500 może korzystać z polecenia „protokół mls qos arp police <bps>” lub CoPP.
Marco Marzetti

1

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ć.


Wygląda na to, że mówisz także o tabeli przekazywania MAC, a nie o pamięci podręcznej ARP. Proszę zobaczyć moją edycję.
neirbowj
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.