close

arp_announce和arp_ignore這兩個參數,顧名思義arp_announce和arp_ignore是和ARP協議(Address Resolution Protocal,地址解釋協議)有關的。

arp_announce參數是定義linux主機發送ARP請求數據包時如何選擇數據包中使用的發送方IP地址(即Sender IP address)。在系統準備通過網卡發送一個IP數據包前,該IP數據包的源IP地址和目標IP地址通常是已經知道的,同時發送的網卡也已經確定,那數據鏈路層的源MAC地址當然也確定了,最後剩下的就是確定數據鏈路層的目標MAC地址了,而該目標MAC地址就需要通過ARP地址解釋協議來獲取,於是系統首先需要發送ARP請求數據包獲取目標MAC地址。結合上面關於ARP原理的描述,我們知道,發送ARP請求數據包時需要包含發送方IP地址,該IP地址應該是什麼呢?大家可能想當然的以為就是要發送的IP數據包的源IP地址,其實這個是不一定的,尤其是主機有多個網絡接口和IP地址時,而arp_announce正是控制該發送方IP地址的選擇條件的。arp_announce參數的取值分別是0、1、2,這些取值的意義如下:
0(默認值)-- 允許使用任一網絡接口配置的IP地址(即任一本地地址),通常就是待發送的IP數據包的源IP地址。
1 -- 盡量避免使用不屬於該網絡接口(即發送數據包的網絡接口)子網的本地地址作為發送方IP地址。根據我對官方原文的理解,就是說如果主機包含多個子網,而IP數據包的源IP地址屬於其中一個子網,雖然該IP地址不屬於本網口的子網,但是也可以作為ARP請求數據包的發送方IP地址,否則就會按照取值為2的方式選擇發送方IP地址。
2 -- 忽略IP數據包的源IP地址,總是選擇網口所配置的最合適的IP地址作為ARP請求數據包的發送方IP地址(一個網口可能會配置多個IP地址)。
    arp_ignore參數是定義linux主機在收到ARP請求數據包後,發送ARP響應數據包的條件級別,該參數的取值範圍是0~8,各取值的意義分別是:
0(默認值)-- 只要ARP請求數據包所請求的IP地址屬於任一本地地址(即任意一個本機配置的IP地址),就會回應ARP響應數據包,即使該IP地址不屬於接收到ARP請求數據包的網卡。
1 -- 只有ARP請求數據包所請求的IP地址屬於當前網卡的IP地址,才會回應ARP響應數據包。
2 -- 除了滿足1的條件外,還要滿足ARP請求數據包的發送方IP地址也屬於當前網卡所屬子網,這樣才會回應ARP響應數據包。
3 -- 如果ARP請求數據包所請求的IP地址對應的本地地址其作用域(scope)為主機(host),則不回應ARP響應數據包,如果作用域為全局(global)或鏈路(link),則回應ARP響應數據包。
4~7 -- 保留
8 -- 即使ARP請求數據所請求的IP地址屬於任何一個本地地址,也不回應ARP響應數據包。
    arp_ignore參數應該很好理解,它在網絡配置中的作用也很清楚,但是arp_announce的作用是什麼呢?設置為不同的值會有什麼不同的作用呢?或者說有什麼不同的影響呢?下面我們來舉個例子說明不同值的影響。不過要理解以下的影響,我們要瞭解,對於網絡設備(三層交換機、路由器)及主機,其ARP地址表(包含IP地址和MAC地址對應關係的表)是如何建立的:當設備或主機收到一個ARP請求數據包時,它會把ARP請求數據包的發送方IP地址和MAC地址的對應關係放入自身的ARP地址表。理解了上面所說的,我們來看看實際的案例場景:假設linux主機有A、B兩塊網卡,其對應的IP地址分別為IP_A、IP_B,對應的MAC地址為MAC_A、MAC_B,假設一個應用程序準備與外部通信,它的socket綁定了源IP地址為IP_A,但是根據系統路由及相關設置,其通信數據包將會從B網卡發送,在發送數據包前,系統會通過網卡B發送ARP請求數據包。如果我們將arp_announce的值設定為0,那該ARP請求數據包的發送方IP地址是IP_A,而發送方MAC地址為MAC_B,這樣就會在網絡設備或對方主機的ARP地址表上留下IP_A與MAC_B的對應記錄,但是實際正確的應該是IP_A對應MAC_A、IP_B對應MAC_B,所以這可能會引起潛在的網絡問題,具體問題和表現與網絡的拓撲結構及網絡配置有關。而如果我們將arp_announce設置為2,那在發送ARP請求數據包時,發送方IP地址將不是IP_A,而是IP_B,這樣就不會引起剛才所說的問題。

設定指令參考: /sbin/sysctl -w net.ipv4.conf.all.arp_announce=1 

                      /sbin/sysctl -w net.ipv4.conf.all.arp_ignore=1

 

arrow
arrow
    文章標籤
    Linu pro sysct
    全站熱搜

    lyt0112 發表在 痞客邦 留言(0) 人氣()