1. 程式人生 > 其它 >雙網絡卡問題

雙網絡卡問題

目錄

雙網絡卡問題

問題

環境介紹:

如上圖所示,PC-A有兩卡網絡卡,注意,網絡卡一設定有預設閘道器,而網絡卡二並沒有,網絡卡二隻有IP和掩碼,網絡卡的預設閘道器位於路由器的某個介面上;PC-B的預設閘道器也在路由器某個介面上;

問題一

我當前在PC-A上執行ping命令,如下所示:

ping -n 1 192.168.1.2
  • PC-A所ping的192.168.1.2是面板?還是PC-B?

這種問題不能在模擬器上做實驗,模擬器雖然模擬程度高,但還沒做到可以媲美真實環境;這種問題還是得正兒八經的用真實的環境,真實的windows電腦,真實交換機和路由器。為了保證實驗的真實性,每一步操作之後都會通過arp -d 清空一下arp快取。

PC-A的操作:
# arp -d 清空arp快取
PS C:\Windows\system32> arp -d

# ping -n 1 是指定ping 的次數為1次
PS C:\Windows\system32> ping -n 1 192.168.1.30
正在 Ping 192.168.1.30 具有 32 位元組的資料:
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=128

192.168.1.30 的 Ping 統計資訊:
    資料包: 已傳送 = 1,已接收 = 1,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 0ms,最長 = 0ms,平均 = 0ms

PS C:\Windows\system32> arp -a | findstr "192.168.1.30"
  192.168.1.30          00-08-0a-0d-0d-b8     ??   # 注意這這裡,此MAC就是面板機網絡卡的MAC地址;

通過上述操作,我們發現當我們ping 192.168.1.30的時候,響應的是面板機,這與我們所理解的情況是一樣的,我們可以再進一步操作,在ping的同時加上-t,如下所示,我們得到的結果與上述是一樣的;

PC-A的操作:
PS C:\Windows\system32> arp -d
PS C:\Windows\system32> ping 192.168.1.30 -t

正在 Ping 192.168.1.30 具有 32 位元組的資料:
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=128
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=128
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=128
來自 192.168.1.30 的回覆: 位元組=32 時間=1ms TTL=128
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=128
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=128

PS C:\Windows\system32> arp -a | findstr "192.168.1.30"
  192.168.1.30          00-08-0a-0d-0d-b8     ??

我們可以再進一步驗證,在pc-a在ping的時候,我們在它的網絡卡二上進行抓包,如下所示:

通過上述幾步操作,充分說明了,當我們在PC-A上ping 192.168.1.30,參與應答的就是面板機。

問題二

PC-A網絡卡二所在網路內部只有兩臺主機,一臺是PC-A本身,另一個就是面板機,如果現在面板機的IP地址被改成了192.168.1.31,那pc-a再ping 192.168.1.30的時候會發現什麼情況?

PS C:\Windows\system32> arp -d
PS C:\Windows\system32> ping -n 1 192.168.1.30

正在 Ping 192.168.1.30 具有 32 位元組的資料:
來自 192.168.1.2 的回覆: 無法訪問目標主機。

192.168.1.30 的 Ping 統計資訊:
    資料包: 已傳送 = 1,已接收 = 1,丟失 = 0 (0% 丟失),

我們在PC-A的網絡卡二上抓包會發現,網絡卡二向其所在的網路發現了三次arp廣播,沒有迴應,於是判斷無法訪問目標主機。

那如果我們將ping -n 改成2呢?

PS C:\Windows\system32> arp -d
PS C:\Windows\system32> ping -n 2 192.168.1.30

正在 Ping 192.168.1.30 具有 32 位元組的資料:
來自 192.168.1.2 的回覆: 無法訪問目標主機。
來自 192.168.1.30 的回覆: 位元組=32 時間<1ms TTL=63

192.168.1.30 的 Ping 統計資訊:
    資料包: 已傳送 = 2,已接收 = 2,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 0ms,最長 = 0ms,平均 = 0ms

PS C:\Windows\system32> arp -a | findstr "192.168.1.30"
PS C:\Windows\system32> arp -a | findstr "10.100.12.1"
??: 10.100.12.11 --- 0x3
  10.100.12.1           80-e4-55-f5-d8-68     ??

注意,問題出現了,我們發現第二個包竟然是通了,但我們通過arp表項檢視192.168.1.30,發現是空的,這說明什麼?這說明此時的192.168.1.30與自己不是同一個網段,而是跨網段通訊的,PC-A將請求將給了閘道器,arp表項裡面只有閘道器的mac,沒有192.168.1.30的具體mac;

上面的抓包是在PC-A的網絡卡二上進行抓的,說明電腦第一反應還是正常的,還是從自己網絡卡二的網路當中去找192.168.1.30,當電腦發現通過網絡卡二無法找到192.168.1.30的時候,轉而向網絡卡一進行“求助”,根據通訊原則,網絡卡一介入處理PC-A通往192.168.1.30的報文,於是網絡卡一將其交給閘道器處理,我們可以在執行ping -n 2 192.168.1.30網絡卡一上也抓包驗證一下,如下所示:

總結

當我們在PC-A上執行ping -n 1 192.168.1.30的時候,PC-A確實會遵循通訊原則,判斷192.168.1.30與自己的網絡卡二處於一個網段,所以會從網絡卡二向192.168.1.30發出三次arp請求,如果這三次arp有應答,那就是通的,如果三次沒有一次成功,那就是通的。

當拓撲變成了這樣:

我們再在PC-A執行ping -n 1 192.168.1.30,這時候PC-A還是會通過網絡卡二做三次的arp廣播,有回答則通,反之剛不通;但是如果我們ping 192.168.1.30 -t的話,我們會發現在第二個包的時候會通,為什麼?這是因為windows系統執行機制所決定的,windows這種成熟的作業系統還是恪守了通訊的基本原則,但沒有死守,當windows通過網絡卡二傳送了三次arp請求之後,發現沒有回答,立馬將任務交於另一個網絡卡,而另一個網絡卡也會根據通訊原則重新做判斷,網絡卡一根據通訊原則發現192.168.1.30與自己的網絡卡不是一個網段,但網絡卡一有閘道器,於是將資料包交給閘道器,閘道器再交給PC-B,PC-B成功應答;

問題三

當我在PC-A通過nmap的ping scan方法掃描192.168.1.0/24整個網網段的時候結果相當之”單純“,就只有網絡卡二所接入網路內的所有的主機,就僅僅發了一次arp廣播,比windows系統本身還要少兩次,windows預設是三次,但這並不能說明nmap不好用,只能說nmap為了實現高速掃描目的在一定程度上犧牲了準確性,但nmap掃描的也挺準的,好像準備性也沒有收到什麼影響,如下圖抓包所示:

我同事使用另一種掃描工具,不僅會把網絡卡二所接的網路內的主機列出來,還會將路由器另一側同樣的是192.168.1.0/24網段內主機給列出來,是因為我同事使用的那個工具是呼叫的windows自帶的ping,而且起碼ping的次數是二次,每一次是三次arp廣播,前三個arp廣播會發到網絡卡二所在的網段,而後三個就會交給網絡卡一處理,自然就會把路由器另一側屬於192.168.1.0/24網段的主機給列出來。