Linux 內(nèi)核參數(shù) arp_ignore & arp_announce 詳解

arp_ignore定義了對目標(biāo)地址為本機IP的ARP詢問的不同應(yīng)答模式。
arp_announce對網(wǎng)絡(luò)接口(網(wǎng)卡)上發(fā)出的ARP請求包中的源IP地址作出相應(yīng)的限制;主機會根據(jù)這個參數(shù)值的不同選擇使用IP數(shù)據(jù)包的源IP或當(dāng)前網(wǎng)絡(luò)接口卡的IP地址作為ARP請求包的源IP地址。

arp_ignore

在內(nèi)核參數(shù)中除了每個網(wǎng)卡都有自己的arp_ignore配置外,還有兩個(一個是默認(rèn)default,一個是全局all)需要用到arp_ignore配置。所有配置項如下面的代碼段:

net.ipv4.conf.all.arp_ignore 
net.ipv4.conf.default.arp_ignore
net.ipv4.conf.lo.arp_ignore
net.ipv4.conf.eth0.arp_ignore
net.ipv4.conf.eth1.arp_ignore
net.ipv4.conf.eth2.arp_ignore
……

如果某個的網(wǎng)絡(luò)接口(網(wǎng)卡)上沒有配置arp_ignore參數(shù)的值則會把default上配置的arp_ignore應(yīng)用到該網(wǎng)絡(luò)接口上。而在所有網(wǎng)絡(luò)接口上實際生效的值是 all 和 對應(yīng)網(wǎng)絡(luò)接口上配置的arp_ignore參數(shù)值中較大的那個值。

arp_ignore參數(shù)的值及其含義如下:

  • 0 - (默認(rèn)值): 回應(yīng)任何網(wǎng)絡(luò)接口(網(wǎng)卡)上對任何本機IP地址的arp查詢請求。比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到來自10.1.1.2這樣地址發(fā)起的對10.1.1.1 的arp查詢也會給出正確的回應(yīng);而原本這個請求該是出現(xiàn)在eth1上,也該有eth1回應(yīng)的。
  • 1 - 只回答目標(biāo)IP地址是本機上來訪網(wǎng)絡(luò)接口(網(wǎng)卡)IP地址的ARP查詢請求 。比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到來自10.1.1.2這樣地址發(fā)起的對192.168.0.1的查詢會回應(yīng),而對10.1.1.1 的arp查詢不會回應(yīng)。
  • 2 -只回答目標(biāo)IP地址是本機上來訪網(wǎng)絡(luò)接口(網(wǎng)卡)IP地址的ARP查詢請求,且來訪IP(源IP)必須與該網(wǎng)絡(luò)接口(網(wǎng)卡)上的IP(目標(biāo)IP)在同一子網(wǎng)段內(nèi) 。比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到來自10.1.1.2這樣地址發(fā)起的對192.168.0.1的查詢不會回應(yīng),而對192.168.0.2發(fā)起的對192.168.0.1的arp查詢會回應(yīng)。
  • 3 - do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied。(不知道怎么翻譯合適,網(wǎng)上有一個參考但我認(rèn)為無法理解它的含義:不回應(yīng)該網(wǎng)絡(luò)界接口的arp請求,而只對設(shè)置的唯一和連接地址做出回應(yīng))
  • 4-7 - 保留未使用
  • 8 -不回應(yīng)所有(本機地址)的arp查詢

在設(shè)置參數(shù)的時候?qū)rp_ignore 設(shè)置為1,意味著當(dāng)別人的arp請求過來的時候,如果接收的網(wǎng)絡(luò)接口卡上面沒有這個ip,就不做出響應(yīng)。默認(rèn)是0,只要這臺機器上面任何一個設(shè)備上面有這個ip,就響應(yīng)arp請求,并發(fā)送mac地址。

arp_announce

和arp_ignore一樣,在內(nèi)核參數(shù)中除了每個網(wǎng)卡都有自己的arp_announce配置外,還有兩個(一個是默認(rèn)default,一個是全局all)需要用到arp_announce配置。所有配置項如下面的代碼段:

arp_announce 對網(wǎng)絡(luò)接口(網(wǎng)卡)上發(fā)出的ARP請求包中的源IP地址作出相應(yīng)的限制;主機會根據(jù)這個參數(shù)值的不同選擇使用IP數(shù)據(jù)包的源IP或當(dāng)前網(wǎng)絡(luò)接口卡的IP地址作為ARP請求包的源IP地址。

net.ipv4.conf.all.arp_announce
net.ipv4.conf.default.arp_announce
net.ipv4.conf.lo.arp_announce
net.ipv4.conf.eth0.arp_announce
net.ipv4.conf.eth1.arp_announce
net.ipv4.conf.eth2.arp_announce
……

如果某個的網(wǎng)絡(luò)接口(網(wǎng)卡)上沒有配置arp_announce參數(shù)的值則會把default上配置的arp_announce應(yīng)用到該網(wǎng)絡(luò)接口上。而在所有網(wǎng)絡(luò)接口上實際生效的值是 all 和 對應(yīng)網(wǎng)絡(luò)接口上配置的arp_announce參數(shù)值中較大的那個值。

arp_announce參數(shù)的值及其含義如下:

  • 0 - (默認(rèn)) 在任意網(wǎng)絡(luò)接口(eth0,eth1,lo)上使用任何本機地址進(jìn)行ARP請求。也就是說如果IP數(shù)據(jù)包中的源IP與當(dāng)前發(fā)送ARP請求的網(wǎng)絡(luò)接口卡IP地址不同時(但這個IP依然是本主機上其他網(wǎng)絡(luò)接口卡上的IP地址),ARP請求包中的源IP地址將使用與IP數(shù)據(jù)包中的 源IP相同的本主機上的IP地址,而不是使用當(dāng)前發(fā)送ARP請求的網(wǎng)絡(luò)接口卡的IP地址。
  • 1 -盡量避免使用不在該網(wǎng)絡(luò)接口(網(wǎng)卡)子網(wǎng)段內(nèi)的IP地址做為arp請求的源IP地址。當(dāng)接收此ARP請求的主機要求ARP請求的源IP地址與接收方IP在同一子網(wǎng)段時,此模式非常有用。此時會檢查IP數(shù)據(jù)包中的源IP是否為所有網(wǎng)絡(luò)接口上子網(wǎng)段內(nèi)的ip之一。如果找到了一個網(wǎng)絡(luò)接口的IP正好與IP數(shù)據(jù)包中的源IP在同一子網(wǎng)段,則使用該網(wǎng)絡(luò)接口卡進(jìn)行ARP請求。如果IP數(shù)據(jù)包中的源IP不屬于各個網(wǎng)絡(luò)接口上子網(wǎng)段內(nèi)的ip,那么將采用級別2的方式來進(jìn)行處理。
  • 2 - 始終使用與目標(biāo)IP地址對應(yīng)的最佳本地IP地址作為ARP請求的源IP地址。在此模式下將忽略IP數(shù)據(jù)包的源IP地址并嘗試選擇能與目標(biāo)IP地址通信的本機地址。首要是選擇所有網(wǎng)絡(luò)接口中子網(wǎng)包含該目標(biāo)IP地址的本機IP地址。如果沒有合適的地址,將選擇當(dāng)前的網(wǎng)絡(luò)接口或其他的有可能接受到該ARP回應(yīng)的網(wǎng)絡(luò)接口來進(jìn)行發(fā)送ARP請求,并把發(fā)送ARP請求的網(wǎng)絡(luò)接口卡的IP地址設(shè)置為ARP請求的源IP。

arp_announce參數(shù)更詳細(xì)的說明

假設(shè)一個Linux服務(wù)器X有三個網(wǎng)絡(luò)接口,分別為:eth0,eth1和eth2。每個接口都有一個IP地址,分別為:IP0,IP1和IP2。當(dāng)本地應(yīng)用程序嘗試通過eth2發(fā)送IP0的IP數(shù)據(jù)包時。如果目標(biāo)節(jié)點的mac地址沒有解析。這個Linux服務(wù)器X將發(fā)送ARP請求來獲取目標(biāo)(或網(wǎng)關(guān))的mac地址。在這種情況下,ARP請求包的源IP地址是什么呢?IP0(IP數(shù)據(jù)包的中的源IP)或IP2(發(fā)送ARP請求包的網(wǎng)絡(luò)接口eth2的IP)?其實對于大部分路由器來說ARP請求包中的源IP地址使用發(fā)送ARP請求包的網(wǎng)絡(luò)接口上配置的IP地址(在上面的例子中為IP2)。但是,linux服務(wù)器的行為是點不同。在Linux服務(wù)器中通過Linux的內(nèi)核數(shù)據(jù)arp_announce,ARP請求中源地址的選擇是完全可配置。 如果我們想在ARP請求中使用IP2而不是IP0,我們應(yīng)該把arp_announce的值改為1或2。默認(rèn)值為0 - 允許使用IP0作為ARP請求包中的源IP。

其實arp_announce是為了解決Linux服務(wù)器作為路由器時的arp問題,因為路由器一般是動態(tài)學(xué)習(xí)ARP包的(一般動態(tài)配置DHCP的話)。當(dāng)內(nèi)網(wǎng)的Linux機器要發(fā)送一個到外部的ip包,那么它就會請求路由器的Mac地址,發(fā)送一個arp請求,這個arp請求里面包括了自己的ip地址和Mac地址。而linux默認(rèn)是使用ip數(shù)據(jù)包的源ip地址作為arp里面的源ip地址,而不是使用發(fā)送設(shè)備上面網(wǎng)絡(luò)接口卡的ip地址 (默認(rèn)arp_announce的值為0)。這樣在lvs架構(gòu)下,所有arp請求包的源地址都是同一個VIP地址,那么arp請求就會包括VIP地址和設(shè)備 Mac。而路由器收到這個arp請求就會更新自己的arp緩存,這樣就會造成ip欺騙了,VIP被搶奪,所以就會有問題。

arp緩存為什么會更新了,什么時候會更新呢?為了減少arp請求的次數(shù),當(dāng)主機接收到詢問自己的arp請求的時候,就會把源ip和源Mac放入自 己的arp表里面,方便接下來的通訊。如果收到不是詢問自己的包(arp是廣播的,所有人都收到),就會丟掉,這樣不會造成arp表里面無用數(shù)據(jù)太多導(dǎo)致 有用的記錄被刪除。

配置方式

要配置Linux內(nèi)核中的 arp_ignore & arp_announce 參數(shù)有多種配置方式可供選擇,下面分別介紹。

臨時生效的配置方式

臨時生效的配置方式,在系統(tǒng)重啟,或?qū)ο到y(tǒng)的網(wǎng)絡(luò)服務(wù)進(jìn)行重啟后都會失效。這種方式可用于臨時測試、或做實驗時使用。

使用 sysctl 指令配置

sysctl 命令的 -w 參數(shù)可以實時修改Linux的內(nèi)核參數(shù),并生效。所以使用如下命令可以修改Linux內(nèi)核參數(shù)中的arp_ignore & arp_announce 。

sysctl -w net.ipv4.conf.default.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.eth0.arp_ignore=1
sysctl -w net.ipv4.conf.eth1.arp_ignore=1
……

sysctl -w net.ipv4.conf.default.arp_announce =1
sysctl -w net.ipv4.conf.all.arp_announce =1
sysctl -w net.ipv4.conf.lo.arp_announce =1
sysctl -w net.ipv4.conf.eth0.arp_announce =1
sysctl -w net.ipv4.conf.eth1.arp_announce =1
……

有關(guān) sysctl 指令的更詳細(xì)介紹,請參見Linux的系統(tǒng)man手冊(man sysctl),或其他有關(guān)sysctl指令詳細(xì)介紹的文章。

修改內(nèi)核參數(shù)的映射文件

在Linux文件系統(tǒng)映射出的內(nèi)核參數(shù)配置文件中記錄了Linux系統(tǒng)中網(wǎng)絡(luò)接口ARP請求和響應(yīng)配置參數(shù) arp_ignore & arp_announce 的值。可使用vi編輯器修改文件的內(nèi)容,也可以使用如下指令修改文件內(nèi)容:

echo 1 > /proc/sys/net/ipv4/conf/default/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore
……

echo 1 > /proc/sys/net/ipv4/conf/default/arp_announce 
echo 1 > /proc/sys/net/ipv4/conf/all/arp_announce 
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_announce 
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_announce 
……

永久生效的配置方式

永久生效的配置方式,在系統(tǒng)重啟、或?qū)ο到y(tǒng)的網(wǎng)絡(luò)服務(wù)進(jìn)行重啟后還會一直保持生效狀態(tài)。這種方式可用于生產(chǎn)環(huán)境的部署搭建。

修改/etc/sysctl.conf 配置文件可以達(dá)到永久生效的目的。

在sysctl.conf配置文件中有一項名為可以添加如下面代碼段中的配置項,用于配置Linux內(nèi)核中的各網(wǎng)絡(luò)接口的 arp_ignore & arp_announce 參數(shù)。

net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth1.arp_ignore=1
……

net.ipv4.conf.default.arp_announce =1
net.ipv4.conf.all.arp_announce =1
net.ipv4.conf.lo.arp_announce =1
net.ipv4.conf.eth0.arp_announce =1
net.ipv4.conf.eth1.arp_announce =1
……

需要注意的是,修改sysctl.conf文件后需要執(zhí)行指令sysctl -p 后新的配置才會生效。

有關(guān) sysctl 指令和sysctl.conf配置文件的更詳細(xì)介紹,請參見Linux的系統(tǒng)man手冊(man sysctl和man sysctl.conf),或其他有關(guān)sysctl指令和sysctl.conf配置文件的文章。

說明

此文是作者在互聯(lián)網(wǎng)上閱讀了大量有關(guān) arp_ignore & arp_announce 的文章后,根據(jù)自己的理解進(jìn)行的總結(jié)。由于個人水平限制,難免有所失誤。如果您在閱讀時發(fā)現(xiàn)謬誤之處,還望指出,以期共同進(jìn)步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容