arp_annouce=2详解

arp_annouce=0的时候

手册上说的是到底是是说当我这个包出去的时候询问arp地址,

当arp_announce=0的时候,是说使用数据包中的地址去进行arp的请求,

当arp_announce=2的时候,是根据端口号决定如何进行arp的请求;

于是我就做了这样一个试验: 还是三大件,树莓派+虚机+宿主机,

虚机:ethA1 192.168.0.110

宿主机 ethA2 192.168.0.1  ethB2 192.168.1.1

树莓派 ethB 192.168.1.110

增加路由信息

虚机上:route add default gw 192.168.0.1

树莓派上:route add default gw 192.168.1.1

这个样子三者的网算是通了,

然后我想测试的是arp_annouce=0的时候,echB2到echB的arp请求都是由由数据包中的地址发起,但是万万没想到呢,于是我从虚拟机中ping树莓派,然后通过wireshark抓包工具,希望看到arp请求是有192.168.0.110发起,但是发现并不是,竟然是由192.168.1.1发起,这并不符合arp_announce的行为呀,百思不得其解,只能看代码了,于是我就开始抓在arp源地址设置的代码,stap脚本在:net/arp/arp_send_dst.stp中,然后我发现了一件事情。。。那就是在进行函数inet_addr_type_dev_table判断会返回的不是RTN_LOCAL,而是RTN_UNICAST,也就是说我ping的数据包中的源地址啊并不是本机地址,这不在arp_annouce数据包的职责范围了。这就是ip地址不是用本端口的根因,于是我自己写了一个sender不断向树莓派中发数据包,不同的是,这次的源地值是我主机上的另一套地址了,按理说这次arp请求的地址就会换掉了:sedner的代码见net/arp/sender.c

现在问题是在socket中设置源地址呢,这个可以通过raw socket来解决。

这次就对了,随便从网上copy下来了一个sende使用raw socket来完成该功能的程序,然后设置源地址发送,发现是可以的呢。

好了,证明结束,我们就来看一下相关的代码: arp_solicit,这个函数里面有所有对arp_announce的约束,都约束啥东西呢?

所以总结一下:

对于本地产生的数据包:

arp_announce=0:使用数据包的地址去访问,这个数据包一定是来源于本地的数据包;(LVS)

arp_announce=1:  数据包中的地址必须与目的地址位于同一个网段;【可以自行做下试验】

arp_announce=2:使用接口地址去访问;

如果如果上述的结果都不满足,那么就使用端口地址去访问了

对于本地转发的数据包:

使用接口地址去访问;

 

转载于:https://www.cnblogs.com/honpey/p/9061000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值