]> git.proxmox.com Git - pve-firewall.git/blobdiff - src/PVE/Firewall.pm
rename pve-fw-v4addr-spec to pve-fw-addr-spec
[pve-firewall.git] / src / PVE / Firewall.pm
index 5a6284fa3d2800f84d067c0bf578d8c5d89ccc8a..76684f9676ddc5a49bfcd3ab61b4725d72e8bf75 100644 (file)
@@ -489,7 +489,8 @@ my $pve_fw_parsed_macros;
 my $pve_fw_macro_descr;
 my $pve_fw_preferred_macro_names = {};
 
-my $pve_std_chains = {
+my $pve_std_chains = {};
+$pve_std_chains->{4} = {
     'PVEFW-SET-ACCEPT-MARK' => [
        "-j MARK --set-mark 1",
     ],
@@ -801,6 +802,8 @@ sub parse_address_list {
 
     my $count = 0;
     my $iprange = 0;
+    my $ipversion = undef;
+
     foreach my $elem (split(/,/, $str)) {
        $count++;
        if (!Net::IP->new($elem)) {
@@ -808,9 +811,11 @@ sub parse_address_list {
            die "invalid IP address: $err\n";
        }
        $iprange = 1 if $elem =~ m/-/;
+       $ipversion = Net::IP::ip_get_version($elem); #fixme : don't work with range
     }
 
     die "you can use a range in a list\n" if $iprange && $count > 1;
+    return $ipversion;
 }
 
 sub parse_port_name_number_or_range {
@@ -852,8 +857,8 @@ sub pve_fw_verify_port_spec {
    return $portstr;
 }
 
-PVE::JSONSchema::register_format('pve-fw-v4addr-spec', \&pve_fw_verify_v4addr_spec);
-sub pve_fw_verify_v4addr_spec {
+PVE::JSONSchema::register_format('pve-fw-addr-spec', \&pve_fw_verify_addr_spec);
+sub pve_fw_verify_addr_spec {
    my ($list) = @_;
 
    parse_address_list($list);
@@ -952,11 +957,11 @@ my $rule_properties = {
     },
     iface => get_standard_option('pve-iface', { optional => 1 }),
     source => {
-       type => 'string', format => 'pve-fw-v4addr-spec',
+       type => 'string', format => 'pve-fw-addr-spec',
        optional => 1,
     },
     dest => {
-       type => 'string', format => 'pve-fw-v4addr-spec',
+       type => 'string', format => 'pve-fw-addr-spec',
        optional => 1,
     },
     proto => {
@@ -1070,6 +1075,7 @@ sub verify_rule {
     my ($rule, $cluster_conf, $fw_conf, $rule_env, $noerr) = @_;
 
     my $allow_groups = $rule_env eq 'group' ? 0 : 1;
+    my $ipversion = undef;
 
     my $allow_iface = $rule_env_iface_lookup->{$rule_env};
     die "unknown rule_env '$rule_env'\n" if !defined($allow_iface); # should not happen
@@ -1168,13 +1174,13 @@ sub verify_rule {
     }
 
     if ($rule->{source}) {
-       eval { parse_address_list($rule->{source}); };
+       eval { $ipversion = parse_address_list($rule->{source}); };
        &$add_error('source', $@) if $@;
        &$check_ipset_or_alias_property('source');
     }
 
     if ($rule->{dest}) {
-       eval { parse_address_list($rule->{dest}); };
+       eval { $ipversion = parse_address_list($rule->{dest}); };
        &$add_error('dest', $@) if $@;
        &$check_ipset_or_alias_property('dest');
     }
@@ -1194,6 +1200,7 @@ sub verify_rule {
     }
 
     $rule->{errors} = $errors if $error_count;
+    $rule->{ipversion} = $ipversion if $ipversion;
 
     return $rule;
 }
@@ -2641,29 +2648,35 @@ sub get_option_log_level {
 }
 
 sub generate_std_chains {
-    my ($ruleset, $options) = @_;
+    my ($ruleset, $options, $ipversion) = @_;
+
+    my $std_chains = $pve_std_chains->{$ipversion} || die "internal error";
 
     my $loglevel = get_option_log_level($options, 'smurf_log_level');
 
-    # same as shorewall smurflog.
-    my $chain = 'PVEFW-smurflog';
-    $pve_std_chains->{$chain} = [];
+    my $chain;
 
-    push @{$pve_std_chains->{$chain}}, get_log_rule_base($chain, 0, "DROP: ", $loglevel) if $loglevel;
-    push @{$pve_std_chains->{$chain}}, "-j DROP";
+    if ($ipversion == 4) {
+       # same as shorewall smurflog.
+       $chain = 'PVEFW-smurflog';
+       $std_chains->{$chain} = [];
+       
+       push @{$std_chains->{$chain}}, get_log_rule_base($chain, 0, "DROP: ", $loglevel) if $loglevel;
+       push @{$std_chains->{$chain}}, "-j DROP";
+    }
 
     # same as shorewall logflags action.
     $loglevel = get_option_log_level($options, 'tcp_flags_log_level');
     $chain = 'PVEFW-logflags';
-    $pve_std_chains->{$chain} = [];
+    $std_chains->{$chain} = [];
 
     # fixme: is this correctly logged by pvewf-logger? (ther is no --log-ip-options for NFLOG)
-    push @{$pve_std_chains->{$chain}}, get_log_rule_base($chain, 0, "DROP: ", $loglevel) if $loglevel;
-    push @{$pve_std_chains->{$chain}}, "-j DROP";
+    push @{$std_chains->{$chain}}, get_log_rule_base($chain, 0, "DROP: ", $loglevel) if $loglevel;
+    push @{$std_chains->{$chain}}, "-j DROP";
 
-    foreach my $chain (keys %$pve_std_chains) {
+    foreach my $chain (keys %$std_chains) {
        ruleset_create_chain($ruleset, $chain);
-       foreach my $rule (@{$pve_std_chains->{$chain}}) {
+       foreach my $rule (@{$std_chains->{$chain}}) {
            if (ref($rule)) {
                ruleset_generate_rule($ruleset, $chain, $rule);
            } else {
@@ -2890,7 +2903,7 @@ sub compile_iptables_filter {
 
     ruleset_addrule($ruleset, "PVEFW-FORWARD", "-o venet0 -m set --match-set ${venet0_ipset_chain} dst -j PVEFW-VENET-IN");
 
-    generate_std_chains($ruleset, $hostfw_options);
+    generate_std_chains($ruleset, $hostfw_options, $ipversion);
 
     my $hostfw_enable = !(defined($hostfw_options->{enable}) && ($hostfw_options->{enable} == 0));