Это возможно, только если два DHCP-клиента используют разные MAC-адреса. Это означает, что они не могут работать как на одном физическом сетевом интерфейсе, который имеет один MAC-адрес.
Решение - это виртуальные сетевые интерфейсы MAC-VLAN в Linux. Интерфейсы MAC-VLAN - это виртуальные сетевые интерфейсы, поддерживаемые физическим интерфейсом, но использующие другой MAC-адрес, который генерируется случайным образом при создании устройства MAC-VLAN.
После создания интерфейса MAC-VLAN с использованием физического интерфейса вы используете его так же, как и физический. В вашем конкретном случае вы можете запустить один DHCP-клиент на физическом интерфейсе, а другой - на устройстве MAC-VLAN. Каждое устройство (физическое и MAC-VLAN) может иметь собственный IP-адрес.
Новое устройство MAC-VLAN macvlan0
можно создать из eth0
, запустив
ip link add dev macvlan0 link eth0 type macvlan
Его можно удалить, запустив
ip link delete dev macvlan0
Используя NCD, мое программное обеспечение для настройки сети ( http://code.google.com/p/badvpn/wiki/NCD ), следующая программа NCD создаст два устройства MAC-VLAN из eth0
( macvlan0
и macvlan1
), на каждом из которых будет работать DHCP из них, и назначьте им полученные IP-адреса. Вы легко делаете другие вещи, такие как добавление маршрутов и DNS-серверов; прочитайте страницу NCD, если вам интересно.
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);
}
Вы получите macvlan0
и macvlan1
каждый из которых имеет собственный IP-адрес, полученный DHCP, и eth0
который работает, но не имеет IP-адреса. Кроме того, вы можете создать только один интерфейс MAC-VLAN и запустить один экземпляр DHCP на самом eth0
.