У меня есть этот глупый принтер, который только время от времени отвечает на ARP (относительно редко, иногда нужно ждать 5 минут, чтобы установить соединение). Однако, когда я вручную добавляю его MAC-адрес в таблицу ARP на клиентском компьютере, он работает очень хорошо (мгновенно отвечает на эхо-запросы ICMP, распечатывает и т. Д.).
Одним из решений может быть статическое добавление к /etc/ethers
на каждой клиентской машине. Но это, вероятно, неверно, поскольку новые машины не смогут узнать об этом в будущем.
Эта локальная сеть управляется маршрутизатором Linux.
Тогда другое решение было бы для этого маршрутизатор (10.77.4.1) для ответа на запросы ARP, адресованные этому принтеру (10.77.4.5). Я прочитал несколько руководств и подумал, что достаточно просто сделать это на том маршрутизаторе Linux:
$ sudo arp -i wlan0 -s 10.77.4.5 f4:81:39:86:73:cb pub
… Т.е. добавить руководство (постоянный) и опубликовано запись, но оказывается, что pub
функциональность никогда не работала после быстрого поиска Google ™?…
Я также подумал об использовании arping
или arpoison
чтобы транслировать адрес этого принтера, но им придется делать это постоянно (скажем, каждую секунду), чтобы все работало надежно. Было бы лучше, если бы маршрутизатор отвечал только на Запросы.
Как я могу это сделать?
Вот как это выглядит:
# arping 10.77.4.5
ARPING 10.77.4.5
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=0 time=250.435 msec
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
… И под капотом:
# tcpdump -i wlp8s0 -v arp
tcpdump: listening on wlp8s0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:34:44.877417 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:45.878547 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:46.879713 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:47.880887 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:48.882064 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:49.883216 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:50.884338 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:51.134742 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.77.4.5 is-at f4:81:39:86:73:cb (oui Unknown), length 28
21:34:51.928209 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:52.886242 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:53.886689 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:54.887869 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:55.889023 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:56.890206 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:57.891361 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:58.892543 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:34:59.893485 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:35:00.894657 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:35:01.895783 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:35:02.896968 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:35:03.898118 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
21:35:04.899301 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.77.4.5 tell 10.77.4.100, length 44
Я предполагаю, что вы смотрите не на ту проблему. Есть ли вероятность, что принтер настроен неправильно? Если бы у него была неправильная маска подсети, есть вероятность, что проявится что-то вроде этого симптома.
Кроме того, какова топология сети? Странно, что вы говорите о маршрутизаторе, но ARP - это протокол уровня 2. Принтер находится за маршрутизатором? Маршрутизатор также работает как коммутатор с несколькими мостовыми интерфейсами? Есть еще один переключатель? Все ли принтер и клиенты подключены к wlan0 сервера Linux? Как устроена безопасность в беспроводной сети при взаимодействии клиент-клиент?
Я бы использовал это как предлог для настройки сервера CUPS, поскольку принудительная правильная работа ARP в этом пограничном случае во всем широковещательном домене с большей вероятностью вызовет путаницу, если когда-либо в будущем потребуется смена рук администратора или если сети нуждаются в рефакторинге.
Таким образом можно не только консолидировать плоскость управления печатью, но и использовать CUPS в качестве центрального сервера для адресации, позволяя сосредоточить любое исправление ARP на одном сервере. Принтеры, которые используют различные типы подключения, могут быть представлены подключениями IPP или IPPS от CUPS, что значительно упрощает управление подключениями клиентов.
Я не уверен, что это ваш единственный принтер в этой среде, но даже если это CUPS, все равно хорошее решение проблемы. Некоторые подробности по установке можно найти здесь:
Хотя мне нравится принятая идея CUPS, то, что я сделал (потому что я упрямый, и это должно было быть возможно…: - \ Оказывается, это было так), я взломал ее с помощью этого кода: https://blog.fpmurphy.com/2007/11/spoof-an-ipv4-arp-response.html.
Он будет ждать запроса и только затем отвечать, эффективно избегая защиты ядра клиента. /proc/sys/net/ipv4/conf/all/arp_accept
по умолчанию установлен на 0
.
Здесь можно увидеть разницу: https://github.com/michalrus/dotfiles/commit/69e41b586a925bec4abf9d2a26d4e374bd6404bd - мой мод просто позволяет настроить, какой адрес подделывать.
Сервис работает на NixOS, поэтому его очень легко настроить: https://github.com/michalrus/dotfiles/blob/3f83de4809c341f83e7bee81394125536321724e/nixos-config/machines/embedded/router-chwalecice/printer-hacks.nix#L36. Под этим определением я также решил проверять связь с принтером каждые две секунды, чтобы поддерживать его работоспособность.
Результат:
# cat /proc/sys/net/ipv4/conf/all/arp_accept
0
# arp -d 10.77.4.5
# arping 10.77.4.5
ARPING 10.77.4.5
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=0 time=2.770 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=1 time=354.998 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=2 time=1.980 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=3 time=2.050 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=4 time=299.506 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=5 time=2.060 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=6 time=2.143 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=7 time=348.676 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=8 time=5.234 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=9 time=1.990 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=10 time=294.930 msec
42 bytes from f4:81:39:86:73:cb (10.77.4.5): index=11 time=6.950 msec
^C
--- 10.77.4.5 statistics ---
8 packets transmitted, 12 packets received, 0% unanswered (4 extra)
rtt min/avg/max/std-dev = 1.980/110.274/354.998/152.334 ms
# arp -n 10.77.4.5
Address HWtype HWaddress Flags Mask Iface
10.77.4.5 ether f4:81:39:86:73:cb C wlp8s0
это arping
получил 4 дополнительных пакета с относительно длинными RTT от этого ленивого принтера; так что сейчас стало живее.
Но сейчас дела идут прекрасно! Спасибо всем.