Dies ist nur möglich, wenn die beiden DHCP-Clients unterschiedliche MAC-Adressen verwenden. Das heißt, sie können nicht beide auf derselben physischen Netzwerkschnittstelle mit einer einzigen MAC-Adresse ausführen.
Die Lösung sind die virtuellen MAC-VLAN-Netzwerkschnittstellen von Linux. MAC-VLAN-Schnittstellen sind virtuelle Netzwerkschnittstellen, die von einer physischen Schnittstelle unterstützt werden, jedoch eine andere MAC-Adresse verwenden, die beim Erstellen eines MAC-VLAN-Geräts zufällig generiert wird.
Wenn Sie eine MAC-VLAN-Schnittstelle mit einer physischen Schnittstelle erstellt haben, verwenden Sie diese auf dieselbe Weise wie die physische. In Ihrem speziellen Fall können Sie einen DHCP-Client auf der physischen Schnittstelle und einen anderen auf dem MAC-VLAN-Gerät ausführen. Jedes Gerät (physisches und MAC-VLAN) kann dann eine eigene IP-Adresse haben.
Ein neues MAC-VLAN-Gerät macvlan0
kann eth0
durch Ausführen von erstellt werden
ip link add dev macvlan0 link eth0 type macvlan
Es kann durch Ausführen gelöscht werden
ip link delete dev macvlan0
Unter Verwendung von NCD, meiner Netzwerkkonfigurationssoftware ( http://code.google.com/p/badvpn/wiki/NCD ), erstellt das folgende NCD-Programm zwei MAC-VLAN-Geräte von eth0
( macvlan0
und macvlan1
), auf denen jeweils DHCP ausgeführt wird. und weisen ihnen die erhaltenen IP-Adressen zu. Sie erledigen problemlos andere Aufgaben wie das Hinzufügen von Routen und DNS-Servern. Lesen Sie die NCD-Seite, wenn Sie interessiert sind.
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);
}
Am Ende haben Sie macvlan0
und macvlan1
jede eine eigene DHCP-bezogene IP-Adresse, eth0
die zwar aktiv ist, aber keine IP-Adresse hat. Alternativ können Sie nur eine MAC-VLAN-Schnittstelle erstellen und eine DHCP-Instanz auf sich eth0
selbst ausführen .