Cela n'est possible que si les deux clients DHCP utilisent des adresses MAC différentes. Cela signifie qu'ils ne peuvent pas fonctionner tous les deux sur la même interface réseau physique, qui a une seule adresse MAC.
La solution réside dans les interfaces réseau MAC-VLAN virtuelles de Linux. Les interfaces MAC-VLAN sont des interfaces réseau virtuelles soutenues par une interface physique, mais utilisant une adresse MAC différente, qui est générée de manière aléatoire lorsque vous créez un périphérique MAC-VLAN.
Une fois que vous avez créé une interface MAC-VLAN à l'aide d'une interface physique, vous l'utilisez de la même manière que l'interface physique. Dans votre cas particulier, vous pouvez exécuter un client DHCP sur l'interface physique et un autre sur le périphérique MAC-VLAN. Chaque périphérique (physique et MAC-VLAN) peut alors avoir sa propre adresse IP.
Un nouveau dispositif MAC-VLAN macvlan0
peut être créé à partir de eth0
en courant
ip link add dev macvlan0 link eth0 type macvlan
Il peut être supprimé en exécutant
ip link delete dev macvlan0
En utilisant NCD, mon logiciel de configuration de réseau ( http://code.google.com/p/badvpn/wiki/NCD ), le programme NCD suivant créera deux dispositifs MAC-VLAN à partir de eth0
( macvlan0
y macvlan1
), lancez le DHCP sur chacun d'entre eux et attribuez-leur les adresses IP obtenues. Vous pouvez facilement faire d'autres choses comme ajouter des routes et des serveurs DNS ; lisez la page de la NCD si cela vous intéresse.
process lan {
# Set device.
var("eth0") dev;
# Wait for device to appear, set it up, and wait for cable to be plugged in.
net.backend.waitdevice(dev);
net.up(dev);
net.backend.waitlink(dev);
# Start DHCP's.
provide("lan-link");
}
process lan_dhcp1 {
# Wait for link.
depend("lan-link") linkdep;
# Choose virtual device name.
var("macvlan0") vdev;
# Create virtual MAC-VLAN device.
list("/sbin/ip", "link", "add", "dev", vdev, "link", linkdep.dev, "type", "macvlan") do;
list("/sbin/ip", "link", "delete", "dev", vdev) undo;
run(do, undo);
# Set virtual device up.
net.up(vdev);
# DHCP configuration on virtual device.
net.ipv4.dhcp(vdev) dhcp;
ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
ifnot(test_local);
println(vdev, ": got address ", dhcp.addr);
# Assign address to virtual device.
net.ipv4.addr(vdev, dhcp.addr, dhcp.prefix);
}
# This differs from above only in interface name (macvlan1).
process lan_dhcp2 {
# Wait for link.
depend("lan-link") linkdep;
# Choose virtual device name.
var("macvlan1") vdev;
# Create virtual MAC-VLAN device.
list("/sbin/ip", "link", "add", "dev", vdev, "link", linkdep.dev, "type", "macvlan") do;
list("/sbin/ip", "link", "delete", "dev", vdev) undo;
run(do, undo);
# Set virtual device up.
net.up(vdev);
# DHCP configuration on virtual device.
net.ipv4.dhcp(vdev) dhcp;
ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
ifnot(test_local);
println(vdev, ": got address ", dhcp.addr);
# Assign address to virtual device.
net.ipv4.addr(vdev, dhcp.addr, dhcp.prefix);
}
Vous obtiendrez macvlan0
y macvlan1
chacun avec sa propre adresse IP obtenue par DHCP, et eth0
qui est en service mais n'a pas d'adresse IP. Vous pouvez également créer une seule interface MAC-VLAN et exécuter une instance DHCP sur l'interface MAC-VLAN. eth0
même.