dhcp: Add option to bind the receive socket to a different interface

This can be useful if the DHCP server runs on the same server. On Linux,
the response is then sent via `lo`, so packets won't be received if both
sockets are bound to e.g. a bridge interface.
This commit is contained in:
Tobias Brunner
2025-01-31 11:20:42 +01:00
parent 00d8c36d6f
commit a50ed3006e
2 changed files with 18 additions and 5 deletions
+10
View File
@@ -36,3 +36,13 @@ charon.plugins.dhcp.interface
Interface name the plugin uses for address allocation. The default is to
bind to any (0.0.0.0) and let the system decide which way to route the
packets to the DHCP server.
charon.plugins.dhcp.interface_receive = charon.plugins.dhcp.interface
Interface name the plugin uses to bind its receive socket.
Interface name the plugin uses to bind its receive socket. The default is
to use the same interface as the send socket. Set it to the empty string
to avoid binding the receive socket to any interface while the send socket
is bound to one. If the server runs on the same host and the send socket is
bound to an interface, it might be necessary to set this to `lo` or the
empty string.
+8 -5
View File
@@ -716,7 +716,7 @@ dhcp_socket_t *dhcp_socket_create()
},
};
socklen_t addr_len;
char *iface;
char *iface, *iface_receive;
int on = 1, rcvbuf = 0;
#if !defined(__APPLE__) && !defined(__FreeBSD__)
@@ -809,8 +809,11 @@ dhcp_socket_t *dhcp_socket_create()
this->dst = host_create_from_string(lib->settings->get_str(lib->settings,
"%s.plugins.dhcp.server", "255.255.255.255",
lib->ns), DHCP_SERVER_PORT);
iface = lib->settings->get_str(lib->settings, "%s.plugins.dhcp.interface",
NULL, lib->ns);
iface = lib->settings->get_str(lib->settings,
"%s.plugins.dhcp.interface", NULL, lib->ns);
iface_receive = lib->settings->get_str(lib->settings,
"%s.plugins.dhcp.interface_receive", NULL,
lib->ns) ?: iface;
if (!this->dst)
{
DBG1(DBG_CFG, "configured DHCP server address invalid");
@@ -873,8 +876,8 @@ dhcp_socket_t *dhcp_socket_create()
return NULL;
}
this->pf_handler = pf_handler_create("DHCP", iface, receive_dhcp, this,
&dhcp_filter);
this->pf_handler = pf_handler_create("DHCP", iface_receive, receive_dhcp,
this, &dhcp_filter);
if (!this->pf_handler)
{
destroy(this);