2012-12-12 66 views
0

環境綁定的套接字,以特定的接口定位的遠程主機

想象三機器在兩個不同的局域網:

Machine1 (1 NIC) : NIC_IP=10.1.1.1 
Machine2 (2 NIC) : NIC(1)_IP = 10.3.3.3 ; NIC(2)_IP= 10.1.1.1 
Machine3 (1 NIC) : NIC_IP=10.3.3.3 

局域網這種方式配置:

LAN(1) = Machine1.NIC, Machine2.NIC1 
LAN(2) = Machine3.NIC, Machine2.NIC2 

因此只有Machine2是兩個局域網的成員。


問題

現在我們要建立從Machine2.Nic2到Machine3.NIC一個連接。這是從machine2上的10.1.1.1到machine3上的10.3.3.3的連接。

如何告訴Machine2的TCP/IP堆棧在局域網(2)上找到目的地址,而不是在本地主機上? (顯然,如果Machine3發起連接,期望的端點將參與連接[但機2是在我們的情況下,引發劑])


使用場景(該一個I WANT)

[Machine3=] ______LAN 2 _____ [=Machine2=]_______LAN 1________ [=Machine1] 
    |                | 
    |_ _ _ _ _ _ _ _ _ _ _ _ virtually connected_ _ _ _ _ _ _ _ _ _| 

考慮Machine2以某種方式爲LAN1(1)和LAN(2)之間提供一種用於Machine1和Machine3通信的「橋接服務」。通過這種方式,machine1嘗試連接到machine3(思考它們在同一個LAN中),但是在這裏machinein2在machine1中可見的machine3所需的machine3的期望IP。在這個過程中,Machine2可以將數據從machine1傳遞給machine3(因此可以選擇手動橋接)。


思考更多...(解決方法)

[Machine3=] __LAN 2 __ [=Machine2A=]__LAN3__ [=Machine2B=]___LAN 1___ [=Machine1] 
    |                  | 
    |_ _ _ _ _ _ _ _ _ _ _ _ virtually connected_ _ _ _ _ _ _ _ _ _ _ _ _ _| 

Machine2B (2 NIC) : NIC(1)_IP = 10.3.3.3 ; NIC(2)_IP= 10.x.y.z 
Machine2A (2 NIC) : NIC(1)_IP = 10.w.s.t ; NIC(2)_IP= 10.1.1.1 

我看到,它可以通過增加另一臺機器,另一個LAN的方案來達到同樣的後[然而,它是目前只是一種變通方法(至少不是問題的答案現在)]


PS:有a question somehow in the same field其不同之處在於,他們正在編寫一個數據包嗅探器和probabl沒有建立連接(只是讀取/注入數據包等),並且它們沒有爲其接口分配IP地址,因此它們在localhost和LAN中沒有兩個不同的目的地。

+1

除非路由已啓用,則將無法使用Machine2.NIC2連接到Machine3,因爲它位於不同的子網中。是否有一個你不想使用NIC1的理由? –

+0

機器2與機器1和機器3共享相同的IP地址。我不認爲這是您想要的配置。我假設你希望機器2的IP地址爲10.3.3.4和10.1.1.2。 – selbie

+0

@selbie:感謝您的評論。我在問題文本中添加了「使用場景」部分以更好地描述我的意圖。 –

回答

1

最根本的問題是,您的機器2與LAN1和LAN2上的其他機器具有相同的IP地址。這是行不通的。您不能在具有相同IP地址的同一子網上有兩臺主機。否則,所有主機都會感到困惑。

我不知道這是你真正想要的還是隻是你的描述中的疏忽。現在

如果下面是你的配置

LAN1: Network: 10.1.1.0 (8-bit subnet) 
LAN2: Network: 10.3.3.0 (8-bit subnet) 

Machine1: 10.1.1.1 on LAN1 
Machine2: 10.1.1.2 on LAN1 and 10.3.3.4 on LAN2 
Machine3: 10.3.3.3 on LAN2 

有了這個配置,你真的沒有做什麼特別的東西與你的插座聽代碼通過正確的網卡連接。對於出站客戶端連接,路由表將做正確的事情並選擇適當的接口來連接。無論何時創建套接字,您都可以指定要綁定的特定端口,但不要指定IP以外的其他任何內容(INADDR_ANY)。如果你的路由表配置好了,一切都會「正常工作」。

int localport = /* 0 for clients, a specific port for server sockets */ 
socket.Bind(new IPEndpoint(0,localport)); 
+0

但是我認爲在兩個不同的物理局域網上有兩個相同的IP是可以的。 –

+0

噢,我明白了,您將IP在兩個NIC之間翻轉。它是一個24位的子網。這可能會起作用,但我認爲將Machine2配置爲路由器併爲所有三臺機器配置路由規則會更好。 – selbie

+0

但路由器通常是三層(IP層)。我想編程,可以說,一個「TCP路由器」 –

0

我最後寫了這個批處理腳本。 這會將靜態MAC地址添加到arp表並添加路由表條目。爲了在路由條目中正確設置默認網關,我必須在其他類中引入兩個新的任意IP地址。 而且我未選中「自動度量」上機2的網卡,並將其設置爲30。

NIC的ID是「ROUTE PRINT」中顯示的一個

SET ID_Nic1=0x3 
SET ID_Nic2=0x10005 

SET IF_Left=%ID_Nic1% 
SET IF_Right=%ID_Nic2% 

SET IP_Left=10.1.1.1 
SET IP_Right=10.3.3.3 

SET AUX_Left=172.16.1.1 
SET AUX_Right=172.16.3.3 

SET MAC_Left=00-11-22-33-44-55 
SET MAC_Right=66-77-88-99-11-22 


REM Delete all ARP entries 
arp -d * 


arp -s %IP_Left% %MAC_Left% %AUX_Left% 
arp -s %IP_Right% %MAC_Right% %AUX_Right% 


ROUTE ADD %IP_Left% MASK 255.255.255.255 %AUX_Left% METRIC 1 IF %IF_Left% 
ROUTE ADD %IP_Right% MASK 255.255.255.255 %AUX_Right% METRIC 1 IF %IF_Right% 
相關問題