DHCP Relay: replay from server is not forwarded (discarded ?)
Hello, I have simple configuration of client-relay-server (by ISC):
- client - 1 iface in net1 (10.0.0.0/24)
- relay - 1 iface on net1 and 1 iface on net2 (10.0.10.0/24)
- server - 1 iface on net2 (10.0.10.0/24).
When running it on **Linux Kernel 4.x.y **: all okey, request and replay are forwarded to/from server and IP address have been assigned to client.
When running on **Linux kernel 5.4.117 **: replay from server is lost somewhere in relay host or relay do not see it.
Information about Relay
My command line to run relay: /usr/sbin/dhcrelay -d -pf /var/run/dhcrelay.pid -id eth3 -iu eth4 -c 10 -a 10.0.10.254
Ip address of eth3 (to client) of relay is 10.0.0.1/24 and eth4 (to server) of relay is 10.0.10.1/24
Information about Server
Ip address of eth0 of server is 10.0.10.254/24
My command line to run dhcp server:_ /usr/sbin/dhcpd -user dhcpd -group dhcpd -cf /etc/dhcpd.conf eth0_
My config of dhcp server concerning to networks and ranges:
shared-network net-eth0 {
subnet 10.0.10.0 netmask 255.255.255.0 {
}
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.20;
}
}
I've used tcpdump on relay iface that looks to server and here is log:
- Here is Request: 10.0.10.1 - is relay net2 iface of relay, 10.0.10.254 - is server net2 iface of server
15:23:24.224319 08:00:27:eb:f2:44 > 08:00:27:2e:19:cd, ethertype IPv4 (0x0800), length 371: 10.0.10.1.67 > 10.0.10.254.67: BOOTP/DHCP, Request from 08:00:27:ef:1a:e9, length 329
- Here is Reply: 10.0.0.1 - is net1 iface of relay
15:23:24.224778 08:00:27:2e:19:cd > 08:00:27:eb:f2:44, ethertype IPv4 (0x0800), length 342: 10.0.10.254.67 > 10.0.0.1.67: BOOTP/DHCP, Reply, length 300
I've debugged also relay, and found, that when Replay needs to be received it was read be falback_discard() routine and relay can not see it. Here is debug of relay with some of my own debug-strings (comments starts with //):
//Initialization of relay staff
......
IPv4: Sending on Socket/fallback
//Here is omapi_iscsock_cb() called to read request
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
//before calling reader()
IPv4: omapi_iscsock_cb: bf reader()=0x7f6343cc5e90 //address of reader (function got_one() )
IPv4: got_one
IPv4: receive_packet
IPv4: receive_packet: recvfrom() ret=316
IPv4: do_relay4
IPv4: Adding 14-byte relay agent option
IPv4: Forwarded BOOTREQUEST for 08:00:27:ef:1a:e9 to 10.0.10.254
IPv4: omapi_iscsock_cb: af reader(): status=0 --status of reading Request
//Here is when and where replay should be read but it is discarded
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
//before calling reader()
IPv4: omapi_iscsock_cb: bf reader()=0x7f6343ce6a70 //address of reader (function fallback_discard() )
IPv4: fallback_discard()
IPv4: omapi_iscsock_cb: af reader(): status=0
IPv4: omapi_iscsock_cb: af reader(): status=0
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
IPv4: omapi_iscsock_cb: bf reader()=0x7f6343ce6a70 //address of reader (function fallback_discard() )
IPv4: fallback_discard()
IPv4: omapi_iscsock_cb: af reader(): status=0
//Here is 2nd Request try
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
IPv4: omapi_iscsock_cb: bf reader()=0x7f6343cc5e90
IPv4: got_one
IPv4: receive_packet
IPv4: receive_packet: recvfrom() ret=316
IPv4: do_relay4
IPv4: Adding 14-byte relay agent option
IPv4: Forwarded BOOTREQUEST for 08:00:27:ef:1a:e9 to 10.0.10.254
For comparison with GOOD case: this is log of relay:
IPv4: Sending on Socket/fallback
IPv4: disc_ifaces: in fallback_iface: setting fcntl
//Getting Request
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
IPv4: omapi_iscsock_cb: bf reader()=0x7f0d3ebb9e90
IPv4: got_one
IPv4: receive_packet
IPv4: receive_packet: recvfrom() ret=316
IPv4: do_relay4
IPv4: Adding 14-byte relay agent option
IPv4: Forwarded BOOTREQUEST for 08:00:27:ef:1a:e9 to 10.0.10.254
IPv4: omapi_iscsock_cb: af reader(): status=0
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
IPv4: omapi_iscsock_cb: bf reader()=0x7f0d3ebdaab0
IPv4: fallback_discard()
IPv4: omapi_iscsock_cb: af reader(): status=0
**//Here is REPLAY**
IPv4: omapi_iscsock_cb 0
IPv4: omapi_iscsock_cb1
IPv4: omapi_iscsock_cb2
IPv4: omapi_iscsock_cb: bf reader()=0x7f0d3ebb9e90
IPv4: got_one
IPv4: receive_packet
IPv4: receive_packet: recvfrom() ret=300
IPv4: do_relay4
IPv4: Forwarded BOOTREPLY for 08:00:27:ef:1a:e9 to 255.255.255.255
Tcpdump for good case:
//here is dump of eth4(to server) iface
18:17:39.866071 08:00:27:eb:f2:44 > 08:00:27:2e:19:cd, ethertype IPv4 (0x0800), length 371: 10.0.10.1.67 > 10.0.10.254.67: BOOTP/DHCP, Request from 08:00:27:ef:1a:e9, length 329
18:17:40.867748 08:00:27:2e:19:cd > 08:00:27:eb:f2:44, ethertype IPv4 (0x0800), length 342: 10.0.10.254.67 > 10.0.0.1.67: BOOTP/DHCP, Reply, length 300
//here is dump of eth3(to client) iface: this is what absent above in bad case: replay seen on net1 (eth3) iface of relay
18:19:04.575007 08:00:27:8f:96:7d > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: 10.0.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 300
Thanks!