2011-01-27 25 views
4

摘要:我試圖創建套接字以在同一臺機器上存在的兩個物理接口之間傳遞數據,並且Win32套接字始終直接轉發通信在內核中而不是通過物理接口。有什麼辦法可以通過設備設置,註冊表調整,路由表shenanigans或套接字選項來禁用此行爲?我們正在使用Windows XP SP3。Win32套接字 - 強制ip包在發送到其他本地接口時離開物理接口

一些背景。我正在嘗試構建一些完全自動化的IP測試來鍛鍊我們的定製IPv4設備。我們有一個Windows XP機器的大型實驗室,以及我們連接到的每個設備的單獨物理以太網接口。我們的設備是有效的以太網路由器,每個路由器都有自己的IP。

我們需要通過我們的設備將數據發送出我們的實驗室機器,然後返回到同一臺計算機。我們將通過設備發送單播和多播UDP,TCP和廣播IP流量。

我們想要(也可能需要)流量來自它所註定的同一臺機器。 爲此,我們配置了兩個單獨的NIC,每個NIC在其自己的子網上都有自己的IP,例如,具有10.0.0.1/24的NIC#1和具有10.0.1.1/24的NIC#2。我們的設備就像簡單的直通路由器一樣工作,並且有兩個接口,10.0.0.0/24子網上有一個接口,10.0.1.0/24子網上有一個接口,它們只是來回轉發數據包。爲了生成我們的數據,我們希望能夠使用Win32套接字,因爲它很好理解,支持良好,我們的客戶正在使用,並且可能是最快速的方法。數據包注入對於UDP和廣播IP來說可能是可行的,但很可能不適用於TCP。我喜歡使用數據包注入的想法,但強烈推薦使用標準的Win32套接字。

如摘要所述,數據包永遠不會離開機器。我像瘋子一樣搜索,但我沒有找到太多東西。有任何想法嗎?

回答

4

使用Windows的命令行ROUTE實用程序。您可以對其進行配置,以便將發送到特定子網上特定IP地址的任何IP數據包發送到其他IP /設備。例如:

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_2> METRIC 1 
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_1> METRIC 1 

或者,如果你知道網卡接口的索引號,你也可以指定它們:

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> METRIC 1 IF <NIC_2_INTF> 
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> METRIC 1 IF <NIC_1_INTF> 

這樣,每當一個數據包被髮送至NIC#1的IP,數據包會發送到連接到NIC#2的設備,然後NIC#將它傳遞給NIC#1。反之亦然,發送到NIC#2的IP。

例如,如果PC使用路由器連接到網絡,這是允許WireShark捕獲本地IP流量的有用技術。從一個本地IP /端口到另一個本地IP /端口的數據包可以從路由器反彈回PC,以便它們通過WireShark可以監控的物理接口(WireShark將看到每個本地數據包的重複副本 - 一個出站和一個入站 - 但你可以過濾出重複項)。

+0

這個功能在人們建議的所有選項中發揮最大作用,而且我在搜索時發現了這些選項。我仍然無法爲「廣播」流量製作這部作品;我需要花更多的時間來處理它,但我有一種感覺,我需要需要Win7附帶的IP_UNICAST_IF套接字選項(具有諷刺意味的是,使用「單播」選項進行廣播。) – antiduh 2011-02-07 08:43:35

0

Winsock總是會將分組數據放入內核空間並在那裏處理。這就是泛指API的全部意義在於任何設備都在同一個「層」處理。如果你想堅持使用Winsock,我不相信你可以(或者想要)解決這個問題。

您可以使用TransmitPacketsTransmitFile刪除一些緩衝區複製,但不能在兩個設備接口之間複製。

這就是說,你有一個性能問題與Winsock執行額外的緩衝區應對?安全問題?

+0

你在說什麼?不將`socket'綁定到一個感興趣的網卡的IP去工作? – 2014-09-05 08:01:29

0

如何在不同的虛擬機中運行測試儀的端點?然後你只需要一個硬件,但是你將會擁有單獨的TCP/IP堆棧,這些堆棧不知道彼此是否是本地的(並且大多數VM解決方案直接通過主機直接傳遞數據包,我不認爲主機將抓取數據包並將其直接發送到另一個虛擬機,除非您在虛擬機之間配置橋接......但您將每個虛擬機綁定到不同的物理網絡適配器)。