我有一个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) );
...
我们可以设置要连接的地址和端口,但不能设置以太网接口。我找到了this answer。这是否意味着我想要实现的内容必须留给内核路由?
我知道我可以将eth1设置为自己的子网,但我有一个问题:鉴于我们对客户端的网络一无所知,我怎么知道我使用的子网不会最终与客户的网络冲突?例如,我在这里使用192.168.1.0,所以我可以将eth1放在192.168.0.0上...但是如果客户端使用该范围怎么办?我们不希望为每个部署重新配置eth1及其连接设备的设置,尽管我们可能必须配置eth0。
那么有更好的方法吗?或者也许是我可以用于eth1子网的保留IP地址范围,保证不会与客户端的网络冲突(例如169.254.1.x)?
对不起,这有点模糊,但我已经谷歌搜索了好几天,可能会变得更加困惑而不是更少。
编辑 - 2013-08-29:
我刚刚发现this question提供了部分答案:您可以使用 setsockopt(...)与 SO_BINDTODEVICE 绑定到特定设备/ interface。这似乎有效,尽管在“内部”网络恰好与连接到eth0的“外部”网络具有相同的IP地址范围的情况下,我仍然无法弄清楚如何设置路由表以便可靠地工作。
答案 0 :(得分:1)
我对项目有同样的要求,我们最终使用LXC,我们可以在其中为容器分配物理接口,因此我们可以使用具有相同IP地址子网的容器。