[pve-devel] [PATCH 07/15] add icmpv6 support

Alexandre Derumier aderumier at odiso.com
Thu Jul 10 10:22:34 CEST 2014


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

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

diff --git a/src/PVE/Firewall.pm b/src/PVE/Firewall.pm
index aaeec04..a0a65ad 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,13 @@ 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 +1490,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




More information about the pve-devel mailing list