Jak wyczyścić pamięć podręczną ARP w systemie Linux?

Oba:

sudo ip -s -s neigh flush all 

Oraz:

sudo arp -d 192.168.0.102 

Zamiast czyścić pamięć podręczną arp, wydają się tylko unieważniać wpisy (pojawią się jako incomplete). Nawet po kilku minutach pamięć podręczna ARP wygląda następująco:

$ arp -n Address HWtype HWaddress Flags Mask Iface 192.168.0.103 (incomplete) eth0 192.168.0.1 ether DE:AD:BE:EF:DE:AD C eth0 

(Adres MAC bramy został odświeżony – to jest ok)

Jak mogę naprawdę wyczyścić pamięć podręczną ARP, na przykład „usuń wszystkie wpisy z tabeli”? nie chcę zachować niekompletne wpisy, chcę je usunąć. Czy to możliwe?

EDYTUJ

To jest mój system:

» arp --version net-tools 1.60 arp 1.88 (2001-04-04) +I18N AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE HW: (ether) +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 » lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.2 LTS Release: 14.04 Codename: trusty » uname -a Linux polyphemus.xxx-net 3.13.0-46-generic #77-Ubuntu SMP Mon Mar 2 18:23:39 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 

Komentarze

  • Co próbujesz tutaj osiągnąć? Albo, mówiąc dokładniej, jaki problem próbujesz rozwiązać?
  • Czy brakuje Ci wpisów w tablicy arp? Być może ' jest program proszący o to IP, odnawiając w ten sposób ten wpis. Sprawdź w wireshark lub tcpdump.
  • @MichaelMartinez, ponieważ xy problem . Wydaje się prawdopodobne, że pytanie nie jest ' głównym problemem i może istnieć jakiś podstawowy problem, nad którym OP powinien pracować.
  • Powód, dla którego ta informacja nie jest w pytaniu, ponieważ nie jest to istotne. Chcę mieć czystą pamięć podręczną ARP. Kropka. Nie ufasz mi, że tego chcę, ale to twój problem, nie mój. Zapewniam: chcę mieć czystą pamięć podręczną ARP.
  • Tutaj znajduje się szczegółowe wyjaśnienie mechanizmu pamięci podręcznej ARP: stackoverflow.com/a/ 15511117/647991

Odpowiedź

Oryginalny oneliner

ip link set arp off dev eth0 ; ip link set arp on dev eth0 

Pamiętaj, aby zrobić to wszystko na raz, aby nie przerywać połączenia sieciowego, zanim nie będziesz w stanie ponownie włączyć ARP.

Interfejs wykrywający polecenie kopiuj-wklej

interfaces=$( arp -n | awk " NR == 1 {next} {interfaces[$5]+=1} END {for (interface in interfaces){print(interface)}} " ); for interface in $interfaces; do echo "Clearing ARP cache for $interface"; sudo ip link set arp off dev $interface; sudo ip link set arp on dev $interface; done 

Uwaga: średniki pozwalają skondensować to polecenie w oneliner, ale wygląda okropnie w bloku kodu na SO .

Przykładowe wyjście dla Raspbian

pi@raspberrypi:~ $ arp -n Address HWtype HWaddress Flags Mask Iface 10.0.0.1 ether 58:19:f8:0d:57:aa C wlan0 10.0.0.159 ether 88:e9:fe:84:82:c8 C wlan0 pi@raspberrypi:~ $ interfaces=$( arp -n | awk " NR == 1 {next} {interfaces[$5]+=1} END {for (interface in interfaces){print(interface)}} "); for interface in $interfaces; do echo "Clearing ARP cache for $interface"; sudo ip link set arp off dev $interface; sudo ip link set arp on dev $interface; done Clearing ARP cache for wlan0 pi@raspberrypi:~ $ arp -n Address HWtype HWaddress Flags Mask Iface 10.0.0.159 ether 88:e9:fe:84:82:c8 C wlan0 

Komentarze

  • Należy albo zrobić w skrypcie powłoki lub na komputerze, ponieważ wydaje się, że przerywa połączenie po pierwszym poleceniu.
  • Zrobiłem to w jednej linii i zadziałało: dev=eth2; ip link set arp off dev $dev; sleep 1; ip link set arp on dev $dev. sleep może nie być konieczne.

Odpowiedź

Twój pierwsze rozwiązanie działa, po prostu zajmuje trochę czasu (5-10 sekund w moim teście na Kali), aby przejść od „(niekompletne)” do braku wpisów.

Przypuszczalnie jest w jakimś stanie przejściowym sposób na usunięcie.

Komentarze

  • W moim przypadku (Ubuntu 14.04) tak nie było: wpisy są przechowywane przez długi czas ( na zawsze?) w stanie niekompletnym. Dzisiaj jeszcze raz to sprawdzę.
  • Zweryfikowano: nawet po kilku minutach wpisy wciąż tam są, w stanie niekompletnym (arp 1.88, net-tools 1.60).
  • Cóż Twoim problemem jest z pewnością niestandardowe zachowanie, być może szczególnie w Ubuntu 14.04. Właściwy sposób na zrobienie tego w Linuksie po prostu nie działa. Mam nadzieję, że wkrótce znajdziesz odpowiedź. Możesz usunąć ten, jeśli ' lubisz.
  • Nie, zostaw to, zawiera informacje dla innych. Ale wydaje mi się, że bardziej ” standardowe ” zachowanie można znaleźć w Ubuntu, a nie w Kali, który jest dystrybucją do testów penetracyjnych i ma wartości domyślne specjalnie dostosowane dla tego przypadku użycia.

Odpowiedź

Wspomniane rozwiązanie jest poprawne i bezpieczne podejście do opróżnienia tablicy ARP:

ip neigh flush all [dev <device>]

Jeśli pewne wpisy zostaną zmienione na nieprawidłowe, jest to tymczasowe i jest częścią ARP Ważnym aspektem jest to, że mapowanie zniknęło, wpis ARP oznaczony jako niekompletny nie jest wpisem IP-MAC w tabeli.

Właśnie to wypróbowałem iw moim przypadku natychmiast wyczyściło table i nie pozostawiły niekompletnych wpisów.

Komentarze

  • W niektórych (niejasnych) przypadkach, ip neigh flush all nie wystarczy. W moim przypadku nie wyczyściło wpisów dodanych za pomocą arp -s.
  • O wiele bardziej wolę to od mojej własnej odpowiedzi powyżej, z dodatkowym zastrzeżeniem dotyczącym statycznych wpisów ARP, w zależności od pożądanego zachowania.

Odpowiedź

W niektórych systemach polecenie ip jest niedostępne.

user@linux:~$ ip -bash: ip: command not found user@linux:~$ 

Jest to więc alternatywa dla polecenia ip link set arp off dev eth0; ip link set arp on dev eth0.

Jeśli chcesz usuń wszystkie wpisy z tabeli za pomocą jednego polecenia, użyj for loop jak w poniższym przykładzie.

PRZED

user@linux:~$ arp ? (10.0.0.1) at 00:00:00:aa:aa:12 [ether] on eth1 ? (172.168.0.3) at 00:00:00:aa:aa:11 [ether] on eth2 user@linux:~$ 

USUWANIE ARP ZA POMOCĄ POLECENIA ARP -D

user@linux:~$ for i in 10.0.0.1 172.168.0.3; do sudo arp -d $i; done user@linux:~$ 

PO: ADRES MAC USUNIĘTY Z WPISÓW Z NIEKOMPLETNYM KOMUNIKATEM

user@linux:~$ arp ? (10.0.0.1) at <incomplete> on eth1 ? (172.168.0.3) at <incomplete> on eth2 user@linux:~$ 

To prawda, usuwając arp za pomocą polecenia arp -d, wpisy arp są nadal tam z komunikatem incomplete.

Aby rozwiązać ten problem, użyj ifconfig ethx up/down w ten sposób

PRZED

user@linux:~$ arp ? (10.0.0.1) at <incomplete> on eth1 ? (172.168.0.3) at <incomplete> on eth2 user@linux:~$ 

WYŁĄCZ & WŁĄCZ INTERFEJSY ETH1 & ETH2 W JEDNYM POLECENIU

user@linux:~$ for i in 1 2; do sudo ifconfig eth$i down; sudo ifconfig eth$i up; done user@linux:~$ 

TADAAA … PROBLEM ROZWIĄZANY:)

user@linux:~$ arp user@linux:~$ 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *