2013-08-22 72 views
5

Tôi có một thiết bị Linux (thực ra là BeagleBoard cho nguyên mẫu) với hai bộ điều hợp Ethernet. Những gì tôi muốn là:Nhiều giao diện Ethernet - Cách tạo mạng riêng và truy cập từ mã C

  • Giao diện ethernet chính (eth0) kết nối với mạng của khách hàng (có thể là DHCP hoặc được gán IP tĩnh).

  • Giao diện ethernet thứ hai (eth1) kết nối trực tiếp với một bo mạch Linux khác.

  • chương trình C tài cấp trên Beagle có thể lắng nghe kết nối từ mạng của khách hàng (trên eth0), đáp ứng theo yêu cầu, và có thể kết nối với các thiết bị khác trên eth1

  • Chúng tôi muốn các thiết bị thứ hai được ẩn hoàn toàn khỏi phần còn lại của mạng, để chỉ các chương trình trên Beagle mới có thể kết nối với mạng đó.

Tôi hy vọng rằng hai giao diện có thể hoàn toàn tách biệt và mã của tôi có thể chọn giao diện muốn nghe/mở kết nối. Mã điển hình:

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)); 
... 

Chúng tôi có thể đặt địa chỉ và cổng để kết nối, chứ không phải giao diện ethernet. Tôi đã tìm thấy this answer. Điều này có nghĩa rằng những gì tôi đang cố gắng để đạt được PHẢI được để lại định tuyến hạt nhân?

Tôi biết tôi có thể thiết lập eth1 trên mạng con riêng của mình, nhưng tôi có vấn đề với điều này: Do chúng tôi không biết gì về mạng của khách hàng, làm cách nào để biết rằng bất kỳ mạng con nào tôi sử dụng đều thắng ' t sẽ kết thúc xung đột với mạng của khách hàng? Ví dụ, tôi sử dụng 192.168.1.0 ở đây, vì vậy tôi có thể đặt eth1 trên 192.168.0.0 ... nhưng nếu khách hàng sử dụng phạm vi đó thì sao? Chúng ta không muốn cấu hình lại các thiết lập cho eth1 và thiết bị gắn kèm của nó cho mọi triển khai, mặc dù chúng ta có thể phải cấu hình eth0.

Vì vậy, có cách nào tốt hơn để thực hiện việc này? Hoặc có lẽ một dải địa chỉ IP dành riêng mà tôi có thể sử dụng cho mạng con trên eth1 được đảm bảo không xung đột với mạng của khách hàng (ví dụ: 169.254.1.x)?

Xin lỗi, đây là một chút mơ hồ, nhưng tôi đã được Googling điều này trong nhiều ngày và có thể trở nên bối rối hơn là ít hơn.

EDIT - 2013/08/29:

Tôi vừa tìm thấy this question cung cấp một câu trả lời phần: Bạn có thể sử dụng setsockopt (...) với SO_BINDTODEVICE để ràng buộc vào một cụ thể thiết bị/giao diện. Điều này dường như hoạt động, mặc dù tôi vẫn không thể tìm ra cách thiết lập bảng định tuyến để hoạt động đáng tin cậy trong tình huống mạng "nội bộ" có cùng dải địa chỉ IP như mạng "bên ngoài" được kết nối với eth0.

+0

Mạng của Khách hàng có khả năng đứng sau bộ định tuyến, sử dụng NAT và sử dụng máy chủ DHCP cung cấp địa chỉ IPv4 riêng (ví dụ: 10.x.x.x hoặc 172.16.x.x hoặc 192.168.x.x) không?Sau đó, có thể bạn có thể sử dụng địa chỉ IPv4 không riêng tư (tức là công khai) trên mạng con ad-hoc (eth1, kết nối trực tiếp) của bạn? Hãy coi chừng vấn đề ** [ARP flux] (http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html) ** khi một hệ thống Linux có nhiều hơn một giao diện Ethernet (địa chỉ IP thuộc về máy chủ Linux, không phải là giao diện). – sawdust

+0

Đó là một khả năng ... Tôi chắc chắn 99% khách hàng sẽ ở trên một mạng riêng, nhưng không hoàn toàn chắc chắn! Và có, tôi đã gặp phải vấn đề thông lượng ARP và thiết lập thiết lập arp_ignore của tôi. – Jeremy

+1

Một giải pháp vững chắc là tắt * eth1 * cho đến khi * eth0 * lấy địa chỉ IP của nó từ máy chủ DHCP của máy khách. Sau đó chọn một trong các dải địa chỉ IP riêng (còn lại) và gán * eth1 * một địa chỉ IP tĩnh trong một mạng con không sử dụng. Bật * eth1 * và cũng khởi động máy chủ DHCP cho mạng con đặc biệt của bạn. Máy chủ lưu trữ khác trên mạng ad hoc sau đó có thể lấy địa chỉ IP động của nó. Tất cả mọi người bây giờ có một địa chỉ IP duy nhất và có hai mạng con cho hội đồng quản trị của bạn để dễ dàng đối phó với. – sawdust

Trả lời

1

Tôi đã có yêu cầu tương tự cho một dự án và chúng tôi đã sử dụng LXC, nơi chúng tôi có thể gán giao diện vật lý cho vùng chứa và do đó chúng tôi có thể có các vùng chứa cùng địa chỉ IP.

Khám phá tại http://lxc.sourceforge.net/.

+0

Cảm ơn bạn đã đề xuất! Một chút quá phức tạp cho những gì tôi cần, mặc dù. Tôi nghĩ rằng tôi đã có nó làm việc với SO_BINDTODEVICE thiết lập (xem ở trên). – Jeremy

Các vấn đề liên quan