當網絡卡收到乙個包的目的位址不是自己的位址時

2022-04-13 22:07:24 字數 4086 閱讀 6965

當網絡卡收到乙個包的目的不是自己的ip

或者問題變成了,多網絡卡的機器路由選擇

機器有兩張網絡卡a和b,我將pingb的包傳送給a這個時候是能ping通的,所以這裡涉及到乙個問題,網絡卡怎麼知道這個資料報是不是自己的?拿到icmp資料報後會怎麼做呢?所以這裡就涉及到icmp協議了xx

這是因為這台機器上所有的網絡卡都標誌了這台機器的身份,所以

那這麼說的話,我從樹莓派裡面去ping我主機上的這些位址其實也是能ping通的shi 。

在樹莓派上玩了,確實是這樣的,和tap機制一樣,當我給與樹莓派直連的網絡卡上

但是無論是從qemu上ping還是從樹莓派ping,宿主機上直連的網絡卡必須與樹莓派和宿主機是同乙個網段,這裡不是很明白啊,為啥一定要是同乙個網段的呢?

這裡涉及到arp協議,arp協議傳送的是乙個位址的資訊;

所以arp協議接收端發生了啥?

tap0和虛機中的eth0是直連的,但是tap0:192.168.11.3/24, 但是虛機eth0是:192.168.0.110/24,增加了一條路由:route add default eth0,也就是說,其實tap0能收到來自eth0的包,並且實際從tap0上確實也觀測到了相關的包,but。。。就是ping不同;也就是說掩碼只在傳送端才有意義,這是個錯的之前假設arp中是不會傳送掩碼的!這個也是錯的麼?

當把eth0的掩碼換成255.255.0.0 即18的時候

,奇蹟發生了,這個時候就ping通了,這說明:arp協議的接受端會判斷來的ip位址和自己是不是乙個子網(通過自己的ip位址和netmask),如果是那就直接返回了。【arp接受部分的**

還有問題宿主機上除了tap0,還有另外一塊網絡卡是enp0s25,這個網絡卡的ip位址是11.11.11.11/255.255.255.0, 此時從虛擬機器中去ping這個位址能ping通麼?

答案是:能ping通

直接上wiresharp抓到的包:不方便截圖,下次自己手動操作一下吧

eth0 虛機 <-----> tap0 <-------> enp0s25

監控tap0,發現了:who has 11.11.11.11 tell 192.168.0.110 mac 位址是86:04:41是tap0的mac位址

也就是說tap0收到了從虛機中eth0中來的包之後,開始在自己的廣播域中發起了一條arp廣播,誰的ip位址是11.11.11.11,告訴192.168.0.110,那麼都有誰在這個廣播域中,問題就來了,我這台機器上有docker0,enp0s25,等等諸多的網絡卡,是所有人都能聽到這個arp資訊麼?docker0看不到. 看下arp的**

inet_confirm_addr ---> confirm_addr_indev

當一台宿主機上有多個網絡卡時,當arp包到了之後,就會用inet_c

這個函式也是顧名思義的,「確認一下addr是否在這個dev中」

arp請求從哪個網絡卡進入則一定從哪個網絡卡出去

最關鍵的配置是in_device

struct ipv4_devconf ;

這裡有每個裝置的配置,其中主要的設定如下圖所示:

ipv4_devconf_forwarding=1,

ipv4_devconf_mc_forwarding,

ipv4_devconf_proxy_arp,

ipv4_devconf_accept_redirects,

ipv4_devconf_secure_redirects,

ipv4_devconf_send_redirects,

ipv4_devconf_shared_media,

ipv4_devconf_rp_filter,

ipv4_devconf_accept_source_route,

ipv4_devconf_bootp_relay,

ipv4_devconf_log_martians,

ipv4_devconf_tag,

ipv4_devconf_arpfilter,

ipv4_devconf_medium_id,

ipv4_devconf_noxfrm,

ipv4_devconf_nopolicy,

ipv4_devconf_force_igmp_version,

ipv4_devconf_arp_announce,

ipv4_devconf_arp_ignore,

ipv4_devconf_promote_secondaries,

ipv4_devconf_arp_accept,

ipv4_devconf_arp_notify,

ipv4_devconf_accept_local,

ipv4_devconf_src_vmark,

ipv4_devconf_proxy_arp_pvlan,

ipv4_devconf_route_localnet,

ipv4_devconf_igmpv2_unsolicited_report_interval,

ipv4_devconf_igmpv3_unsolicited_report_interval,

ipv4_devconf_ignore_routes_with_linkdown,

ipv4_devconf_drop_unicast_in_l2_multicast,

ipv4_devconf_drop_gratuitous_arp,

__ipv4_devconf_max

修改的方法:

修改方法

臨時修改方法:

1. 修改/proc檔案系統:

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "1">/proc/sys/net/ipv4/conf/eth0/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce

2. 使用sysctl -w直接寫入記憶體:

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

sysctl -w net.ipv4.conf.eth0.arp_ignore=1

sysctl -w net.ipv4.conf.all.arp_announce=2

sysctl -w net.ipv4.conf.eth0.arp_announce=2

永久修改需要寫入配置檔案:

修改/etc/sysctl.conf檔案,然後sysctl -p重新整理到記憶體。

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.eth0.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

net.ipv4.conf.eth0.arp_announce=2

備註:arp_ignore和arp_announce引數分別有all,default,lo,eth0等對應不同網絡卡。當all和具體網絡卡的引數值不一致時,配置為較大值的生效。一般只需修改all和某個具體網絡卡的引數即可。

0:響應任意網絡卡上接收到的對本機ip位址的arp請求(包括環迴網絡卡上的位址),而不管該目的ip是否在接收網絡卡上。

4~7:預留。

8:不回應所有的arp請求。

親試有效!

當設定成0的時候,能ping通,但是這說明了乙個問題,因為1和2的檢查會更嚴格一些

當設定成1後,可以不是乙個網段的:192.168.0.110 經192.168.11.3/24 ping 192.168.199.120 應該能ping通才對呢,但是為啥子ping不通呢,從**上看也是能ping通的才對呢

雙網絡卡伺服器只能ping通乙個IP位址的原因

linux預設啟用了反向路由檢查。如果2個網絡卡都在乙個lan裡面,那麼伺服器可能從eth0或者eth1發現閘道器。如果乙個包從eth0進入,而伺服器發現的閘道器在eth1上,那麼包是從eth1出不去的,所以就不通了。反向路由檢查要求從 來的才能回哪去。關閉反向路由檢查 根據實際情況替換第二第三行的...

考慮乙個線性位址轉換實體地址的過程

考慮乙個線性位址轉換實體地址的過程 在32位平台傷,如果乙個線性位址位 00011010 0011 1000 0100 1100 0001 0001 a 根據cr3找到頁目錄 考慮在 linux0.1x下面只有乙個頁目錄表的情況下 根據線性位址的高 10位即 00011010 00 aa 在 頁目錄...

判斷輸入的字串是不是乙個有效的IP位址

判斷輸入的字串是不是乙個有效的ip位址 請實現如下介面 boolisipaddressvalid constchar pszipaddr 輸入 pszipaddr 字串 約束 輸入ip為 格式 字串兩端含有空格認為是合法ip 字串中間含有空格認為是不合法ip 類似於 01.1.1.1,1.02.3....