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
總結
以上是生活随笔為你收集整理的arp_annouce=2详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CA证书和TLS介绍
- 下一篇: Django(补充CBV,FBV)