[pve-devel] [PATCH common 2/2] daemon: explicitly bind to wildcard address.

Wolfgang Bumiller w.bumiller at proxmox.com
Tue May 4 13:28:34 CEST 2021


On Tue, May 04, 2021 at 12:12:16PM +0200, Stoiko Ivanov wrote:
> with the recent change in pve-manager pveproxy (and spiceproxy)
> try binding to '::' per default. This fails for hosts having disabled
> ipv6 via kernel commandline.
> 
> Our desired behavior of binding on '::' and only falling back to
> '0.0.0.0' in case this is not supported is not directly possible with
> IO::Socket::IP->new (or rather by Socket::GetAddrInfo, which at least
> on my system always returns the v4 wildcard-address first).
> 
> the code now binds to:
> * the provided $host if not undef
> * '::' if $host is not set
> * '0.0.0.0' if $host is not set and binding on '::' yields an error
> 
> Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
> ---
>  src/PVE/Daemon.pm | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/src/PVE/Daemon.pm b/src/PVE/Daemon.pm
> index 79b90ad..f4786b8 100644
> --- a/src/PVE/Daemon.pm
> +++ b/src/PVE/Daemon.pm
> @@ -819,14 +819,24 @@ sub create_reusable_socket {
>  	$socket->fcntl(Fcntl::F_SETFD(), Fcntl::FD_CLOEXEC);
>      } else {
>  
> -	$socket = IO::Socket::IP->new(
> -	    LocalHost => $host,
> +	my %sockargs = (
>  	    LocalPort => $port,
>  	    Listen => SOMAXCONN,
>  	    Proto  => 'tcp',
>  	    GetAddrInfoFlags => 0,
> -	    ReuseAddr => 1) ||
> -	    die "unable to create socket - $@\n";
> +	    ReuseAddr => 1,
> +	);
> +	if (defined($host)) {
> +	    $socket = IO::Socket::IP->new( LocalHost => $host, %sockargs) ||
> +		die "unable to create socket - $@\n";
> +	} else {
> +	    # disabling AF_INET6 (by adding ipv6.disable=1 to the kernel cmdline)
> +	    # causes bind on :: to fail, try 0.0.0.0 in that case
> +	    $socket = IO::Socket::IP->new( LocalHost => '::', %sockargs);
> +
> +	    $socket = IO::Socket::IP->new( LocalHost => '0.0.0.0', %sockargs) if $@;

So apparently this doesn't *die* but just returns `undef` on error. But
we also should not rely on internal implementation details, so we cannot
assume that $@ will be cleared on success.
So we should probably bind the two calls together via `//` (or clear $@
before the first call?)

    $socket = IO::Socket::IP->new( LocalHost => '::', %sockargs)
        // IO::Socket::IP->new( LocalHost => '0.0.0.0', %sockargs);

> +	    die "unable to create socket - $@\n" if !$socket;
> +	}
>  
>  	# we often observe delays when using Nagle algorithm,
>  	# so we disable that to maximize performance
> -- 
> 2.20.1




More information about the pve-devel mailing list