我有一台愚蠢的打印机,它只会偶尔响应 ARP(相对很少,有时必须等待 5 分钟才能获得连接)。但是,当我手动将其 MAC 添加到客户端计算机上的 ARP 表中时,它工作得很好(立即响应 ICMP ping、打印等)。
一种解决方案是将其静态添加到/etc/ethers
每台客户端机器上。但这可能是错误的,因为将来新机器将无法了解它。
该本地网络由Linux路由器运行。
另一个解决方案是路由器(10.77.4.1) 来响应针对该打印机 (10.77.4.5) 的 ARP 请求。我阅读了一些手册,认为只需在该 Linux 路由器上执行此操作即可:
$ sudo arp -i wlan0 -s 10.77.4.5 f4:81:39:86:73:cb pub
…即添加手册(永恒的) 和发布条目,但经过快速 Google™ 搜索后发现该pub
功能根本不起作用?……
我也想过使用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
答案1
我会用这个作为设置 CUPS 服务器的借口,因为如果将来需要更换管理员或者网络需要重构,那么强制 ARP 在这种边缘情况下在整个广播域中正常工作更容易引起混乱。
您不仅可以通过这种方式整合打印管理平面,还可以使用 CUPS 作为寻址的中央服务器,从而可以将任何 ARP 修复集中在单个服务器上。使用各种连接类型的打印机可以用 CUPS 的 IPP 或 IPPS 连接来表示,从而使客户端连接管理变得更加容易。
我不确定这是否是您在此环境中的唯一打印机,但即使它是 CUPS,它仍然是解决该问题的好方法。有关安装的一些详细信息可在此处找到:
答案2
我猜你看错了问题。打印机配置是否可能不正确?如果子网掩码错误,则可能会出现类似这种症状。
另外,网络的拓扑结构是什么?您说的是路由器,这很奇怪,但 ARP 是第 2 层协议。打印机在路由器后面吗?路由器是否也充当具有几个桥接接口的交换机?是否涉及另一个交换机?打印机和客户端是否都连接到 Linux 服务器的 wlan0?客户端到客户端通信的无线网络上的安全性设置是什么样的?
答案3
虽然我很喜欢公认的 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— 我的 mod 只允许配置要欺骗哪个地址。
该服务在 NixOS 上运行,因此配置起来非常容易:https://github.com/michalrus/dotfiles/blob/3f83de4809c341f83e7bee81394125536321724e/nixos-config/machines/embedded/router-chwalecice/printer-hacks.nix#L36根据这个定义,我还决定每两秒 ping 一次打印机,以保证其正常运行。
结果:
# 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 的额外数据包;因此它现在变得更加活跃。
但现在一切都进展顺利!谢谢大家。