将套接字绑定到指向远程主机的特定接口

时间:2012-12-12 07:34:27

标签: c# sockets tcp bind

环境

想象两个不同局域网中的三台机器:

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以这种方式配置:

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

因此,只有Machine2是两个LAN的成员。

<小时/> 问题

现在我们要建立一个从Machine2.Nic2到Machine3.NIC的连接。这是从机器2上的10.1.1.1到机器3上的10.3.3.3的连接。

我们怎样才能告诉Machine2的TCP / IP堆栈在LAN(2)上找到目标地址而不是在localhost上找到目的地址? (显然,如果Machine3启动连接,所需的端点将参与连接[但在我们的情况下,machine2是发起者])

<小时/> 使用场景(我想要的那个)

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

考虑Machine2以某种方式提供一种&#34;桥接服务&#34; LAN(1)和LAN(2)之间用于Machine1和Machine3的通信。通过这种方式,machine1尝试连接到machine3(就好像它们位于同一个局域网中一样),但是这里的machin2来自machine1可见的机器3的所需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

我看到可以通过向场景中添加另一台机器和另一台局域网来实现相同的目标[但目前只是一种解决方法(至少现在不是答案)]


PS:有a question somehow in the same field不同之处在于他们正在编写数据包嗅探器并且可能没有建立连接(只是读取/注入数据包等),并且他们没有为其接口分配IP地址,因此他们不会#39;在本地主机中有两个不同的目的地,在局域网中有另一个目的地。

2 个答案:

答案 0 :(得分:1)

根本问题在于,机器2的IP地址与LAN1和LAN2上的其他机器相同。那不行。您不能在同一子网上拥有两台具有相同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

使用此配置,您实际上无需对套接字侦听代码执行任何特殊操作即可通过正确的NIC进行连接。对于出站客户端连接,路由表将做正确的事情并选择适当的接口进行连接。无论何时创建套接字,都可以指定要绑定的特定端口,但不要为要绑定的IP指定0(INADDR_ANY)以外的任何端口。如果配置了路由表,一切都将“正常工作”。

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

答案 1 :(得分:0)

我最终编写了这个批处理脚本。 这将向arp表添加静态MAC地址并添加路由表条目。为了在路由条目中正确设置默认网关,我必须在其他类中引入两个新的任意IP地址。 此外,我取消选中MAchine2的NIC上的“自动指标”并将其设置为30。

NIC的ID是“route print”中显示的ID

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%