-
Notifications
You must be signed in to change notification settings - Fork 121
Description
Description
It seems that, when using the listen
directive in the server4
section of the config file, CoreDHCP does not respond to DISCOVER packets when an IP address is specified whereas it does respond when an interface is specified, even when that interface has only that one IP address.
Replicating
I've done some testing to eliminate variables (e.g. iptables), using dnsmasq as a control. For the below tests, a single dhserver
interface is created with IP address 172.16.0.254 as a veth pair with a single dhclient
interface with IP address 172.16.0.253 in a new ns0
network namespace. There are two tests: the first one testing binding the DHCP servers to an interface (dhserver
) and the second one binding to the IP address (172.16.0.254). Each test includes output from both dnsmasq and CoreDHCP. dhcpcd
is used to test the DHCP handshake.
Setup
CoreDHCP Setup
(Current working directory is CoreDHCP git repo root)
$ mkdir build/
$ coredhcp-generator -f cmds/coredhcp-generator/core-plugins.txt -t cmds/coredhcp-generator/coredhcp.go.template -o build/coredhcp.go
2024/12/03 20:36:32 Generating output file 'build/coredhcp.go' with 15 plugin(s):
2024/12/03 20:36:32 1) github.com/coredhcp/coredhcp/plugins/leasetime
2024/12/03 20:36:32 2) github.com/coredhcp/coredhcp/plugins/mtu
2024/12/03 20:36:32 3) github.com/coredhcp/coredhcp/plugins/prefix
2024/12/03 20:36:32 4) github.com/coredhcp/coredhcp/plugins/file
2024/12/03 20:36:32 5) github.com/coredhcp/coredhcp/plugins/ipv6only
2024/12/03 20:36:32 6) github.com/coredhcp/coredhcp/plugins/netmask
2024/12/03 20:36:32 7) github.com/coredhcp/coredhcp/plugins/searchdomains
2024/12/03 20:36:32 8) github.com/coredhcp/coredhcp/plugins/range
2024/12/03 20:36:32 9) github.com/coredhcp/coredhcp/plugins/staticroute
2024/12/03 20:36:32 10) github.com/coredhcp/coredhcp/plugins/autoconfigure
2024/12/03 20:36:32 11) github.com/coredhcp/coredhcp/plugins/dns
2024/12/03 20:36:32 12) github.com/coredhcp/coredhcp/plugins/nbp
2024/12/03 20:36:32 13) github.com/coredhcp/coredhcp/plugins/router
2024/12/03 20:36:32 14) github.com/coredhcp/coredhcp/plugins/serverid
2024/12/03 20:36:32 15) github.com/coredhcp/coredhcp/plugins/sleep
2024/12/03 20:36:32 Generated file 'build/coredhcp.go'. You can build it by running 'go build' in the output directory.
build
$ cd build/
$ go mod tidy
go: downloading github.com/insomniacslk/dhcp v0.0.0-20240227161007-c728f5dd21c8
go: downloading github.com/vishvananda/netns v0.0.4
go: downloading github.com/nxadm/tail v1.4.4
$ go build -o coredhcp
Network Setup
$ sudo -s
# ip netns add ns0
# ip link add dhserver type veth peer name dhclient netns ns0
# ip addr add 172.16.0.254/24 dev dhserver
# ip link set dev dhserver up
# ip netns exec ns0 ip addr add 172.16.0.253/24 dev dhclient
# ip netns exec ns0 ip link set dhclient up
# ip netns exec ns0 ip route add default via 172.16.0.254 dev dhclient
Test 1: Binding to Interface
dnsmasq Test
Running dnsmasq
# dnsmasq --no-daemon --log-queries --no-resolv --log-debug -i dhserver --dhcp-range=172.16.0.1,172.16.0.252
dnsmasq: started, version 2.90 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
dnsmasq: warning: no upstream servers configured
dnsmasq-dhcp: DHCP, IP range 172.16.0.1 -- 172.16.0.252, lease time 1h
dnsmasq: read /etc/hosts - 6 names
dnsmasq-dhcp: DHCPDISCOVER(dhserver) 96:8f:29:b9:69:41
dnsmasq-dhcp: DHCPOFFER(dhserver) 172.16.0.14 96:8f:29:b9:69:41
dnsmasq-dhcp: DHCPDISCOVER(dhserver) 96:8f:29:b9:69:41
dnsmasq-dhcp: DHCPOFFER(dhserver) 172.16.0.14 96:8f:29:b9:69:41
Running dhcpcd
# ip netns exec ns0 dhcpcd -4T dhclient
dhcpcd-10.1.0 starting
network namespace: ns0
DUID 00:01:03:04:2e:e2:43:e6:00:00:00:00:00:00
dhclient: IAID 29:b9:69:41
dhclient: soliciting a DHCP lease
dhclient: offered 172.16.0.14 from 172.16.0.254
interface=dhclient
pid=8394
protocol=dhcp
reason=TEST
ifcarrier=up
ifflags=69699
ifmetric=1002
ifmtu=1500
ifwireless=0
new_broadcast_address=172.16.0.255
new_dhcp_lease_time=3600
new_dhcp_message_type=2
new_dhcp_rebinding_time=3150
new_dhcp_renewal_time=1800
new_dhcp_server_identifier=172.16.0.254
new_domain_name_servers=172.16.0.254
new_ip_address=172.16.0.14
new_network_number=172.16.0.0
new_routers=172.16.0.254
new_subnet_cidr=24
new_subnet_mask=255.255.255.0
dhcpcd exited
CoreDHCP Test
Config
server4:
listen:
- '%dhserver'
plugins:
- server_id: 172.16.0.254
- dns: 172.16.0.254
- router: 172.16.0.254
- netmask: 255.255.255.0
- range: /tmp/range.db 172.16.0.1 172.16.0.252 10m
Running CoreDHCP
# ./coredhcp -c ./config.yaml
[2024-12-03T21:11:32-07:00] INFO main: Setting log level to 'info'
[2024-12-03T21:11:32-07:00] INFO config: Loading configuration
[2024-12-03T21:11:33-07:00] INFO config: DHCPv4: found plugin `server_id` with 1 args: [172.16.0.254]
[2024-12-03T21:11:33-07:00] INFO config: DHCPv4: found plugin `dns` with 1 args: [172.16.0.254]
[2024-12-03T21:11:33-07:00] INFO config: DHCPv4: found plugin `router` with 1 args: [172.16.0.254]
[2024-12-03T21:11:33-07:00] INFO config: DHCPv4: found plugin `netmask` with 1 args: [255.255.255.0]
[2024-12-03T21:11:33-07:00] INFO config: DHCPv4: found plugin `range` with 4 args: [/tmp/range.db 172.16.0.1 172.16.0.252 10m]
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'autoconfigure'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'dns'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'file'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'ipv6only'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'lease_time'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'mtu'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'nbp'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'netmask'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'prefix'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'range'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'router'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'searchdomains'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'server_id'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'sleep'
[2024-12-03T21:11:33-07:00] INFO plugins: Registering plugin 'staticroute'
[2024-12-03T21:11:33-07:00] INFO plugins: Loading plugins...
[2024-12-03T21:11:33-07:00] INFO plugins: DHCPv4: loading plugin `server_id`
[2024-12-03T21:11:33-07:00] INFO plugins/server_id: loading `server_id` plugin for DHCPv4 with args: [172.16.0.254]
[2024-12-03T21:11:33-07:00] INFO plugins: DHCPv4: loading plugin `dns`
[2024-12-03T21:11:33-07:00] INFO plugins/dns: loaded plugin for DHCPv4.
[2024-12-03T21:11:33-07:00] INFO plugins/dns: loaded 1 DNS servers.
[2024-12-03T21:11:33-07:00] INFO plugins: DHCPv4: loading plugin `router`
[2024-12-03T21:11:33-07:00] INFO plugins/router: Loaded plugin for DHCPv4.
[2024-12-03T21:11:33-07:00] INFO plugins/router: loaded 1 router IP addresses.
[2024-12-03T21:11:33-07:00] INFO plugins: DHCPv4: loading plugin `netmask`
[2024-12-03T21:11:33-07:00] INFO plugins/netmask: loaded plugin for DHCPv4.
[2024-12-03T21:11:33-07:00] INFO plugins/netmask: loaded client netmask
[2024-12-03T21:11:33-07:00] INFO plugins: DHCPv4: loading plugin `range`
[2024-12-03T21:11:33-07:00] INFO plugins/range: Loaded 0 DHCPv4 leases from /tmp/range.db
[2024-12-03T21:11:33-07:00] INFO server: Starting DHCPv4 server
[2024-12-03T21:11:33-07:00] INFO server: Listen 0.0.0.0:67
[2024-12-03T21:11:37-07:00] INFO plugins/range: MAC address 96:8f:29:b9:69:41 is new, leasing new IPv4 address
[2024-12-03T21:11:37-07:00] INFO plugins/range: found IP address 172.16.0.1 for MAC 96:8f:29:b9:69:41
Running dhcpcd
# ip netns exec ns0 dhcpcd -4T dhclient
dhcpcd-10.1.0 starting
network namespace: ns0
DUID 00:01:03:04:2e:e2:43:e6:00:00:00:00:00:00
dhclient: IAID 29:b9:69:41
dhclient: soliciting a DHCP lease
dhclient: offered 172.16.0.1 from 172.16.0.254
interface=dhclient
pid=8814
protocol=dhcp
reason=TEST
ifcarrier=up
ifflags=69699
ifmetric=1002
ifmtu=1500
ifwireless=0
new_broadcast_address=172.16.0.255
new_dhcp_client_identifier=ff29b96941000103042ee243e6000000000000
new_dhcp_lease_time=600
new_dhcp_message_type=2
new_dhcp_server_identifier=172.16.0.254
new_domain_name_servers=172.16.0.254
new_ip_address=172.16.0.1
new_network_number=172.16.0.0
new_routers=172.16.0.254
new_subnet_cidr=24
new_subnet_mask=255.255.255.0
dhcpcd exited
Test 2: Binding to IP Address
dnsmasq Test
Running dnsmasq
# dnsmasq --no-daemon --log-queries --no-resolv --log-debug -a 172.16.0.254 --dhcp-range=172.16.0.1,172.16.0.252
dnsmasq: started, version 2.90 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
dnsmasq: warning: no upstream servers configured
dnsmasq-dhcp: DHCP, IP range 172.16.0.1 -- 172.16.0.252, lease time 1h
dnsmasq: read /etc/hosts - 6 names
dnsmasq-dhcp: DHCPDISCOVER(dhserver) 96:8f:29:b9:69:41
dnsmasq-dhcp: DHCPOFFER(dhserver) 172.16.0.14 96:8f:29:b9:69:41
Running dhcpcd
# ip netns exec ns0 dhcpcd -4T dhclient
dhcpcd-10.1.0 starting
network namespace: ns0
DUID 00:01:03:04:2e:e2:43:e6:00:00:00:00:00:00
dhclient: IAID 29:b9:69:41
dhclient: soliciting a DHCP lease
dhclient: offered 172.16.0.14 from 172.16.0.254
interface=dhclient
pid=7483
protocol=dhcp
reason=TEST
ifcarrier=up
ifflags=69699
ifmetric=1002
ifmtu=1500
ifwireless=0
new_broadcast_address=172.16.0.255
new_dhcp_lease_time=3600
new_dhcp_message_type=2
new_dhcp_rebinding_time=3150
new_dhcp_renewal_time=1800
new_dhcp_server_identifier=172.16.0.254
new_domain_name_servers=172.16.0.254
new_ip_address=172.16.0.14
new_network_number=172.16.0.0
new_routers=172.16.0.254
new_subnet_cidr=24
new_subnet_mask=255.255.255.0
dhcpcd exited
CoreDHCP Test
Config
server4:
listen:
- 172.16.0.254
plugins:
- server_id: 172.16.0.254
- dns: 172.16.0.254
- router: 172.16.0.254
- netmask: 255.255.255.0
- range: /tmp/range.db 172.16.0.1 172.16.0.252 10m
Running CoreDHCP
# ./coredhcp -c ./config.yaml
[2024-12-03T21:03:31-07:00] INFO main: Setting log level to 'info'
[2024-12-03T21:03:31-07:00] INFO config: Loading configuration
[2024-12-03T21:03:31-07:00] INFO config: DHCPv4: found plugin `server_id` with 1 args: [172.16.0.254]
[2024-12-03T21:03:31-07:00] INFO config: DHCPv4: found plugin `dns` with 1 args: [172.16.0.254]
[2024-12-03T21:03:31-07:00] INFO config: DHCPv4: found plugin `router` with 1 args: [172.16.0.254]
[2024-12-03T21:03:31-07:00] INFO config: DHCPv4: found plugin `netmask` with 1 args: [255.255.255.0]
[2024-12-03T21:03:31-07:00] INFO config: DHCPv4: found plugin `range` with 4 args: [/tmp/range.db 172.16.0.1 172.16.0.252 10m]
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'autoconfigure'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'dns'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'file'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'ipv6only'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'lease_time'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'mtu'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'nbp'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'netmask'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'prefix'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'range'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'router'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'searchdomains'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'server_id'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'sleep'
[2024-12-03T21:03:31-07:00] INFO plugins: Registering plugin 'staticroute'
[2024-12-03T21:03:31-07:00] INFO plugins: Loading plugins...
[2024-12-03T21:03:31-07:00] INFO plugins: DHCPv4: loading plugin `server_id`
[2024-12-03T21:03:31-07:00] INFO plugins/server_id: loading `server_id` plugin for DHCPv4 with args: [172.16.0.254]
[2024-12-03T21:03:31-07:00] INFO plugins: DHCPv4: loading plugin `dns`
[2024-12-03T21:03:31-07:00] INFO plugins/dns: loaded plugin for DHCPv4.
[2024-12-03T21:03:31-07:00] INFO plugins/dns: loaded 1 DNS servers.
[2024-12-03T21:03:31-07:00] INFO plugins: DHCPv4: loading plugin `router`
[2024-12-03T21:03:31-07:00] INFO plugins/router: Loaded plugin for DHCPv4.
[2024-12-03T21:03:31-07:00] INFO plugins/router: loaded 1 router IP addresses.
[2024-12-03T21:03:31-07:00] INFO plugins: DHCPv4: loading plugin `netmask`
[2024-12-03T21:03:31-07:00] INFO plugins/netmask: loaded plugin for DHCPv4.
[2024-12-03T21:03:31-07:00] INFO plugins/netmask: loaded client netmask
[2024-12-03T21:03:31-07:00] INFO plugins: DHCPv4: loading plugin `range`
[2024-12-03T21:03:31-07:00] INFO plugins/range: Loaded 0 DHCPv4 leases from /tmp/range.db
[2024-12-03T21:03:31-07:00] INFO server: Starting DHCPv4 server
[2024-12-03T21:03:31-07:00] INFO server: Listen 172.16.0.254:67
Running dhcpcd
# ip netns exec ns0 dhcpcd -4T dhclient
dhcpcd-10.1.0 starting
network namespace: ns0
DUID 00:01:03:04:2e:e2:43:e6:00:00:00:00:00:00
dhclient: IAID 29:b9:69:41
dhclient: soliciting a DHCP lease
timed out
dhcpcd exited