Ubuntu IPv4 Neighbor table overflow problem

W przypadku gdy mamy dużą sieć lub nasz serwer pracuje jako router w logach może pojawić się komunikat

kernel: [138585.922764] IPv4: Neighbour table overflow

Rozwiązaniem tego problemu jest zwiększenie odpowiednio progów w tablicy neighbour zwanej również tablicą ARP.

Aktualne poziomy sprawdzamy poleceniem:

grep . /proc/sys/net/ipv4/neigh/default/gc_thresh*

powinniśmy otrzymać wyniki podobne do poniższych:

/proc/sys/net/ipv4/neigh/default/gc_thresh1:128
/proc/sys/net/ipv4/neigh/default/gc_thresh2:512
/proc/sys/net/ipv4/neigh/default/gc_thresh3:1024

Po zapełnieniu tabeli ARP i przekroczeniu progu gc_thresh1, system zwiększy jej wielkość do drugiego progu gc_thresh2 i ustawi politykę czyszczenia tabli ARP na bardziej agresywną. Trzeci prób gc_thresh3 jest twardym limitem, który nie pozwala zwiększyć wielkości tablicy ponad tą wartość. W przypadku zapełnienia tablicy o wielkości poziomu 3 pojawia się powyższy komunikat w logach.

W takim przypadku należy zwiększyć odpowiednio progi do następnego poziomu:

128 -> 256, 512 -> 1024, 2014 -> 2048 poniższym poleceniem:

echo 256 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 1024 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

Za jakiś czas może się okazać, że nowe poziomy są również nie wystarczające, wtedy zwiększamy je ponownie do następnych wartości.

Powyższa zmiana będzie obowiązywała tylko do ponownego uruchomienia systemu. Aby zachować ustawienia po jego restarcie, należy dodać poniższe wpisy do pliku /etc/sysctl.conf:

net.ipv4.neigh.default.gc_thresh1 = 256
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh3 = 2048

Istnieje taka możliwość, że po aktualizacji systemu plik /etc/sysctl.conf zostanie nadpisany domyślnymi wartościami. Warto sprawdzić go po aktualizacji, żeby uniknąć ponownego przepełnienia tablicy ARP.