2013-08-22 21 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

相關問題