From 5b18e6c7632258a010a402572e89c6a49e16d7e9 Mon Sep 17 00:00:00 2001 From: Vincent Li Date: Tue, 24 Jun 2025 22:37:17 -0700 Subject: [PATCH] wireguard: Select the correct source IP address for N2N peers commit 76ea485d9edb781328e307c68b1f878d933408e5 Author: Michael Tremer Date: Fri Sep 27 17:39:22 2024 +0200 wireguard: Select the correct source IP address for N2N peers This is so that the firewall chooses the correct IP address when trying to establish connections to the remote networks. Signed-off-by: Michael Tremer Signed-off-by: Vincent Li --- src/initscripts/networking/functions.network | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/initscripts/networking/functions.network b/src/initscripts/networking/functions.network index eb83b183d..3c0f2e3ad 100644 --- a/src/initscripts/networking/functions.network +++ b/src/initscripts/networking/functions.network @@ -246,6 +246,46 @@ network_address_in_network() { [ "${address}" -ge "${netaddr}" -a "${address}" -le "${broadcast}" ] } +# Takes a network and list of IP addresses and will return the first IP address +# that is in the given network. +first_address_in_network() { + local network="${1}" + shift + + local addr + for addr in $@; do + if network_address_in_network "${addr}" "${network}"; then + echo "${addr}" + return 0 + fi + done + + return 1 +} + +# Returns the first of IPFire's own IP addresses that is in any of the given networks +ipfire_address_in_networks() { + local addresses=() + + local var + for var in GREEN_ADDRESS BLUE_ADDRESS ORANGE_ADDRESS; do + if [ -n "${!var}" ]; then + addresses+=( "${!var}" ) + fi + done + + local network + for network in $@; do + # Find and end after the first match + if first_address_in_network "${network}" "${addresses[@]}"; then + return 0 + fi + done + + # Nothing found + return 1 +} + dhcpcd_get_pid() { # This function returns the pid of a dhcpcd by a given # network device, if a pidfile exists.