Isso só é possível se os dois clientes DHCP usarem endereços MAC diferentes. O que significa que eles não podem rodar tanto na mesma interface de rede física, que tem um único endereço MAC.
A solução é as interfaces de rede MAC-VLAN virtuais do Linux. As interfaces MAC-VLAN são interfaces de rede virtuais respaldadas por uma interface física, mas usando um endereço MAC diferente, que é gerado aleatoriamente quando você cria um dispositivo MAC-VLAN.
Depois de criar uma interface MAC-VLAN usando uma interface física, você a usa da mesma maneira que faria com a física. No seu caso particular, você pode executar um cliente DHCP na interface física e outro no dispositivo MAC-VLAN. Cada dispositivo (físico e MAC-VLAN) pode ter seu próprio endereço IP.
Um novo dispositivo MAC-VLAN macvlan0
pode ser criado a partir de eth0
executando
ip link add dev macvlan0 link eth0 type macvlan
Ele pode ser excluído pela execução
ip link delete dev macvlan0
Usando o NCD, meu software de configuração de rede ( link ), o seguinte programa de NCD criará dois MAC - Dispositivos de VLAN de eth0
( macvlan0
e macvlan1
), executam o DHCP em cada um deles e atribuem a eles os endereços IP obtidos. Você facilmente faz outras coisas, como adicionar rotas e servidores DNS; leia a página do NCD se estiver interessado.
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);
}
Você terá macvlan0
e macvlan1
cada um com seu próprio endereço IP obtido por DHCP e eth0
, que está ativo, mas não possui um endereço IP. Alternativamente, você pode criar apenas uma interface MAC-VLAN e executar uma instância DHCP no próprio eth0
.