我想编写一个模块来查找内核中的路由表以获取网关ip,并使用ip查找arp缓存来获取网关的mac地址。
答案 0 :(得分:1)
不确定为什么需要内核模块。在用户空间中可以找到找到默认gw mac地址所需的一切......
#!/usr/bin/env python
import re
import socket
from struct import pack
hex_gateway = re.findall('\t00000000\t([0-9A-F]*)\t', open('/proc/net/route').read())[0]
if not hex_gateway: sys.exit(1)
gw_ip = socket.inet_ntoa(pack('I', int(hex_gateway, 16)))
gw_mac = False
for line in open('/proc/net/arp').readlines():
if line.startswith(gw_ip):
gw_mac = line.split()[3]
break
if gw_mac:print gw_mac
else:sys.exit(1)
答案 1 :(得分:1)
fib_lookup
:查找路线表。定义为net/ipv4/route.c
。
ipv4_neigh_lookup
:使用struct neighbor(ARP协议由邻居子系统实现)发送SKB。
浏览ip_route_input_slow
以获取有关路由表和邻居子系统的更多详细信息。
答案 2 :(得分:0)
我认为您想获取默认网关的mac地址。经过研究,我得到了答案。 ip_route_output-可用于检查路线 __ipv4_neigh_lookup-可用于arp查找
示例代码:
struct rtable *rt;
struct neighbour *n;
struct net_device *eth0;
struct net *ndev;
unsigned int paddr = 134744072; //destination ip ex: 8.8.8.8
unsigned int haddr;
eth0 = dev_get_by_name(&init_net,"eth0"); //network interface name
ndev=dev_net(eth0);
rt = ip_route_output(ndev,paddr,0,RT_TOS(0),eth0->ifindex);
haddr=rt->rt_gateway; //default gateway ip
printk(KERN_INFO "[G] Default Gateway IP [%d.%d.%d.%d] ",(haddr>>0)&0xff,(haddr>>8)&0xff,(haddr>>16)&0xff,(haddr>>24)&0xff);
n = __ipv4_neigh_lookup(eth0,rt->rt_gateway);
printk(KERN_INFO "[G] Default Gateway mac [%pM] ",n->ha); // default gateway mac
还有其他获取默认网关mac的方法,它们基于fib_lookup()。但是,它们有点长。ip_route_output也调用fib_lookup()。
ip_route_output() -> ip_route_output_key() ->ip_route_output_flow() ->__ip_route_output_key() -> fib_lookup()