arp request处理流程分析

使用arping访问同网段地址成功 

而制定src为网段地址后访问失败

 通过server端抓包,发现当src为网络地址时,没有返回reply

 通过kernel协议栈代码程分析arp request处理流程

arp 入口函数

static int arp_rcv(struct sk_buff *skb, struct net_device *dev,
		   struct packet_type *pt, struct net_device *orig_dev)
{
	const struct arphdr *arp;

	/* do not tweak dropwatch on an ARP we will ignore */
	if (dev->flags & IFF_NOARP ||
	    skb->pkt_type == PACKET_OTHERHOST ||
	    skb->pkt_type == PACKET_LOOPBACK)
		goto consumeskb;

	skb = skb_share_check(skb, GFP_ATOMIC);
	if (!skb)
		goto out_of_mem;

	/* ARP header, plus 2 device addresses, plus 2 IP addresses.  */
	if (!pskb_may_pull(skb, arp_hdr_len(dev)))
		goto freeskb;

	arp = arp_hdr(skb);
	if (arp->ar_hln != dev->addr_len || arp->ar_pln != 4)
		goto freeskb;

	memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));

	return NF_HOOK(NFPROTO_ARP, NF_ARP_IN,
		       dev_net(dev), NULL, skb, dev, NULL,
		       arp_process);

consumeskb:
	consume_skb(skb);
	return NET_RX_SUCCESS;
freeskb:
	kfree_skb(skb);
out_of_mem:
	return NET_RX_DROP;
}

在相关校验和一系列hook点过滤后,最终进入arp_process()处理,在process过程中通过ip_route_input_noref()检验路由信息是否合规(返回失败),导致无法进入arp_replay流程。

 下面是ip_route_input相关调用流程

ip_route_input_noref
    ip_route_input_rcu
        ip_route_input_slow
            fib_validate_source

在fib_validate_soure()中返回失败,上层调用直接返回-EINVAL

继续跟踪fib_validate_source()。

fib_validate_source
    __fib_validate_source

在__fib_validate_source()中,将*.0(网络地址),作为dst addr进行反向路由查找。

最终通过fib_lookup()查找,该情况下,返回res type为[[RTN_BROADCAST,不满足条件,导致返回失败。正常情况下,如果是同网段host地址,返回type为RTN_UNICAST,本机地址返回RTN_LOCAL。

具体路由查找可跟踪到fib_lookup() -> fib_table_lookup()查看路由详情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值