2010-01-17 6 views
21

Je teste une implémentation d'un protocole qui parle entre deux ordinateurs en utilisant ethernet (pas IP). Afin de ne pas avoir réellement deux ordinateurs physiques, je veux créer deux interfaces Ethernet virtuelles. Ceux-ci ne pourraient que se parler, donc un programme d'extrémité se lierait à une interface et l'autre extrémité se lierait à l'autre.Comment créer des périphériques Ethernet virtuels sous Linux?

Est-ce possible et comment puis-je le faire?

Répondre

21

Vous pouvez utiliser VDE2, un commutateur virtuel.

Par exemple (vous aurez besoin de quelques termes):

# Install vde2 (assumes Debian/Ubuntu) 
sudo aptitude install vde2 
# Create the switch and two tap interfaces attached to it 
sudo vde_switch -tap tap0 -tap tap1 
# Configure the interfaces 
sudo ip addr add 10.0.31.10 dev tap0 
sudo ip addr add 10.0.31.11 dev tap1 
# Start a server 
socat - TCP-LISTEN:4234,bind=10.0.31.10 
# Alternatively, an echo server: 
#socat PIPE TCP-LISTEN:4234,bind=10.0.31.10 
# Start a client 
socat - TCP:10.0.31.10:4234,bind=10.0.31.11 

type d'un côté, il apparaîtra sur l'autre.

+0

Ceci est simple et efficace pour ce dont j'ai besoin, merci –

+6

Cet exemple ne fonctionne pas: Tout le trafic passe par l'interface 'lo' comme on peut le voir en utilisant 'tcpdump'.Vous pouvez également remarquer que les deux interfaces de prise sont toujours en panne. Après les avoir mis en place, tcpdump fonctionne sur les interfaces tap mais ne montre aucun trafic sur eux. Le noyau Linux utilise sa table de routage locale (voir 'ip route show table local') pour découvrir que ces adresses IP sont locales et acheminent les paquets localement, sans utiliser 'vde_switch'. Ayant dit tout cela, je n'ai pas encore trouvé un moyen de faire une connexion Socat _through_ vde_switch et tap interfaces. –

6

Vous pouvez utiliser le pilote Ethernet virtuel "tap" qui permet à un programme d'espace utilisateur d'être une interface Ethernet. C'est une fonctionnalité standard du noyau depuis un certain temps (elle n'est peut-être pas activée dans votre noyau).

+0

Le module est appelé tun. Mais oui, sinon, cette réponse est bonne. Faites juste un insmod tun, sinon compilez le noyau avec le support pour cela. – Anders

+2

Le module est appelé tun, il fournit également le périphérique "tap". Voir Documentation/networking/tuntap.txt du noyau pour l'interface complète de l'espace utilisateur; les interfaces virtuelles sont créées en utilisant un ioctl sur un périphérique de caractères/dev/net/tun – MarkR

+0

tun0 est un périphérique point à point virtuel, tap0 est un ethernet virtuel. Ce dernier peut être utilisé avec n'importe quel protocole, pas seulement IP – MarkR

2

Vous pouvez utiliser ns3 pour émuler un réseau complexe entre deux dispositifs de prise si vous en avez besoin: http://www.nsnam.org/

Je l'ai eu émulant deux commutateurs, un client sans fil, et un point d'accès, entre deux instances de VirtualBox.

2

interfaces homme homme ifconfig

juste ajouter une nouvelle strophe dans/etc/network/interfaces

mon exemple configuration:

iface eth0 inet static 
    address 192.168.2.150 
    netmask 255.255.255.0 
    network 192.168.2.0 
    broadcast 192.168.2.255 
    gateway 192.168.2.253 
    # dns-* options are implemented by the resolvconf package, if installed 
    dns-nameservers 8.8.4.4 


iface eth0:1 inet static 
    address 192.168.2.2 
    netmask 255.255.255.0 
    network 192.168.2.0 
    broadcast 192.168.2.255 
    gateway 192.168.2.253 
    # dns-* options are implemented by the resolvconf package, if installed 
    dns-nameservers 8.8.4.4 

-

eth0 a ip 192.168 .2.150 tandis que eth0: 1 a 192.168.2.2

+7

Cela ne crée pas un nouveau périphérique virtuel, il configure uniquement une adresse IP supplémentaire sur un périphérique physique. – Flow

+0

@Flow quelle est la différence? Juste curieux? Je veux dire en termes de conséquences, pas de mise en œuvre. – CMCDragonkai

+1

Il y a beaucoup de conséquences. Par exemple, si vous ajoutez une seconde adresse IP à une interface physique connectée, le système sera accessible via cette adresse IP sur cette interface physique depuis l'externe. – Flow

0

Vous pouvez utiliser la commande vconfig exemple:

vconfig add eth0 10 #virtual interface eth0.10 will be created 
1

si vous voulez que votre propre sous-réseau et ne voulez pas la peine d'utiliser vde.

Regardez this. En bref:

# tunctl -t eth0 
Set 'eth0' persistent and owned by uid 0 
# ifconfig eth0 
eth0  Link encap:Ethernet HWaddr a6:9b:fe:d8:d9:5e 
     BROADCAST MULTICAST MTU:1500 Metric:1 
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
     collisions:0 txqueuelen:500 
     RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

Ou avec ip:

# ip tuntap add dev eth0 mode tap 
# ip link ls dev eth0 
    7: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500 
    link/ether 0e:55:9b:6f:57:6c brd ff:ff:ff:ff:ff:ff 
0

Peut-être que je manque quelque chose d'important .. mais est-ce pas exactement ce que l'interface loopback (lo) est pour?

Questions connexes