某次和一個兄弟吃飯,他問了我這么一個問題: 一個 NAT 路由器,LAN 口地址為192.168.1.1/24,接了三台電腦PC1、PC2、PC3;WAN 口地址為192.168.2.1/24,接了一台電腦PC4,已知 WAN 口出去的報文,源 IP 地址都被轉換為192.168.2.1。若 PC1-3 同時 ping PC4,在 WAN 口上(或者 PC4上)抓取 ICMP 報文,怎么確定某個 ICMP 報文究竟屬於是 LAN 口哪個電腦發出的?
久了未學習網絡的相關知識,當時確實沒想起怎么確定。后來兄弟給出了答案:ICMP 包含在 IP 數據報中,網絡傳輸過程中, IP 頭里面的 Identification 字段不會發生變化,因此可以通過該字段確定 ICMP 報文是哪個電腦發出來的,在 PC1-3 上也同時抓取 ICMP 報文,然后使用 Identification 字段對比即可。
關於 Identification 字段。該字段占 16 bit,IP 軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識字段。但這個“標識”並不是序號,因為 IP 是無連接服務,因此數據報不存在按序接收的問題。那么該字段究竟有什么用?當一個數據報長度過長,超過網絡 MTU 而需要分片時,則把標識字段的值復制到所有分片數據報中,最后在目的設備才能依據標志字段而正確的重組數據報,因此該字段可以唯一標識某個 IP 報文。
親自嘗試了一下:
1、路由器: LAN 口(IP地址/掩碼:192.168.66.1/24)、WAN 口(IP地址/掩碼:192.168.0.222/24),NAT 模式;
2、路由器接了 PC1(IP地址/掩碼:192.168.66.5/24,網關:192.168.66.1)、PC2(IP地址/掩碼:192.168.66.6/24,網關:192.168.66.1);WAN 口接了 PC3(IP地址/掩碼:192.168.0.223/24,無網關)
3、PC1 和 PC2 同時 ping PC3,且同時在 PC1、PC2、PC3 上抓包
結果:pic1.png 和 pic2.png 是在 PC3 上抓的 ICMP 包,pic3.png 是在 PC1 上抓的 ICMP 包,pic4.png 是在 PC2 上抓的 ICMP 包。PC3 上收到的 ICMP 包,源地址都是路由器 WAN 口的 IP 地址,源 MAC 地址也是 路由器 WAN 口的 MAC 地址,怎么區別哪個 ICMP 包是來自於 PC1 還是 PC2?仔細看,IP 頭的 Identification 字段,pic1.png 中的 Identification 字段 和 pic3.png 中的 Identification 相同,說明 pic1.png 中第一個 ICMP 請求是 PC1 發出的 ICMP 請求,同理,pic2.png 中第二個 ICMP 請求是 PC2 發出的 ICMP 請求。
pic1.png
pic2.png

pic3.png
pic4.png

