0

环境

想象两个不同 LAN 中的三台机器:

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 的连接。这是从 machine2 上的 10.1.1.1 到 machine3 上的 10.3.3.3 的连接。

我们如何告诉 Machine2 的 TCP/IP 堆栈在 LAN(2) 上而不是在 localhost 上找到目标地址!?(显然,如果 Machine3 发起连接,所需的端点将参与连接 [但 machine2 在我们的例子中是发起者])


使用场景(我想要的那个)

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

将 Machine2 视为以某种方式在 LAN(1) 和 LAN(2) 之间为 Machine1 和 Machine3 的通信提供一种“桥接服务”。这样,machine1 尝试连接到 machine3(认为它们好像在同一个 LAN 中),但是中间的 machin2 出现了 machine3 的所需 IP 对 machine1 可见。在这个过程中,机器 2 可以将机器 1 的数据传递给机器 3(因此是一种选择性手动桥接的东西)。


在思考更多之后......(一种解决方法)

[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:在同一领域有一个问题,不同之处在于他们正在编写数据包嗅探器并且可能没有建立连接(只是读取/注入数据包等)并且他们没有为他们的接口分配 IP 地址,因此他们没有t 有两个不同的目的地,一个在其本地主机中,另一个在 LAN 中。

4

2 回答 2

1

The fundamental problem is that you have machine2 on identical IP addresses as other machines on LAN1 and LAN2. That's not going to work. You can't have two hosts on the same subnet with the same IP address. Otherwise, all the hosts will get confused.

I don't know if that's really what you intended or was just an oversight in your description.

Now if the following was your configuration

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

With this configuration, you really don't have to do anything special with your socket listening code to connect through the right NIC. For outbound client connections, the routing table will do the right thing and choose the appropriate interface to connect through. Anytime you create a socket, you can specify a specific port to bind to, but don't specify anything other than 0 (INADDR_ANY) for the IP to bind to. Everything will "just work" if your routing table is configured.

int localport = /* 0 for clients, a specific port for server sockets */
socket.Bind(new IPEndpoint(0,localport));
于 2012-12-12T09:22:53.640 回答
0

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

网卡的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%
于 2012-12-16T12:23:53.133 回答