當網絡卡收到乙個包的目的不是自己的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....