2013-08-22 21 views
5

Ho un dispositivo Linux (in realtà un BeagleBoard per il prototipo) con due adattatori Ethernet. Quello che voglio è questo:Interfacce Ethernet multiple - Come creare una rete separata e accesso dal codice C

  • interfaccia Ethernet primaria (eth0) si collega alla rete di un cliente (può essere DHCP o assegnato un IP statico).

  • La seconda interfaccia ethernet (eth1) si collega direttamente a un'altra scheda Linux.

  • programmi utente C sul Beagle possono ascoltare per le connessioni in entrata da rete del client (su eth0), rispondere come richiesto, ed eventualmente connettersi all'altro dispositivo su eth1

  • Vogliamo che il secondo dispositivo essere completamente nascosto dal resto della rete, in modo che solo i programmi sul Beagle possano connettersi ad esso.

Speravo che le due interfacce potessero essere completamente separate e il mio codice potesse scegliere su quale interfaccia si desiderava ascoltare/aprire le connessioni. Codice tipico:

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

Possiamo impostare l'indirizzo e la porta per la connessione, ma non l'interfaccia Ethernet. Ho trovato this answer. Questo significa che ciò che sto cercando di ottenere DEVE essere lasciato al routing del kernel?

So che posso impostare eth1 in modo che si trovi nella sua sottorete, ma ho un problema con questo: dato che non sappiamo nulla della rete del client, come faccio a sapere che qualunque subnet che utilizzo vince? t finire in conflitto con la rete del cliente? Ad esempio, io uso 192.168.1.0 qui, quindi potrei inserire eth1 su 192.168.0.0 ... ma cosa succede se il client usa quell'intervallo? Non vogliamo riconfigurare le impostazioni per eth1 e il dispositivo collegato per ogni distribuzione, anche se potremmo dover configurare eth0.

Quindi c'è un modo migliore per farlo? O forse un intervallo di indirizzi IP riservati che potrei usare per la sottorete su eth1, che è garantito non in conflitto con la rete del cliente (ad esempio 169.254.1.x)?

Mi spiace, questo è un po 'vago, ma sono stato a cercare su Google per giorni e probabilmente sono diventato più confuso piuttosto che meno.

EDIT - 2013/08/29:

ho appena trovato this question che fornisce una risposta parziale: è possibile utilizzare setsockopt (...) con SO_BINDTODEVICE di legarsi a una specifica dispositivo/interfaccia. Questo sembra funzionare, anche se non riesco ancora a capire come impostare le tabelle di routing per lavorare in modo affidabile nella situazione in cui la rete "interna" abbia lo stesso intervallo di indirizzi IP della rete "esterna" collegata a eth0.

+0

È probabile che la rete del client sia dietro un router, utilizzare NAT e utilizzare un server DHCP che distribuisce indirizzi IPv4 privati ​​(ad esempio 10.x.x.x o 172.16.x.x o 192.168.x.x)?Quindi potresti forse utilizzare indirizzi IPv4 non privati ​​(cioè pubblici) sulla subnet ad-hoc (la connessione eth1, diretta)? Attenzione al ** [problema di flusso ARP] (http://blog.cj2s.de/archives/29-Preventing-ARP-flux-on-Linux.html) ** quando un sistema Linux ha più di un'interfaccia Ethernet (l'indirizzo IP appartiene all'host Linux, non all'interfaccia). – sawdust

+0

Questa è una possibilità ... Sono sicuro al 99% che il cliente si trovi su una rete privata, ma non completamente sicuro! E sì, avevo già riscontrato il problema del flusso ARP e ho impostato le mie impostazioni arp_ignore. – Jeremy

+1

Una soluzione solida è disabilitare * eth1 * finché * eth0 * non ottiene il proprio indirizzo IP dal server DHCP del client. Quindi scegliere tra gli intervalli di indirizzi IP privati ​​(rimanenti) e assegnare * eth1 * un indirizzo IP statico in una sottorete non utilizzata. Attiva * eth1 * e avvia anche un server DHCP per la sottorete ad hoc. L'altro host sulla rete ad hoc può quindi ottenere il suo indirizzo IP dinamico. Tutti ora hanno un indirizzo IP univoco e ci sono due sottoreti per far fronte facilmente alla tua scheda. – sawdust

risposta

1

Avevo lo stesso requisito per un progetto e abbiamo finito con l'utilizzo di LXC, dove potevamo assegnare un'interfaccia fisica a un contenitore, e quindi potevamo avere contenitori con le stesse sottoreti di indirizzo IP, per esempio.

Verificare a http://lxc.sourceforge.net/.

+0

Grazie per il suggerimento! Un po 'troppo complesso per quello che mi serve, però. Penso di averlo funzionato con l'impostazione SO_BINDTODEVICE (vedi sopra). – Jeremy