原创单线

原创单线

两个都:

sudo ip -s -s neigh flush all

和:

sudo arp -d 192.168.0.102

它们似乎只是使条目无效,而不是清除 arp 缓存(它们将显示为incomplete)。即使过了几分钟,ARP 缓存仍会如下所示:

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.0.103                    (incomplete)                              eth0
192.168.0.1              ether   DE:AD:BE:EF:DE:AD   C                     eth0

(网关的MAC已经刷新了——就ok了)

我怎么能够真的清除 ARP 缓存,就像“删除表中的所有条目”一样?我不要想要保留不完整的条目,我希望将它们删除。这可能吗?

编辑

这是我的系统:

» arp --version
net-tools 1.60
arp 1.88 (2001-04-04)
+I18N
AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE 
HW: (ether) +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 

» lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.2 LTS
Release:        14.04
Codename:       trusty

» uname -a
Linux polyphemus.xxx-net 3.13.0-46-generic #77-Ubuntu SMP Mon Mar 2 18:23:39 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

答案1

原创单线

ip link set arp off dev eth0 ; ip link set arp on dev eth0

确保一次性完成所有操作,这样在重新打开 ARP 之前就不会中断网络连接。

接口发现复制粘贴命令

interfaces=$(
  arp -n | awk '
    NR == 1 {next}
    {interfaces[$5]+=1}
    END {for (interface in interfaces){print(interface)}}
  '
);
for interface in $interfaces; do
  echo "Clearing ARP cache for $interface";
  sudo ip link set arp off dev $interface;
  sudo ip link set arp on  dev $interface;
done

笔记:分号允许您将此命令压缩为一行,但在 SO 上的代码块中看起来很糟糕。

Raspbian 上的输出示例

pi@raspberrypi:~ $ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.0.0.1                 ether   58:19:f8:0d:57:aa   C                     wlan0
10.0.0.159               ether   88:e9:fe:84:82:c8   C                     wlan0

pi@raspberrypi:~ $ interfaces=$( arp -n | awk ' NR == 1 {next} {interfaces[$5]+=1} END {for (interface in interfaces){print(interface)}} '); for interface in $interfaces; do echo "Clearing ARP cache for $interface"; sudo ip link set arp off dev $interface; sudo ip link set arp on  dev $interface; done
Clearing ARP cache for wlan0

pi@raspberrypi:~ $ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.0.0.159               ether   88:e9:fe:84:82:c8   C                     wlan0

答案2

您的第一个解决方案有效,只需要一点时间(在我对 Kali 的测试中为 5-10 秒)即可从“(不完整)”变为没有条目。

据推测,它正处于某种被删除的过渡状态。

答案3

您提到的解决方案是刷新 ARP 表的正确且安全的方法:

ip neigh flush all [dev <device>]

如果某些条目被更改为无效,那是临时的并且是 ARP 协议的一部分。重要的是映射已经消失,标记为不完整的 ARP 条目不是表上的 IP-MAC 条目。

我刚刚尝试过这个,就我而言,它立即清除了表格,并且没有留下任何不完整的条目。

答案4

在某些系统中,ip命令不可用。

user@linux:~$ ip
-bash: ip: command not found
user@linux:~$

所以这是命令的替代方案ip link set arp off dev eth0; ip link set arp on dev eth0

如果要使用单个命令删除表中的所有条目,请使用for loop以下示例。

user@linux:~$ arp
? (10.0.0.1) at 00:00:00:aa:aa:12 [ether]  on eth1
? (172.168.0.3) at 00:00:00:aa:aa:11 [ether]  on eth2
user@linux:~$ 

使用 ARP -D 命令删除 ARP

user@linux:~$ for i in 10.0.0.1 172.168.0.3; do sudo arp -d $i; done
user@linux:~$

之后:从消息不完整的条目中删除 MAC 地址

user@linux:~$ arp
? (10.0.0.1) at <incomplete>  on eth1
? (172.168.0.3) at <incomplete>  on eth2
user@linux:~$ 

确实如此,通过使用arp -d命令删除 arp,arp 条目仍然带有incomplete消息。

要解决这个问题,请ifconfig ethx up/down像这样使用

user@linux:~$ arp
? (10.0.0.1) at <incomplete>  on eth1
? (172.168.0.3) at <incomplete>  on eth2
user@linux:~$ 

通过单个命令禁用和启用接口 ETH1 和 ETH2

user@linux:~$ for i in 1 2; do sudo ifconfig eth$i down; sudo ifconfig eth$i up; done
user@linux:~$ 

哒哒...问题解决了:)

user@linux:~$ arp
user@linux:~$ 

相关内容