With recent changes to the listening socket code in pve-manager
the proxy daemons now usually bind to '::' and ipv4 clients are
read as v4-mapped-v6 addresses [0] from ::ffff:0:0/96.
This caused the allow_from/deny_from matching to break.
This patch addresses the issue by normalizing addresses from
::ffff:0:0/96 using Net::IP::ip_get_embedded_ipv4
(which roughly splits on ':' and checks if the last part looks like an
ipv4 address).
Issue was originally reported in our community forum [1]
[0] https://en.wikipedia.org/wiki/IPv6_address
[1] https://forum.proxmox.com/threads/my-pveproxy-file-doesnt-work.83228/
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
use PVE::INotify;
use PVE::Tools;
use PVE::APIServer::Formatter;
use PVE::INotify;
use PVE::Tools;
use PVE::APIServer::Formatter;
+use PVE::APIServer::Utils;
sub check_host_access {
my ($self, $clientip) = @_;
sub check_host_access {
my ($self, $clientip) = @_;
+ $clientip = PVE::APIServer::Utils::normalize_v4_in_v6($clientip);
my $cip = Net::IP->new($clientip);
if (!$cip) {
my $cip = Net::IP->new($clientip);
if (!$cip) {
my $ips = [];
foreach my $ip (split(/,/, $value)) {
$ip = "0/0" if $ip eq 'all';
my $ips = [];
foreach my $ip (split(/,/, $value)) {
$ip = "0/0" if $ip eq 'all';
- push @$ips, Net::IP->new($ip) || die Net::IP::Error() . "\n";
+ push @$ips, Net::IP->new(normalize_v4_in_v6($ip)) || die Net::IP::Error() . "\n";
}
$res->{$key} = $ips;
} elsif ($key eq 'LISTEN_IP') {
}
$res->{$key} = $ips;
} elsif ($key eq 'LISTEN_IP') {
+sub normalize_v4_in_v6 {
+ my ($ip_text) = @_;
+
+ my $ip = Net::IP->new($ip_text) || die Net::IP::Error() . "\n";
+ my $v4_mapped_v6_prefix = Net::IP->new('::ffff:0:0/96');
+ if ($v4_mapped_v6_prefix->overlaps($ip)) {
+ return Net::IP::ip_get_embedded_ipv4($ip_text);
+ }
+ return $ip_text;
+}
+