如何使用netlink监视userspace守护进程中的内核arp表?

时间:2012-10-22 17:53:02

标签: linux sockets netlink

我知道我们可以使用带有RTM_F_NOTIFY标志的'NETLINK_ROUTE'套接字来通知用户路由是否根据RFC3549进行更改。但是我找不到一种方法来在arp表更改时通知用户。

PS:我使用linux kernel 3.0.6

3 个答案:

答案 0 :(得分:2)

应该使用NETLINK_ROUTE套接字和bind()加入群组RTNLGRP_NEIGH

之后,可以通过ndmsg获得recv()次通知。请注意,必须使用所有通知,否则套接字将在溢出后使用下一个ENOBUF引发recv()异常。

或使用外部ip(8)实用程序:

$ ip monitor all    # get all the notifications
$ ip monitor neigh  # get only arp notifications

或使用Python library

from pyroute2 import IPRoute
from pprint import pprint

ip = IPRoute()
ip.bind()  # subscribe to all the events
while True:
    pprint(ip.get())

答案 1 :(得分:1)

如果我理解你 - 我建议你分析“ip”程序的来源。当您运行“ip monitor”并添加或删除任何ARP条目时,“ip monitor”将显示相应的消息。

答案 2 :(得分:0)

我不知道纯arp通知,但您可以使用在用户空间中运行的arpd,适用于arp表非常大的情况。如果您使用arpd并对其进行修改,则可以让它向您发送有关arp表更改的通知。