Hi, What is most likely happening here is that Kea is having trouble selecting the subnet in the case of the multiple interfaces. Suggest you set "severity": "DEBUG", "debuglevel": 99 in your loggers for kea-dhcp4 You will likely have to add an "interface": to the subnet as a hint for selecting the subnet as explained here: https://kea.readthedocs.io/en/latest/arm/dhcp4-srv.html#local-and-relayed-traffic-in-shared-networks It could be something else, but with the information available here, that is my guess.
Thank you, Darren Ankney On Sun, Apr 13, 2025 at 9:29 PM Chuck Zmudzinski via Kea-users <kea-users@lists.isc.org> wrote: > > Hi, > > I am trying to migrate my dhcp4 setup from the old ISC dhcp server to kea. I > am > running the dhcp4 server on a Xen virtual machine host to configure the > network > interfaces on guest virtual machines. > > Typically, each guest has a virtual ethernet interface on the virtual machine > host connected to the network interface of the guest, and these interfaces are > named vifn.0, where n is an integer equal to the virtual machine ID of the > guest. > > So, if one guest is running whose ID is 1, the interface connected to the > guest > is vif1.0 and if two guests are running with ID of 1 and 2, then the interface > connected to guest 1 is vif1.0 and the interface connected to guest 2 is > vif2.0. > > Using the old ISC dhcp server, the list of vifn.0 interfaces is passed as an > argument to the command line, for example 'vif1.0' or 'vif1.0 vif2.0'. This > worked nicely, and all the guests were configured for IPv4 by the old ISC dhcp > server. > > Using kea's dhcp4 server, I was hoping to reproduce the behavior of the old > ISC > dhcp4 server by having > > "interfaces-config": { "interfaces": [ "vif1.0", "vif2.0" ] }, > > for the case with two guests and two interfaces to listen on, such as vif1.0 > and > vif2.0, and by having > > "interfaces-config": { "interfaces": [ "vif1.0" ] }, > > for the case when there is only one guest and only one interface to listen on, > such as vif1.0. > > The expected behavior is that each guest that is connected to an interface on > which the kea-dhcp4 server is listening will receive an IPv4 address and other > IPv4 configurations in accordance with the rest of the configuration file. > > The actual behavior is that the only case when any guest receives an IPv4 > configuration is when there is only one interface listed in the > interfaces-config specification. > > IOW, this works as expected: "interfaces-config": { "interfaces": [ "vif1.0" > ] }, > > That is, the guest connected to vif1.0 receives an IPv4 configuration. > > This does not work for either guest: > "interfaces-config": { "interfaces": [ "vif1.0", "vif2.0" ] > }, > > That is, neither the guest connected to vif1.0 nor the guest connected to > vif2.0 > receives an IPv4 configuration. > > So, is this a bug? What am I missing here for the case when the server is > supposedly configured to listen on more that one interface? > > Other useful information that might be relevant to this problem: > > 1. One odd thing Xen's toolstack does when configuring the vifn.0 interfaces > is > that it configures them all with the same hw mac address of fe:ff:ff:ff:ff:ff > and it also by default configures the IPv4 address of each vifn.0 interface > with > a static address equal to the host's primary IPv4 address. The old ISC dhcp4 > server handled this situation without problems. Is it possible the kea dhcp4 > server cannot deal with multiple interfaces with the same mac address? > Unfortunately, I have not been able to figure out how to change the mac > address > of the vifn.0 interfaces created by Xen so they are unique in the system; > it is always fe:ff:ff:ff:ff:ff for every interface. There is a comment in the > Xen repo that explains why they use this mac address: > > https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=tools/hotplug/Linux/xen-network-common.sh;h=42fa704e8d40f683ed3a7d3562b7c9685b7f804c;hb=3ad5d648cda5add395f49fc3704b2552aae734f7#l90 > > The comment says: > > > # Initialise a dummy MAC address. We choose the numerically > > # largest non-broadcast address to prevent the address getting > > # stolen by an Ethernet bridge for STP purposes. > > # (FE:FF:FF:FF:FF:FF) > > ip link set dev ${dev} address fe:ff:ff:ff:ff:ff || true > > I tried to edit this to change the mac address in this script for one of the > interfaces when I had two guests running but it did not work, probably because > this script is not setting the mac address in my case. I could not find what > is setting that mac address in my setup so I don't know how to change it. > > 2. For reference, following is a redacted version of the kea-dhcp4.conf file I > am using when I want it to listen on vif1.0 and vif2.0. The reservations, dns, > and router parts are working fine, the problem is the server does not > configure > any guests unless the server is configured to listen on only one interface, > and > in that case, it only configures the guest that is connected to the single > interface the server isconfigured to listen on. The old dhcp server could > listen > on multiple vifn.0 interfaces and configure multiple guests with IPv4 > configurations, but kea's dhcp4 server seems to only work with one interface > in > my setup. > > Configuration file kea-dhcp4.conf: > > // This is an example configuration file for the DHCPv4 server in Kea. > // It contains one subnet in which there are five static address reservations > // for the clients identified by the MAC addresses. > { "Dhcp4": > > { > // Kea is told to listen only on these interfaces. > "interfaces-config": { > "interfaces": [ "vif1.0", "vif2.0" ] > }, > > // Kea supports control channel, which is a way to receive management > // commands while the server is running. This is a Unix domain socket that > // receives commands formatted in JSON, e.g. config-set (which sets new > // configuration), config-reload (which tells Kea to reload its > // configuration from file), statistic-get (to retrieve statistics) and many > // more. For detailed description, see Sections 8.8, 16 and 15. > "control-socket": { > "socket-type": "unix", > "socket-name": "/tmp/kea4-ctrl-socket" > }, > > // We need to specify the database used to store leases. As of April > // 2022, three database backends are supported: MySQL, PostgreSQL, and the > // in-memory database, Memfile. We'll use memfile because it doesn't > // require any prior set up. > "lease-database": { > "type": "memfile", > "lfc-interval": 3600 > }, > > // Addresses will be assigned with a lifetime of 43200 seconds. > "valid-lifetime": 43200, > > // This is for dns configuration > "option-data": [ > { > "name": "domain-name-servers", > "data": "192.168.1.254" > }, > // Typically people prefer to refer to options by their names, so they > // don't need to remember the code names. However, some people like > // to use numerical values. For example, option "domain-name" uses > // option code 15, so you can reference to it either by > // "name": "domain-name" or "code": 15. > { > "code": 15, > "data": "example.org" > }, > > // Domain search is also a popular option. It tells the client to > // attempt to resolve names within those specified domains. For > // example, name "foo" would be attempted to be resolved as > // foo.mydomain.example.com and if it fails, then as foo.example.com > { > "name": "domain-search", > "data": "example.org" > } > ], > > // Reserve addresses by mac address > "host-reservation-identifiers": [ "hw-address" ], > > // Define a subnet with five reservations. > "subnet4": [ > { > "pools": [ { "pool": "192.168.1.17 - 192.168.1.31" } ], > "id": 1, > "subnet": "192.168.1.0/24", > > // Router > "option-data": [ > { > "name": "routers", > "data": "192.168.1.1" > } > ], > > // Specify whether the server should look up global reservations. > // Defaults to false. > "reservations-global": false, > > // Specify whether the server should look up in-subnet reservations. > // Defaults to true. > "reservations-in-subnet": true, > > // Specify whether the server can assume that all reserved addresses > // are out-of-pool. Defaults to false. > // Ignored when reservations-in-subnet is false. > // If specified, it is inherited by "shared-networks" and > // "subnet4" levels. > "reservations-out-of-pool": true, > > "reservations": [ > > // This are reservationis for a specific hardware/MAC address. It's a very > // simple reservation: just an address and nothing else. > { > "hw-address": "<redacted>", > "ip-address": "192.168.1.2" > }, > { > "hw-address": "<redacted>", > "ip-address": "192.168.1.8" > }, > { > "hw-address": "<redacted>", > "ip-address": "192.168.1.10" > }, > { > "hw-address": "<redacted>", > "ip-address": "192.168.1.7" > }, > { > "hw-address": "<redacted>", > "ip-address": "192.168.1.4" > } > ] > } > ], > > // The following configures logging. It assumes that messages with at > // least informational level (info, warn, error and fatal) should be > // logged to stdout. > "loggers": [ > { > "name": "kea-dhcp4", > "output-options": [ > { > "output": "stdout" > } > ], > "severity": "INFO" > } > ] > } > > } > > -- > ISC funds the development of this software with paid support subscriptions. > Contact us at https://www.isc.org/contact/ for more information. > > To unsubscribe visit https://lists.isc.org/mailman/listinfo/kea-users. > > Kea-users mailing list > Kea-users@lists.isc.org > https://lists.isc.org/mailman/listinfo/kea-users -- ISC funds the development of this software with paid support subscriptions. Contact us at https://www.isc.org/contact/ for more information. To unsubscribe visit https://lists.isc.org/mailman/listinfo/kea-users. Kea-users mailing list Kea-users@lists.isc.org https://lists.isc.org/mailman/listinfo/kea-users