目前所使用的NAT基本都是NAPT,即多端口的NAT技術,因此本文主要是設計了兩種測定路由器NAPT類型的實驗。
實驗環境
設備
- 主機A:Windows
- 主機B:Windows
- 路由器
軟件
- nc
- Wireshark
- SocketTools
在局域網內部完成所有測試,完全不需要互聯網連接
實驗設計
實驗方案一
不使用外部工具,使用系統自帶的工具
實驗拓撲
[主機A] (雙網卡)|--- 網卡1 (例如: 192.168.1.10):連接外部網絡,禁用或斷掉。||--- 網卡2 (手動配置IP,例如: 192.168.137.1):用網線連接至路由器WAN口。|
[WiFi路由器]|--- WAN口: 連接主機A的網卡2|--- LAN口: 用網線連接至主機B|
[主機B] (手動配置IP,例如: 192.168.1.100):連接路由器LAN口。
關鍵點:
- 主機A的第二個網卡和路由器WAN口構成了一個獨立的迷你網絡
- 而路由器LAN口和主機B構成了另一個網絡。
- 路由器在這兩個網絡之間執行NAT。
配置步驟
- 物理連接:
- 用一根網線,連接主機A的第二個網卡 到 路由器的WAN口。
- 用另一根網線,連接主機B 到 路由器的任意一個LAN口。
- 確保路由器、主機A、主機B的WiFi功能均已關閉。
- 配置主機A的網卡2:
- 右鍵點擊“網絡”->“屬性”->“更改適配器設置”。
- 找到連接路由器WAN口的那個網絡連接。
- 右鍵“屬性”->“Internet協議版本4 (TCP/IPv4)”->“屬性”。
- 選擇“使用下面的IP地址”:
- P地址: 192.168.137.1
- 子網掩碼: 255.255.255.0
- 默認網關: 留空
- 這一步是把主機A變成一個簡單的“網關”設備。
- 配置路由器WAN口:
- 登錄路由器管理后臺(通常地址是192.168.1.1或192.168.0.1,通過主機B連接后訪問)。
- 找到“上網設置”或“WAN口設置”。
- 將上網方式改為“靜態IP”或“固定IP”。
- 填寫如下信息:
- IP地址: 192.168.137.2 (必須和主機A的網卡2在同一網段)
- 子網掩碼: 255.255.255.0
- 默認網關: 192.168.137.1 (指向主機A的網卡2)
- DNS服務器: 可以留空或填寫 192.168.137.1
- 配置主機B:
- 確保其通過LAN口從路由器自動獲取IP地址(DHCP)即可。
- 正常情況下,它會獲得一個 192.168.1.x 的IP地址。記下這個地址,例如 192.168.1.100。
進行NAT類型測試
現在,網絡環境變成了:
- “偽公網”側: 主機A (192.168.137.1) 和 路由器WAN口 (192.168.137.2)。
- 內網側: 主機B (192.168.1.100) 和 路由器LAN口 (192.168.1.1)。
主機A 現在扮演了兩個角色:
- 它是“偽公網”上的一個節點。
- 它是我們用來測試路由器NAT行為的控制機。
測試方法(使用Windows自帶功能)
將使用Windows自帶的PowerShell和測試連接命令來完成,完全無需下載第三方軟件。
第1步:在主機A上開啟路由和防火墻規則
以管理員身份打開PowerShell,輸入以下命令,允許IP轉發并添加防火墻規則,允許ICMP和UDP回顯請求:
# 啟用IP轉發(讓主機A成為一個簡單的路由器)
Set-NetIPInterface -Forwarding Enabled# 添加防火墻規則,允許ICMP (ping)
New-NetFirewallRule -DisplayName "NAT_Test_ICMP" -Direction Inbound -Action Allow -Protocol ICMPv4# 添加防火墻規則,允許UDP端口20000-20010(用于測試)
New-NetFirewallRule -DisplayName "NAT_Test_UDP" -Direction Inbound -Action Allow -Protocol U
第2步:測試NAT映射行為(判斷對稱型還是錐型)
1.在主機A上監聽UDP包:
打開兩個PowerShell窗口(窗口1和窗口2)。
- 在窗口1中運行,監聽端口20000:
nc -lu -p 20000
- 在窗口2中運行,監聽端口20001:
nc -lu -p 20001
(如果系統沒有nc,可以先安裝,或者使用更強大的Test-NetConnection,但監聽功能較弱。建議臨時下載一個輕量版nc,或者用Python簡單腳本替代,這是此方案唯一可能非“純粹自帶”的點)
2.從主機B向內網側的路由器公網IP發包:
在主機B上打開PowerShell。
- 首先,向主機A的第一個端口(20000)發送UDP包:
# 目標地址是路由器WAN口的IP
echo "test1" | nc -u 192.168.137.2 20000
- 然后,向主機A的第二個端口(20001)發送UDP包:
echo "test2" | nc -u 192.168.137.2 20001
3.在主機A上觀察結果:
- 查看窗口1和窗口2,看是否收到了test1和test2消息。
- 更重要的是,記錄下每個消息的來源IP和端口。這個來源IP應該是主機B的內網IP(192.168.1.100),但來源端口非常重要!我們稱之為PortB1和PortB2。
- 分析:
- 如果 PortB1 等于 PortB2: 路由器是 錐型NAT。
- 如果 PortB1 不等于 PortB2: 路由器是 對稱型NAT。
第3步:測試NAT過濾行為(判斷錐型子類型)
假設上一步測出是錐型NAT (PortB1 == PortB2 = PortX)
。
1.從主機A主動向主機B發包:
- 在主機A的PowerShell中,直接向主機B的內網IP 192.168.1.100 的某個端口(如30000)發送一個UDP包。這一步是為了“在白名單上增加一個IP”。
echo "enable" | nc -u 192.168.1.100 30000
- 主機B上不需要監聽,目的是讓路由器記錄一次會話
2.從主機A嘗試逆向連接:
- 現在,在主機A上,嘗試從一個全新的、未被使用的端口(例如20005)向主機B剛才使用的源端口PortX發送數據。
# 在主機A上開一個新的PowerShell窗口
echo "Hello from A" | nc -u -p 20005 192.168.1.100 $PortX
- 觀察主機B是否能收到這個包(可以在主機B上臨時用nc -lu -p $PortX監聽)
分析
- 情況A:主機B直接收到了這個包(從192.168.137.2:20005發來)。
- 結論: Full Cone NAT。任何外部主機都可以通過映射后的端口(PortX)聯系主機B。
- 情況B:主機B沒有收到包。
- 現在,讓主機A從之前主機B聯系過的端口(例如20000)再次向PortX發送。
echo "Hello again" | nc -u -p 20000 192.168.1.100 $PortX
- 如果主機B這次收到了:
- 結論: Port Restricted Cone NAT。路由器要求源IP和源端口都必須匹配才放行。
- 如果主機B還是沒收到:
- 說明規則可能更嚴格,或者測試中有誤。但在這種封閉環境中,Port Restricted Cone NAT 是最常見的家用路由器行為。
實驗方案二
使用 SocketTool 和 Wireshark 組合
- Wireshark 可以清晰地看到每一個數據包的細節(源IP、源端口、目標IP、目標端口、協議),這是驗證 NAT 行為最權威的方式。
- SocketTool 則提供了圖形化的界面來創建服務器和客戶端,比命令行更易于操作和觀察。
實驗拓撲(同上)
[主機A] (雙網卡)|--- 網卡1 (例如: 192.168.1.10):連接外部網絡,禁用或斷掉。||--- 網卡2 (手動配置IP,例如: 192.168.137.1):用網線連接至路由器WAN口。|
[WiFi路由器]|--- WAN口: 連接主機A的網卡2|--- LAN口: 用網線連接至主機B|
[主機B] (手動配置IP,例如: 192.168.1.100):連接路由器LAN口。
關鍵點:
- 主機A的第二個網卡和路由器WAN口構成了一個獨立的迷你網絡
- 而路由器LAN口和主機B構成了另一個網絡。
- 路由器在這兩個網絡之間執行NAT。
配置步驟(同上)
- 物理連接:
- 用一根網線,連接主機A的第二個網卡 到 路由器的WAN口。
- 用另一根網線,連接主機B 到 路由器的任意一個LAN口。
- 確保路由器、主機A、主機B的WiFi功能均已關閉。
- 配置主機A的網卡2:
- 右鍵點擊“網絡”->“屬性”->“更改適配器設置”。
- 找到連接路由器WAN口的那個網絡連接。
- 右鍵“屬性”->“Internet協議版本4 (TCP/IPv4)”->“屬性”。
- 選擇“使用下面的IP地址”:
- P地址: 192.168.137.1
- 子網掩碼: 255.255.255.0
- 默認網關: 留空
- 這一步是把主機A變成一個簡單的“網關”設備。
- 配置路由器WAN口:
- 登錄路由器管理后臺(通常地址是192.168.1.1或192.168.0.1,通過主機B連接后訪問)。
- 找到“上網設置”或“WAN口設置”。
- 將上網方式改為“靜態IP”或“固定IP”。
- 填寫如下信息:
- IP地址: 192.168.137.2 (必須和主機A的網卡2在同一網段)
- 子網掩碼: 255.255.255.0
- 默認網關: 192.168.137.1 (指向主機A的網卡2)
- DNS服務器: 可以留空或填寫 192.168.137.1
- 配置主機B:
- 確保其通過LAN口從路由器自動獲取IP地址(DHCP)即可。
- 正常情況下,它會獲得一個 192.168.1.x 的IP地址。記下這個地址,例如 192.168.1.100。
進行NAT類型測試
第一步:在主機A上開啟路由和防火墻
以管理員身份打開PowerShell,執行以下命令:
# 啟用IP轉發
Set-NetIPInterface -Forwarding Enabled# 添加防火墻規則,允許UDP端口20000-20010(用于測試)
New-NetFirewallRule -DisplayName "NAT_Test_UDP" -Direction Inbound -Action Allow -Protocol UDP -LocalPort 20000-20010
第二步:測試NAT映射行為(對稱型 or 錐型)
測試的目的是看主機B訪問兩個不同的外部地址時,路由器為其分配的公網端口是否相同
1.在主機A上創建兩個UDP服務器:
- 打開兩個 SocketTool 窗口。
- 在第一個窗口中,創建 UDP Server。監聽地址選擇 0.0.0.0 或 192.168.137.1,監聽端口填寫 20000。點擊“創建”。
- 在第二個窗口中,再創建一個 UDP Server。監聽端口填寫 20001。點擊“創建”。
- 現在,主機A就在它的兩個端口上等待接收UDP數據了。
2.在主機B上創建UDP客戶端并向主機A發包:
- 在主機B上打開 SocketTool。
- 創建 UDP Client。遠程主機地址填寫路由器的WAN口IP:192.168.137.2。
- 首先,在“遠程端口”處填寫 20000,在發送數據框里輸入 test1,點擊“發送”。
- 然后,將“遠程端口”改為 20001,在發送數據框里輸入 test2,點擊“發送”。
3.在主機A上觀察并記錄:
- 觀察兩個UDP服務器窗口,你應該會分別收到 test1 和 test2 消息。
- 關鍵: SocketTool會顯示每條消息的來源IP和端口。這個來源IP是主機B的內網IP(192.168.1.100),但端口是路由器NAT轉換時分配的公網端口(我們稱之為 PortB1 和 PortB2)。
- 記錄下這兩個端口號。
4.使用Wireshark驗證(可選但推薦):
- 在主機A上打開Wireshark,選擇綁定IP 192.168.137.1 的那個網卡,開始抓包。
- 設置過濾器為 udp.port == 20000 or udp.port == 20001。
- 重復第2步的發送操作。會在Wireshark中清晰地看到數據包。
- 查看數據包的詳情:“Internet Protocol Version 4” -> “Source Address” 是 192.168.137.2(路由器WAN口),但“User Datagram Protocol” -> “Source Port” 就是要找的 PortB1 和 PortB2。這提供了最權威的證據。
5.分析Mapping:
- 如果 PortB1 等于 PortB2: 路由器是 錐型NAT。
- 如果 PortB1 不等于 PortB2: 路由器是 對稱型NAT。
第三步:測試NAT過濾行為(判斷錐型子類型)
假設上一步測出是錐型NAT (PortB1 == PortB2 = PortX)
。
1.在主機B上創建UDP服務器:
- 在主機B上打開一個新的 SocketTool 窗口。
- 創建一個 UDP Server。監聽端口填寫一個數字,比如 30000。點擊“創建”。讓這個窗口保持打開監聽狀態
2.從主機A嘗試逆向發送數據:
- 在主機A上打開一個新的 SocketTool 窗口。
- 創建一個 UDP Client。
- 遠程主機地址填寫主機B的內網IP:192.168.1.100。
- 遠程端口填寫主機B正在監聽的端口 30000。
- 在發送框輸入 Hello from A,點擊“發送”。
- 目的:這個操作是為了在路由器的NAT會話表中創建一個記錄,讓路由器認為“192.168.1.100:30000這個內部主機已經和外部地址(192.168.137.1)通信過了”。
3.進行關鍵的過濾測試:
- 現在,在主機A上,再次使用 UDP Client。
- 這次,遠程主機地址仍然填主機B的IP 192.168.1.100。
- 但是,遠程端口要填之前記錄下來的路由器映射端口 PortX。
- 在發送框輸入 Test Filtering,點擊“發送”。
4.觀察結果:
- 情況A:在主機B的UDP服務器(端口30000)上收到了 Test Filtering 消息。
- 結論: Full Cone NAT。任何外部主機都可以通過映射端口 PortX 聯系主機B,無論主機B之前是否與之通信過。
- 情況B:主機B沒有收到任何消息。
- 現在,讓主機A從最初接收數據的端口(20000) 再次向 192.168.1.100:PortX 發送。觀察主機B是否收到。
- 如果主機B這次收到了:
- 結論: Port Restricted Cone NAT。路由器要求外部數據包的源IP和源端口必須與內部主機之前主動聯系過的那個目標完全一致,才允許入站。
- (Restricted Cone NAT 比較少見,它要求源IP一致即可,不要求源端口一致。你可以嘗試從主機A的一個新端口向 PortX 發包來測試,但如果上一步沒通,而用端口20000就通了,那基本就是Port Restricted)。
注意事項
整個實驗過程最好在無網絡的情況下完成,否則會嚴重影響實驗結果的準確性,甚至導致實驗完全失敗。
- 實驗核心是創建一個受控的、隔離的迷你網絡環境,用來觀察路由器的NAT行為。
- 如果保持外網連接,會引入大量不可控的變量,如:
- 路由混淆和網絡環路
- 防火墻和安全策略干擾
最簡單可靠的方法就是直接拔掉連接網口的那根網線。這是最干凈、最徹底的隔離方法。
次優方案可以禁用網絡適配器。