5

我有一个带有两个以太网适配器的 Linux 设备(实际上是一个用于原型的 BeagleBoard)。我想要的是这样的:

  • 主以太网接口 (eth0) 连接到客户端的网络(可能是 DHCP 或分配的静态 IP)。

  • 第二个以太网接口 (eth1) 直接连接到另一个 Linux 板。

  • Beagle 上的用户级 C 程序可以侦听来自客户端网络(在 eth0 上)的传入连接,根据需要进行响应,并可能连接到 eth1 上的其他设备

  • 我们希望第二个设备对网络的其余部分完全隐藏,以便只有 Beagle 上的程序可以连接到它。

我希望这两个接口可以完全分开,我的代码可以选择它想要监听/打开连接的接口。典型代码:

socket_desc = socket(AF_INET, SOCK_STREAM, 0);

memset(&client_addr, 0, sizeof(client_addr)); 
client_addr.sin_family = AF_INET;
inet_pton(  AF_INET, address, (void *)(&(client_addr.sin_addr.s_addr))  );
client_addr.sin_port = htons(port);   

/* Connect to remote on TCP port: */
connect(*socket_desc, (struct sockaddr*) &client_addr, sizeof(client_addr) );
...

我们可以设置要连接的地址和端口,但不能设置以太网接口。我找到了这个答案。这是否意味着我要实现的目标必须留给内核路由?

我知道我可以将 eth1 设置在它自己的子网上,但我有一个问题:鉴于我们对客户端的网络一无所知,我怎么知道我使用的任何子网最终都不会发生冲突与客户的网络?例如,我在这里使用 192.168.1.0,所以我可以将 eth1 放在 192.168.0.0... 但是如果客户端使用该范围怎么办?我们不想为每次部署重新配置 eth1 及其连接设备的设置,尽管我们可能必须配置 eth0。

那么有没有更好的方法来做到这一点?或者我可以为 eth1 上的子网使用保留的 IP 地址范围,保证不会与客户端的网络冲突(例如 169.254.1.x)?

抱歉,这有点含糊,但我已经在谷歌上搜索了几天,可能变得更加困惑而不是更少。

编辑 - 2013-08-29:

我刚刚发现这个问题提供了部分答案:您可以使用setsockopt(...)SO_BINDTODEVICE绑定到特定设备/接口。这似乎可行,尽管我仍然无法弄清楚如何设置路由表以在“内部”网络恰好与连接到 eth0 的“外部”网络具有相同 IP 地址范围的情况下可靠地工作。

4

1 回答 1

1

我对一个项目有同样的要求,我们最终使用了 LXC,我们可以为容器分配一个物理接口,因此我们可以拥有具有相同 IP 地址子网的容器。

在http://lxc.sourceforge.net/上查看。

于 2013-09-06T20:42:20.390 回答