故障打印机不响应 ARP 请求。如何从 Linux 路由器欺骗它?

故障打印机不响应 ARP 请求。如何从 Linux 路由器欺骗它?

我有一台愚蠢的打印机,它只会偶尔响应 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功能根本不起作用?……

我也想过使用arpingarpoison广播这台打印机的地址,但它们必须不断这样做(例如,每秒一次),才能可靠地工作。如果路由器只响应要求

我怎样才能让它做到这一点?


它看起来是这样的:

# 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,它仍然是解决该问题的好方法。有关安装的一些详细信息可在此处找到:

https://help.ubuntu.com/lts/serverguide/cups.html

答案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 的额外数据包;因此它现在变得更加活跃。

但现在一切都进展顺利!谢谢大家。

相关内容