2013-08-22 20 views
5

我有一个Linux设备(实际上是一个用于原型的BeagleBoard),带有两个以太网适配器。我想是这样的:多个以太网接口 - 如何创建一个单独的网络并从C代码访问

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

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

  • 上比格尔用户级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。

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

对不起,这有点含糊,但我一直在谷歌这几天,可能变得更困惑,而不是更少。

编辑 - 2013年8月29日:

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

+0

是客户端的网络可能是一个路由器后面,使用NAT,并用它的手了私有IPv4地址(例如10.x.x.x或172.16.x.x或192.168.x.x)DHCP服务器?那么也许你可以在ad-hoc(eth1,直接连接)子网上使用非私有(即公共)IPv4地址?当Linux系统有多个以太网接口时,请注意** [ARP通量问题](http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html)** (IP地址属于Linux主机,而不是接口)。 – sawdust

+0

这是一种可能性......我99%肯定客户将在私人网络上,但不完全确定!是的,我已经遇到了ARP通量问题并设置了我的arp_ignore设置。 – Jeremy

+1

一个可靠的解决方案是禁用* eth1 *,直到* eth0 *从客户端的DHCP服务器获取其IP地址。然后从(剩余的)专用IP地址范围中进行选择,并将* eth1 *静态IP地址分配给未使用的子网。打开* eth1 *并启动专用子网的DHCP服务器。然后,ad hoc网络上的另一个主机可以获得其动态IP地址。现在每个人都有一个独特的IP地址,并且您的主板有两个子网可以轻松应对。 – sawdust

回答

1

我有一个项目,同样的要求,我们结束了使用LXC,在那里我们可以一个物理接口分配到一个容器,所以我们可以有相同的IP地址子网容器,例如。

检查出http://lxc.sourceforge.net/

+0

感谢您的建议!虽然我需要一点太复杂的东西。我想我已经使用了SO_BINDTODEVICE设置(参见上文)。 – Jeremy

相关问题