У нас есть локальная сеть, которая подключена к Интернету через шлюз Linux. В локальной сети около 50 рабочих станций. Недавно мы начали наблюдать проблему, заключающуюся в том, что шлюз периодически перестает отвечать на несколько секунд. После расследования мы заметили, что иногда, когда шлюз не может проверить связь с какой-либо рабочей станцией, он даже не пытается отправить на нее ARP-запросы.
В качестве примера мы пингуем 192.168.5.37 со шлюза:
PING 192.168.5.37 (192.168.5.37) 56(84) bytes of data.
From 192.168.5.1 icmp_seq=1 Destination Host Unreachable
From 192.168.5.1 icmp_seq=2 Destination Host Unreachable
From 192.168.5.1 icmp_seq=3 Destination Host Unreachable
From 192.168.5.1 icmp_seq=5 Destination Host Unreachable
From 192.168.5.1 icmp_seq=6 Destination Host Unreachable
From 192.168.5.1 icmp_seq=7 Destination Host Unreachable
64 bytes from 192.168.5.37: icmp_seq=8 ttl=128 time=438 ms
64 bytes from 192.168.5.37: icmp_seq=9 ttl=128 time=0.240 ms
64 bytes from 192.168.5.37: icmp_seq=10 ttl=128 time=0.238 ms
В то же время tcpdump работает на другой консоли:
sudo tcpdump -nli eth0 host 192.168.5.37
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
14:12:26.944842 IP 192.168.5.37.6112 > 255.255.255.255.6112: UDP, length 16
14:12:31.951145 IP 192.168.5.37.6112 > 255.255.255.255.6112: UDP, length 16
14:12:36.958632 IP 192.168.5.37.6112 > 255.255.255.255.6112: UDP, length 16
14:12:39.914620 arp who-has 192.168.5.37 tell 192.168.5.1
14:12:39.914775 arp reply 192.168.5.37 is-at 00:0b:6a:86:53:14
14:12:39.914781 IP 192.168.5.1 > 192.168.5.37: ICMP echo request, id 50734, seq 8, length 64
14:12:39.914955 IP 192.168.5.37 > 192.168.5.1: ICMP echo reply, id 50734, seq 8, length 64
14:12:40.480035 IP 192.168.5.1 > 192.168.5.37: ICMP echo request, id 50734, seq 9, length 64
14:12:40.480264 IP 192.168.5.37 > 192.168.5.1: ICMP echo reply, id 50734, seq 9, length 64
14:12:41.480037 IP 192.168.5.1 > 192.168.5.37: ICMP echo request, id 50734, seq 10, length 64
14:12:41.480265 IP 192.168.5.37 > 192.168.5.1: ICMP echo reply, id 50734, seq 10, length 64
Я подозреваю, что что-то не так с кешем ARP ядра. По умолчанию gc_thresh1 имеет значение 512, и у нас в локальной сети в десять раз меньше хостов (ip nei|wc -l
около 50) ..
В чем проблема и как ее исправить?
Кажется, я нашел корень своей проблемы. Маршрутизатор подключен к локальной сети через eth0. Кроме того, на одном интерфейсе имеется несколько субинтерфейсов VLAN (один из них используется для доступа в Интернет). На eth0 есть шейпер, настроенный для ограничения скорости трафика для пользователей LAN. Кажется, что код формирования трафика Linux видит весь трафик на eth0 (включая субинтерфейсы) и каким-то образом мешает запросам arp на eth0.
После перемещения LAN-соединения на субинтерфейс и настройки шейпинга на нем так, чтобы не формировать пакеты ARP, проблема исчезла.
Проверка дублирования IP-адреса вашего шлюза в вашей сети - наиболее частая проблема в вашем случае.