1. 程式人生 > >當網卡收到的包的目的地址是主機上另一個網卡的地址.arp總結

當網卡收到的包的目的地址是主機上另一個網卡的地址.arp總結

vco 主機 str req wireshark 否則 inter receive attr

內核中是如何確定arp_ignore和rp_filter的值的?

#define IN_DEV_RPFILTER(in_dev)     IN_DEV_MAXCONF((in_dev), RP_FILTER)
#define IN_DEV_ARP_IGNORE(in_dev)   IN_DEV_MAXCONF((in_dev), ARP_IGNORE)

然後呢

#define IN_DEV_MAXCONF(in_dev, attr)     (max(IPV4_DEVCONF_ALL(dev_net(in_dev->dev), attr),          IN_DEV_CONF_GET((in_dev), attr)))

落實到文檔中就是:

The max value from conf/{all,interface}/arp_ignore is used
	when ARP request is received on the {interface}

代碼與文檔匹配:

所以在做關於arp的試驗之前,要先把機器上的/proc/sys/net/ipv4/conf/all/rp_filter和/proc/sys/net/ipv4/conf/all/arp_ignore都設置成0,這樣你對待試驗網卡的設置才會生效的。

都設置成0後,開始首先進行arp_ignore的試驗:

1)arp_ignore = 0; 主要arp包中的目的地址是本地某一個網卡的地址,返回應答包;

2)arp_ignore = 1; arp包中的目的地址是必須是該網卡,否則丟包;【這裏註意要有rp_filter要設置成0,會進行反向路由檢查

3)arp_ignore = 2; arp包中的目的地址必須是本網卡,並且來源IP必須與該網卡是一個網段,否則丟包;

借助軟件wireshark;

然後把arp_ignore設置成0之後,試驗rp_filter

1) rp_filter = 0; 不做反向路由的檢查

2) rp_filter = 1; 進行反向路由的檢查,並且檢查結果一定是該IP地址從該接受網卡出,否則丟包;

3) rp_filter = 2; 進行反向路由的檢查,沒那麽嚴格,只要是本機器能路由出去就得!

所有的設置均符合預期。

當網卡收到的包的目的地址是主機上另一個網卡的地址.arp總結