arp_ignore定義了對(duì)目標(biāo)地址為本機(jī)IP的ARP詢問(wèn)的不同應(yīng)答模式吸耿。
arp_announce對(duì)網(wǎng)絡(luò)接口(網(wǎng)卡)上發(fā)出的ARP請(qǐng)求包中的源IP地址作出相應(yīng)的限制涌萤;主機(jī)會(huì)根據(jù)這個(gè)參數(shù)值的不同選擇使用IP數(shù)據(jù)包的源IP或當(dāng)前網(wǎng)絡(luò)接口卡的IP地址作為ARP請(qǐng)求包的源IP地址。
arp_ignore
在內(nèi)核參數(shù)中除了每個(gè)網(wǎng)卡都有自己的arp_ignore配置外继找,還有兩個(gè)(一個(gè)是默認(rèn)default遂跟,一個(gè)是全局all)需要用到arp_ignore配置。所有配置項(xiàng)如下面的代碼段:
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
……
如果某個(gè)的網(wǎng)絡(luò)接口(網(wǎng)卡)上沒(méi)有配置arp_ignore參數(shù)的值則會(huì)把default上配置的arp_ignore應(yīng)用到該網(wǎng)絡(luò)接口上婴渡。而在所有網(wǎng)絡(luò)接口上實(shí)際生效的值是 all 和 對(duì)應(yīng)網(wǎng)絡(luò)接口上配置的arp_ignore參數(shù)值中較大的那個(gè)值幻锁。
arp_ignore參數(shù)的值及其含義如下:
- 0 - (默認(rèn)值): 回應(yīng)任何網(wǎng)絡(luò)接口(網(wǎng)卡)上對(duì)任何本機(jī)IP地址的arp查詢請(qǐng)求。比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到來(lái)自10.1.1.2這樣地址發(fā)起的對(duì)10.1.1.1 的arp查詢也會(huì)給出正確的回應(yīng)缩搅;而原本這個(gè)請(qǐng)求該是出現(xiàn)在eth1上,也該有eth1回應(yīng)的触幼。
- 1 - 只回答目標(biāo)IP地址是本機(jī)上來(lái)訪網(wǎng)絡(luò)接口(網(wǎng)卡)IP地址的ARP查詢請(qǐng)求 硼瓣。比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使eth0收到來(lái)自10.1.1.2這樣地址發(fā)起的對(duì)192.168.0.1的查詢會(huì)回應(yīng),而對(duì)10.1.1.1 的arp查詢不會(huì)回應(yīng)。
- 2 -只回答目標(biāo)IP地址是本機(jī)上來(lái)訪網(wǎng)絡(luò)接口(網(wǎng)卡)IP地址的ARP查詢請(qǐng)求堂鲤,且來(lái)訪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收到來(lái)自10.1.1.2這樣地址發(fā)起的對(duì)192.168.0.1的查詢不會(huì)回應(yīng),而對(duì)192.168.0.2發(fā)起的對(duì)192.168.0.1的arp查詢會(huì)回應(yīng)瘟栖。
- 3 - do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied葵擎。(不知道怎么翻譯合適,網(wǎng)上有一個(gè)參考但我認(rèn)為無(wú)法理解它的含義:不回應(yīng)該網(wǎng)絡(luò)界接口的arp請(qǐng)求半哟,而只對(duì)設(shè)置的唯一和連接地址做出回應(yīng))
- 4-7 - 保留未使用
- 8 -不回應(yīng)所有(本機(jī)地址)的arp查詢
在設(shè)置參數(shù)的時(shí)候?qū)rp_ignore 設(shè)置為1酬滤,意味著當(dāng)別人的arp請(qǐng)求過(guò)來(lái)的時(shí)候极景,如果接收的網(wǎng)絡(luò)接口卡上面沒(méi)有這個(gè)ip凉敲,就不做出響應(yīng)唠帝。默認(rèn)是0翁脆,只要這臺(tái)機(jī)器上面任何一個(gè)設(shè)備上面有這個(gè)ip筑悴,就響應(yīng)arp請(qǐng)求魏宽,并發(fā)送mac地址呆馁。
arp_announce
和arp_ignore一樣梗摇,在內(nèi)核參數(shù)中除了每個(gè)網(wǎng)卡都有自己的arp_announce配置外糯崎,還有兩個(gè)(一個(gè)是默認(rèn)default几缭,一個(gè)是全局all)需要用到arp_announce配置。所有配置項(xiàng)如下面的代碼段:
arp_announce 對(duì)網(wǎng)絡(luò)接口(網(wǎng)卡)上發(fā)出的ARP請(qǐng)求包中的源IP地址作出相應(yīng)的限制沃呢;主機(jī)會(huì)根據(jù)這個(gè)參數(shù)值的不同選擇使用IP數(shù)據(jù)包的源IP或當(dāng)前網(wǎng)絡(luò)接口卡的IP地址作為ARP請(qǐng)求包的源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
……
如果某個(gè)的網(wǎng)絡(luò)接口(網(wǎng)卡)上沒(méi)有配置arp_announce參數(shù)的值則會(huì)把default上配置的arp_announce應(yīng)用到該網(wǎng)絡(luò)接口上。而在所有網(wǎng)絡(luò)接口上實(shí)際生效的值是 all 和 對(duì)應(yīng)網(wǎng)絡(luò)接口上配置的arp_announce參數(shù)值中較大的那個(gè)值樟插。
arp_announce參數(shù)的值及其含義如下:
- 0 - (默認(rèn)) 在任意網(wǎng)絡(luò)接口(eth0,eth1韵洋,lo)上使用任何本機(jī)地址進(jìn)行ARP請(qǐng)求。也就是說(shuō)如果IP數(shù)據(jù)包中的源IP與當(dāng)前發(fā)送ARP請(qǐng)求的網(wǎng)絡(luò)接口卡IP地址不同時(shí)(但這個(gè)IP依然是本主機(jī)上其他網(wǎng)絡(luò)接口卡上的IP地址)黄锤,ARP請(qǐng)求包中的源IP地址將使用與IP數(shù)據(jù)包中的 源IP相同的本主機(jī)上的IP地址搪缨,而不是使用當(dāng)前發(fā)送ARP請(qǐng)求的網(wǎng)絡(luò)接口卡的IP地址。
- 1 -盡量避免使用不在該網(wǎng)絡(luò)接口(網(wǎng)卡)子網(wǎng)段內(nèi)的IP地址做為arp請(qǐng)求的源IP地址鸵熟。當(dāng)接收此ARP請(qǐng)求的主機(jī)要求ARP請(qǐng)求的源IP地址與接收方IP在同一子網(wǎng)段時(shí)副编,此模式非常有用。此時(shí)會(huì)檢查IP數(shù)據(jù)包中的源IP是否為所有網(wǎng)絡(luò)接口上子網(wǎng)段內(nèi)的ip之一流强。如果找到了一個(gè)網(wǎng)絡(luò)接口的IP正好與IP數(shù)據(jù)包中的源IP在同一子網(wǎng)段痹届,則使用該網(wǎng)絡(luò)接口卡進(jìn)行ARP請(qǐng)求。如果IP數(shù)據(jù)包中的源IP不屬于各個(gè)網(wǎng)絡(luò)接口上子網(wǎng)段內(nèi)的ip打月,那么將采用級(jí)別2的方式來(lái)進(jìn)行處理队腐。
- 2 - 始終使用與目標(biāo)IP地址對(duì)應(yīng)的最佳本地IP地址作為ARP請(qǐng)求的源IP地址。在此模式下將忽略IP數(shù)據(jù)包的源IP地址并嘗試選擇能與目標(biāo)IP地址通信的本機(jī)地址奏篙。首要是選擇所有網(wǎng)絡(luò)接口中子網(wǎng)包含該目標(biāo)IP地址的本機(jī)IP地址柴淘。如果沒(méi)有合適的地址迫淹,將選擇當(dāng)前的網(wǎng)絡(luò)接口或其他的有可能接受到該ARP回應(yīng)的網(wǎng)絡(luò)接口來(lái)進(jìn)行發(fā)送ARP請(qǐng)求,并把發(fā)送ARP請(qǐng)求的網(wǎng)絡(luò)接口卡的IP地址設(shè)置為ARP請(qǐng)求的源IP为严。
對(duì)arp_announce
參數(shù)更詳細(xì)的說(shuō)明
假設(shè)一個(gè)Linux服務(wù)器X有三個(gè)網(wǎng)絡(luò)接口敛熬,分別為:eth0,eth1和eth2第股。每個(gè)接口都有一個(gè)IP地址应民,分別為:IP0,IP1和IP2夕吻。當(dāng)本地應(yīng)用程序嘗試通過(guò)eth2發(fā)送IP0的IP數(shù)據(jù)包時(shí)诲锹。如果目標(biāo)節(jié)點(diǎn)的mac地址沒(méi)有解析。這個(gè)Linux服務(wù)器X將發(fā)送ARP請(qǐng)求來(lái)獲取目標(biāo)(或網(wǎng)關(guān))的mac地址梭冠。在這種情況下辕狰,ARP請(qǐng)求包的源IP地址是什么呢?IP0(IP數(shù)據(jù)包的中的源IP)或IP2(發(fā)送ARP請(qǐng)求包的網(wǎng)絡(luò)接口eth2的IP)控漠?其實(shí)對(duì)于大部分路由器來(lái)說(shuō)ARP請(qǐng)求包中的源IP地址使用發(fā)送ARP請(qǐng)求包的網(wǎng)絡(luò)接口上配置的IP地址(在上面的例子中為IP2)蔓倍。但是,linux服務(wù)器的行為是點(diǎn)不同盐捷。在Linux服務(wù)器中通過(guò)Linux的內(nèi)核數(shù)據(jù)arp_announce
偶翅,ARP請(qǐng)求中源地址的選擇是完全可配置。 如果我們想在ARP請(qǐng)求中使用IP2而不是IP0碉渡,我們應(yīng)該把arp_announce
的值改為1或2聚谁。默認(rèn)值為0 - 允許使用IP0作為ARP請(qǐng)求包中的源IP。
其實(shí)arp_announce是為了解決Linux服務(wù)器作為路由器時(shí)的arp問(wèn)題滞诺,因?yàn)槁酚善饕话闶莿?dòng)態(tài)學(xué)習(xí)ARP包的(一般動(dòng)態(tài)配置DHCP的話)形导。當(dāng)內(nèi)網(wǎng)的Linux機(jī)器要發(fā)送一個(gè)到外部的ip包,那么它就會(huì)請(qǐng)求路由器的Mac地址习霹,發(fā)送一個(gè)arp請(qǐng)求朵耕,這個(gè)arp請(qǐng)求里面包括了自己的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請(qǐng)求包的源地址都是同一個(gè)VIP地址煞檩,那么arp請(qǐng)求就會(huì)包括VIP地址和設(shè)備 Mac处嫌。而路由器收到這個(gè)arp請(qǐng)求就會(huì)更新自己的arp緩存,這樣就會(huì)造成ip欺騙了斟湃,VIP被搶奪熏迹,所以就會(huì)有問(wèn)題。
arp緩存為什么會(huì)更新了凝赛,什么時(shí)候會(huì)更新呢注暗?為了減少arp請(qǐng)求的次數(shù)厨剪,當(dāng)主機(jī)接收到詢問(wèn)自己的arp請(qǐng)求的時(shí)候,就會(huì)把源ip和源Mac放入自 己的arp表里面友存,方便接下來(lái)的通訊。如果收到不是詢問(wèn)自己的包(arp是廣播的陶衅,所有人都收到)屡立,就會(huì)丟掉,這樣不會(huì)造成arp表里面無(wú)用數(shù)據(jù)太多導(dǎo)致 有用的記錄被刪除搀军。
配置方式
要配置Linux內(nèi)核中的 arp_ignore & arp_announce 參數(shù)有多種配置方式可供選擇膨俐,下面分別介紹。
臨時(shí)生效的配置方式
臨時(shí)生效的配置方式罩句,在系統(tǒng)重啟焚刺,或?qū)ο到y(tǒng)的網(wǎng)絡(luò)服務(wù)進(jìn)行重啟后都會(huì)失效。這種方式可用于臨時(shí)測(cè)試门烂、或做實(shí)驗(yàn)時(shí)使用乳愉。
使用 sysctl 指令配置
sysctl 命令的 -w 參數(shù)可以實(shí)時(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ì)介紹,請(qǐng)參見(jiàn)Linux的系統(tǒng)man手冊(cè)(man sysctl)慨丐,或其他有關(guān)sysctl指令詳細(xì)介紹的文章坡脐。
修改內(nèi)核參數(shù)的映射文件
在Linux文件系統(tǒng)映射出的內(nèi)核參數(shù)配置文件中記錄了Linux系統(tǒng)中網(wǎng)絡(luò)接口ARP請(qǐng)求和響應(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)行重啟后還會(huì)一直保持生效狀態(tài)恬砂。這種方式可用于生產(chǎn)環(huán)境的部署搭建。
修改/etc/sysctl.conf 配置文件可以達(dá)到永久生效的目的伶唯。
在sysctl.conf配置文件中有一項(xiàng)名為可以添加如下面代碼段中的配置項(xiàng)觉既,用于配置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 后新的配置才會(huì)生效瞪讼。
有關(guān) sysctl 指令和sysctl.conf配置文件的更詳細(xì)介紹,請(qǐng)參見(jiàn)Linux的系統(tǒng)man手冊(cè)(man sysctl和man sysctl.conf)粹断,或其他有關(guān)sysctl指令和sysctl.conf配置文件的文章符欠。
說(shuō)明
此文是作者在互聯(lián)網(wǎng)上閱讀了大量有關(guān) arp_ignore & arp_announce 的文章后,根據(jù)自己的理解進(jìn)行的總結(jié)瓶埋。由于個(gè)人水平限制希柿,難免有所失誤诊沪。如果您在閱讀時(shí)發(fā)現(xiàn)謬誤之處,還望指出曾撤,以期共同進(jìn)步端姚。