]> git.proxmox.com Git - pve-firewall.git/blobdiff - PVE/Firewall.pm
always use PVEFW-SET-ACCEPT-MARK for OUT chain
[pve-firewall.git] / PVE / Firewall.pm
index d36dae9e4fa83f696bff1d4d0047aad741caea9e..75a5737d26753976a18423a1d4d4c408de073bdf 100644 (file)
@@ -653,6 +653,7 @@ sub generate_bridge_chains {
     if (!ruleset_chain_exist($ruleset, "$bridge-IN")) {
        ruleset_create_chain($ruleset, "$bridge-IN");
        ruleset_addrule($ruleset, "$bridge-FW", "-m physdev --physdev-is-bridged --physdev-is-out -j $bridge-IN");
+       ruleset_addrule($ruleset, "$bridge-FW", "-m mark --mark 1 -j ACCEPT");
     }
 }
 
@@ -684,17 +685,40 @@ sub generate_tap_rules_direction {
                    generate_group_rules($ruleset, $group_rules, $2);
                }
                ruleset_generate_rule($ruleset, $tapchain, $rule);
-               ruleset_addrule($ruleset, $tapchain, "-m mark --mark 1 -g $bridge-IN")
+               ruleset_addrule($ruleset, $tapchain, "-m mark --mark 1 -j RETURN")
                    if $direction eq 'OUT';
            } else {
-               $rule->{action} = "$bridge-IN" if $rule->{action} eq 'ACCEPT' && $direction eq 'OUT';
+               $rule->{action} = "PVEFW-SET-ACCEPT-MARK" if $rule->{action} eq 'ACCEPT' && $direction eq 'OUT';
                ruleset_generate_rule($ruleset, $tapchain, $rule);
            }
        }
     }
 
-    ruleset_addrule($ruleset, $tapchain, "-j LOG --log-prefix \"$tapchain-dropped: \" --log-level 4");
-    ruleset_addrule($ruleset, $tapchain, "-j DROP");
+    # implement policy
+    my $policy;
+
+    if ($direction eq 'OUT') {
+       $policy = $options->{'policy-out'} || 'ACCEPT'; # allow everything by default
+    } else {
+       $policy = $options->{'policy-in'} || 'DROP'; # allow everything by default
+    }
+
+    if ($policy eq 'ACCEPT') {
+       if ($direction eq 'OUT') {
+           ruleset_addrule($ruleset, $tapchain, "-g PVEFW-SET-ACCEPT-MARK");
+       } else {
+           ruleset_addrule($ruleset, $tapchain, "-j ACCEPT");
+       }
+    } elsif ($policy eq 'DROP') {
+       ruleset_addrule($ruleset, $tapchain, "-j LOG --log-prefix \"$tapchain-dropped: \" --log-level 4");
+       ruleset_addrule($ruleset, $tapchain, "-j DROP");
+    } elsif ($policy eq 'REJECT') {
+       ruleset_addrule($ruleset, $tapchain, "-j LOG --log-prefix \"$tapchain-reject: \" --log-level 4");
+       ruleset_addrule($ruleset, $tapchain, "-j REJECT");
+    } else {
+       # should not happen
+       die "internal error: unknown policy '$policy'";
+    }
 
     # plug the tap chain to bridge chain
     my $physdevdirection = $direction eq 'IN' ? "out" : "in";