skip icmpv6 rule for iptables rules
skip icmp rule for ip6tables rules

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 src/PVE/Firewall.pm |   44 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/src/PVE/Firewall.pm b/src/PVE/Firewall.pm
index 962e85b..8ad9070 100644
--- a/src/PVE/Firewall.pm
+++ b/src/PVE/Firewall.pm
@@ -618,6 +618,32 @@ my $icmp_type_names = {
     'address-mask-reply' => 1,
 };
 
+# ip6tables -p icmpv6 -h
+
+my $icmpv6_type_names = {
+    'any' => 1,
+    'destination-unreachable' => 1,
+    'no-route' => 1,
+    'communication-prohibited' => 1,
+    'address-unreachable' => 1,
+    'port-unreachable' => 1,
+    'packet-too-big' => 1,
+    'time-exceeded' => 1,
+    'ttl-zero-during-transit' => 1,
+    'ttl-zero-during-reassembly' => 1,
+    'parameter-problem' => 1,
+    'bad-header' => 1,
+    'unknown-header-type' => 1,
+    'unknown-option' => 1,
+    'echo-request' => 1,
+    'echo-reply' => 1,
+    'router-solicitation' => 1,
+    'router-advertisement' => 1,
+    'neighbour-solicitation' => 1,
+    'neighbour-advertisement' => 1,
+    'redirect' => 1,
+};
+
 sub init_firewall_macros {
 
     $pve_fw_parsed_macros = {};
@@ -704,6 +730,9 @@ sub get_etc_protocols {
 
     close($fh);
 
+    $protocols->{byid}->{icmpv6}->{name} = "icmpv6";
+    $protocols->{byname}->{icmpv6} = $protocols->{byid}->{icmpv6};
+
     $etc_protocols = $protocols;
 
     return $etc_protocols;
@@ -834,6 +863,8 @@ sub parse_port_name_number_or_range {
        } else {
            if ($icmp_type_names->{$item}) {
                $icmp_port = 1;
+           }elsif ($icmpv6_type_names->{$item}) {
+               $icmp_port = 1;
            } else {
                die "invalid port '$item'\n" if !$services->{byname}->{$item};
            }
@@ -1073,6 +1104,7 @@ sub verify_rule {
 
     my $allow_groups = $rule_env eq 'group' ? 0 : 1;
     my $ipversion = undef;
+    my $protoversion = undef;
 
     my $allow_iface = $rule_env_iface_lookup->{$rule_env};
     die "unknown rule_env '$rule_env'\n" if !defined($allow_iface); # should 
not happen
@@ -1154,6 +1186,8 @@ sub verify_rule {
     if ($rule->{proto}) {
        eval { pve_fw_verify_protocol_spec($rule->{proto}); };
        &$add_error('proto', $@) if $@;
+       $protoversion = '4' if($rule->{proto} eq 'icmp');
+       $protoversion = '6' if($rule->{proto} eq 'icmpv6');
     }
 
     if ($rule->{dport}) {
@@ -1196,8 +1230,12 @@ sub verify_rule {
        }
     }
 
-    $rule->{errors} = $errors if $error_count;
+
+    &$add_error('proto', "proto version and ipversion are not the same") if 
$ipversion && $protoversion && $protoversion ne $ipversion;
     $rule->{ipversion} = $ipversion if $ipversion;
+    $rule->{ipversion} = $protoversion if $protoversion;
+
+    $rule->{errors} = $errors if $error_count;
 
     return $rule;
 }
@@ -1451,6 +1489,10 @@ sub ruleset_generate_cmdstr {
                # Note: we use dport to store --icmp-type
                die "unknown icmp-type '$rule->{dport}'\n" if 
!defined($icmp_type_names->{$rule->{dport}});
                push @cmd, "-m icmp --icmp-type $rule->{dport}";
+           } elsif ($rule->{proto} && $rule->{proto} eq 'icmpv6') {
+               # Note: we use dport to store --icmpv6-type
+               die "unknown icmpv6-type '$rule->{dport}'\n" if 
!defined($icmpv6_type_names->{$rule->{dport}});
+               push @cmd, "-m icmpv6 --icmpv6-type $rule->{dport}";
            } else {
                if ($nbdport > 1) {
                    if ($multiport == 2) {
-- 
1.7.10.4

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to