]> git.proxmox.com Git - pve-firewall.git/blobdiff - PVE/Firewall.pm
implement simple option parser
[pve-firewall.git] / PVE / Firewall.pm
index f7a87caacd37989e90ee64b508c3381d911546c0..09703b086f57873dda4f17735635c25bb8a955d8 100644 (file)
@@ -638,7 +638,7 @@ sub generate_bridge_chains {
     if (!ruleset_chain_exist($ruleset, "PVEFW-FORWARD")){
        ruleset_create_chain($ruleset, "PVEFW-FORWARD");
 
-       ruleset_addrule($ruleset, "PVEFW-FORWARD", "-m state --state RELATED,ESTABLISHED -j ACCEPT");
+       ruleset_addrule($ruleset, "PVEFW-FORWARD", "-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT");
        ruleset_addrule($ruleset, "PVEFW-FORWARD", "-m physdev --physdev-is-in --physdev-is-bridged -j PVEFW-BRIDGE-OUT");
        ruleset_addrule($ruleset, "PVEFW-FORWARD", "-m physdev --physdev-is-out --physdev-is-bridged -j PVEFW-BRIDGE-IN");
     }
@@ -664,8 +664,8 @@ sub generate_tap_rules_direction {
 
     ruleset_create_chain($ruleset, $tapchain);
 
-    ruleset_addrule($ruleset, $tapchain, "-m state --state INVALID -j DROP");
-    ruleset_addrule($ruleset, $tapchain, "-m state --state RELATED,ESTABLISHED -j ACCEPT");
+    ruleset_addrule($ruleset, $tapchain, "-m conntrack --ctstate INVALID -j DROP");
+    ruleset_addrule($ruleset, $tapchain, "-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT");
 
     if ($direction eq 'OUT' && defined($macaddr)) {
        ruleset_addrule($ruleset, $tapchain, "-m mac ! --mac-source $macaddr -j DROP");
@@ -715,11 +715,11 @@ sub enablehostfw {
     my $chain = "PVEFW-HOST-IN";
     ruleset_create_chain($ruleset, $chain);
 
-    ruleset_addrule($ruleset, $chain, "-m state --state INVALID -j DROP");
-    ruleset_addrule($ruleset, $chain, "-m state --state RELATED,ESTABLISHED -j ACCEPT");
+    ruleset_addrule($ruleset, $chain, "-m conntrack --ctstate INVALID -j DROP");
+    ruleset_addrule($ruleset, $chain, "-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT");
     ruleset_addrule($ruleset, $chain, "-i lo -j ACCEPT");
     ruleset_addrule($ruleset, $chain, "-m addrtype --dst-type MULTICAST -j ACCEPT");
-    ruleset_addrule($ruleset, $chain, "-p udp -m state --state NEW -m multiport --dports 5404,5405 -j ACCEPT");
+    ruleset_addrule($ruleset, $chain, "-p udp -m conntrack --ctstate NEW -m multiport --dports 5404,5405 -j ACCEPT");
     ruleset_addrule($ruleset, $chain, "-p udp -m udp --dport 9000 -j ACCEPT");  #corosync
 
     if ($rules->{in}) {
@@ -737,11 +737,11 @@ sub enablehostfw {
     $chain = "PVEFW-HOST-OUT";
     ruleset_create_chain($ruleset, $chain);
 
-    ruleset_addrule($ruleset, $chain, "-m state --state INVALID -j DROP");
-    ruleset_addrule($ruleset, $chain, "-m state --state RELATED,ESTABLISHED -j ACCEPT");
+    ruleset_addrule($ruleset, $chain, "-m conntrack --ctstate INVALID -j DROP");
+    ruleset_addrule($ruleset, $chain, "-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT");
     ruleset_addrule($ruleset, $chain, "-o lo -j ACCEPT");
     ruleset_addrule($ruleset, $chain, "-m addrtype --dst-type MULTICAST -j ACCEPT");
-    ruleset_addrule($ruleset, $chain, "-p udp -m state --state NEW -m multiport --dports 5404,5405 -j ACCEPT");
+    ruleset_addrule($ruleset, $chain, "-p udp -m conntrack --ctstate NEW -m multiport --dports 5404,5405 -j ACCEPT");
     ruleset_addrule($ruleset, $chain, "-p udp -m udp --dport 9000 -j ACCEPT"); #corosync
 
     if ($rules->{out}) {
@@ -908,10 +908,29 @@ sub parse_fw_rule {
     return $rules;
 }
 
+sub parse_fw_option {
+    my ($line) = @_;
+
+    my ($opt, $value);
+
+    if ($line =~ m/^enable:\s*(0|1)\s*$/i) {
+       $opt = 'enable';
+       $value = int($1);
+    } elsif ($line =~ m/^(policy-(in|out)):\s*(ACCEPT|DROP|REJECT)\s*$/i) {
+       $opt = lc($1);
+       $value = uc($3);
+     } else {
+       chomp $line;
+       die "can't parse option '$line'\n"
+    }
+
+    return ($opt, $value);
+}
+
 sub parse_vm_fw_rules {
     my ($filename, $fh) = @_;
 
-    my $res = { in => [], out => [] };
+    my $res = { in => [], out => [], options => {}};
 
     my $section;
 
@@ -922,8 +941,9 @@ sub parse_vm_fw_rules {
        my $linenr = $fh->input_line_number();
        my $prefix = "$filename (line $linenr)";
 
-       if ($line =~ m/^\[(in|out)\]\s*$/i) {
+       if ($line =~ m/^\[(\S+)\]\s*$/i) {
            $section = lc($1);
+           warn "$prefix: ignore unknown section '$section'\n" if !$res->{$section};
            next;
        }
        if (!$section) {
@@ -931,6 +951,17 @@ sub parse_vm_fw_rules {
            next;
        }
 
+       next if !$res->{$section}; # skip undefined section
+
+       if ($section eq 'options') {
+           eval { 
+               my ($opt, $value) = parse_fw_option($line); 
+               $res->{options}->{$opt} = $value;
+           };
+           warn "$prefix: $@" if $@;
+           next;
+       }
+
        my $rules;
        eval { $rules = parse_fw_rule($line, 1, 1); };
        if (my $err = $@) {