Skip to content

Commit

Permalink
Option --enable-linux-ip-local-port-range added to use system configu…
Browse files Browse the repository at this point in the history
…red port range for libunbound on Linux
  • Loading branch information
Artem Egorenkov committed Mar 8, 2021
1 parent 08968ba commit e0b7f2e
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 0 deletions.
7 changes: 7 additions & 0 deletions config.h.in
Expand Up @@ -846,6 +846,13 @@
/* Define if you enable libevent */
#undef USE_LIBEVENT

/* WARNING! This is only for libunbound on Linux. This may severely limit the
number of available outgoing ports and thus decrease randomness. Define
this only when the target system restricts (e.g. some of SELinux enabled
distributions) the use of non-ephemeral ports. Define this to enable use of
/proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range. */
#undef USE_LINUX_IP_LOCAL_PORT_RANGE

/* Define if you want to use internal select based events */
#undef USE_MINI_EVENT

Expand Down
34 changes: 34 additions & 0 deletions configure
Expand Up @@ -897,6 +897,7 @@ enable_ipsecmod
enable_ipset
with_libmnl
enable_explicit_port_randomisation
enable_linux_ip_local_port_range
with_libunbound_only
'
ac_precious_vars='build_alias
Expand Down Expand Up @@ -1589,6 +1590,15 @@ Optional Features:
--disable-explicit-port-randomisation
disable explicit source port randomisation and rely
on the kernel to provide random source ports
--enable-linux-ip-local-port-range
WARNING! This is only for libunbound on Linux. This
may severely limit the number of available outgoing
ports and thus decrease randomness. Use this option
only when the target system restricts the use of
non-ephemeral ports. (e.g. some of SELinux enabled
distributions) Enable this option to use
/proc/sys/net/ipv4/ip_local_port_range as a default
outgoing port range

Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
Expand Down Expand Up @@ -4202,6 +4212,13 @@ else
else on_mingw="no"; fi
fi

# are we on Linux?
if uname -s 2>&1 | grep -i linux >/dev/null; then on_linux="yes"
else
if echo $host $target | grep linux >/dev/null; then on_linux="yes"
else on_linux="no"; fi
fi

#
# Determine configuration file
# the eval is to evaluate shell expansion twice
Expand Down Expand Up @@ -21576,6 +21593,23 @@ $as_echo "#define DISABLE_EXPLICIT_PORT_RANDOMISATION 1" >>confdefs.h
;;
esac

if test $on_linux = "yes"; then
# Check whether --enable-linux-ip-local-port-range was given.
if test "${enable_linux_ip_local_port_range+set}" = set; then :
enableval=$enable_linux_ip_local_port_range;
fi

case "$enable_linux_ip_local_port_range" in
yes)

$as_echo "#define USE_LINUX_IP_LOCAL_PORT_RANGE 1" >>confdefs.h

;;
no|*)
;;
esac
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${MAKE:-make} supports $< with implicit rule in scope" >&5
$as_echo_n "checking if ${MAKE:-make} supports $< with implicit rule in scope... " >&6; }
Expand Down
18 changes: 18 additions & 0 deletions configure.ac
Expand Up @@ -152,6 +152,13 @@ else
else on_mingw="no"; fi
fi

# are we on Linux?
if uname -s 2>&1 | grep -i linux >/dev/null; then on_linux="yes"
else
if echo $host $target | grep linux >/dev/null; then on_linux="yes"
else on_linux="no"; fi
fi

#
# Determine configuration file
# the eval is to evaluate shell expansion twice
Expand Down Expand Up @@ -1870,6 +1877,17 @@ case "$enable_explicit_port_randomisation" in
;;
esac

if test $on_linux = "yes"; then
AC_ARG_ENABLE(linux-ip-local-port-range, AC_HELP_STRING([--enable-linux-ip-local-port-range], [WARNING! This is only for the libunbound on Linux and does not affect unbound resolving daemon itself. This may severely limit the number of available outgoing ports and thus decrease randomness. Use this option only when the target system restricts the use of non-ephemeral ports. (e.g. some of SELinux enabled distributions) Enable this option to use /proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range]))
case "$enable_linux_ip_local_port_range" in
yes)
AC_DEFINE([USE_LINUX_IP_LOCAL_PORT_RANGE], [1], [WARNING! This is only for the libunbound on Linux and does not affect unbound resolving daemon itself. This may severely limit the number of available outgoing ports and thus decrease randomness. Define this only when the target system restricts (e.g. some of SELinux enabled distributions) the use of non-ephemeral ports. Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a default outgoing port range.])
;;
no|*)
;;
esac
fi


AC_MSG_CHECKING([if ${MAKE:-make} supports $< with implicit rule in scope])
# on openBSD, the implicit rule make $< work.
Expand Down
1 change: 1 addition & 0 deletions libunbound/context.c
Expand Up @@ -69,6 +69,7 @@ context_finalize(struct ub_ctx* ctx)
} else {
log_init(cfg->logfile, cfg->use_syslog, NULL);
}
cfg_apply_local_port_policy(cfg, 65536);
config_apply(cfg);
if(!modstack_setup(&ctx->mods, cfg->module_conf, ctx->env))
return UB_INITFAIL;
Expand Down
31 changes: 31 additions & 0 deletions util/config_file.c
Expand Up @@ -1645,6 +1645,37 @@ int cfg_condense_ports(struct config_file* cfg, int** avail)
return num;
}

void cfg_apply_local_port_policy(struct config_file* cfg, int num) {
(void)cfg;
(void)num;
#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE
{
int i = 0;
FILE* range_fd;
if ((range_fd = fopen(LINUX_IP_LOCAL_PORT_RANGE_PATH, "r")) != NULL) {
int min_port = 0;
int max_port = num - 1;
if (fscanf(range_fd, "%d %d", &min_port, &max_port) == 2) {
for(i=0; i<min_port; i++) {
cfg->outgoing_avail_ports[i] = 0;
}
for(i=max_port+1; i<num; i++) {
cfg->outgoing_avail_ports[i] = 0;
}
} else {
log_err("unexpected port range in %s",
LINUX_IP_LOCAL_PORT_RANGE_PATH);
}
fclose(range_fd);
} else {
log_warn("failed to read from file: %s (%s)",
LINUX_IP_LOCAL_PORT_RANGE_PATH,
strerror(errno));
}
}
#endif
}

/** print error with file and line number */
static void ub_c_error_va_list(const char *fmt, va_list args)
{
Expand Down
11 changes: 11 additions & 0 deletions util/config_file.h
Expand Up @@ -1145,6 +1145,13 @@ int cfg_mark_ports(const char* str, int allow, int* avail, int num);
*/
int cfg_condense_ports(struct config_file* cfg, int** avail);

/**
* Apply system specific port range policy.
* @param cfg: config file.
* @param num: size of the array (65536).
*/
void cfg_apply_local_port_policy(struct config_file* cfg, int num);

/**
* Scan ports available
* @param avail: the array from cfg.
Expand Down Expand Up @@ -1276,3 +1283,7 @@ extern int fake_dsa, fake_sha1;

#endif /* UTIL_CONFIG_FILE_H */

#ifdef USE_LINUX_IP_LOCAL_PORT_RANGE
#define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range"
#endif

0 comments on commit e0b7f2e

Please sign in to comment.