Blob Blame History Raw
From b1590ac89253781d127ad40baa1abb8de7731cc9 Mon Sep 17 00:00:00 2001
From: Eric Garver <eric@garver.life>
Date: Tue, 16 Apr 2019 10:53:48 -0400
Subject: [PATCH 27/73] fix: nftables rich rule mark not marking every packet

Similar to the fix for #478, nftables needs to mark every packet, not
just the first one that begins a new connection.

(cherry picked from commit 9d98c11732bcbee4a74bd883cd9b6e7defb3b401)
(cherry picked from commit 7538a479e100d14d248a64c8a23d81ccc9723b9e)
---
 src/firewall/core/nftables.py | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/firewall/core/nftables.py b/src/firewall/core/nftables.py
index 50303e94ed7b..02e2ca008157 100644
--- a/src/firewall/core/nftables.py
+++ b/src/firewall/core/nftables.py
@@ -798,7 +798,8 @@ class nftables(object):
             rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination)
             rule_fragment += self._rich_rule_source_fragment(rich_rule.source)
         rule_fragment += [proto, "dport", "%s" % portStr(port, "-")]
-        rule_fragment += ["ct", "state", "new,untracked"]
+        if not rich_rule or type(rich_rule.action) != Rich_Mark:
+            rule_fragment += ["ct", "state", "new,untracked"]
 
         rules = []
         if rich_rule:
@@ -831,7 +832,8 @@ class nftables(object):
             rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination)
             rule_fragment += self._rich_rule_source_fragment(rich_rule.source)
         rule_fragment = ["meta", "l4proto", protocol]
-        rule_fragment += ["ct", "state", "new,untracked"]
+        if not rich_rule or type(rich_rule.action) != Rich_Mark:
+            rule_fragment += ["ct", "state", "new,untracked"]
 
         rules = []
         if rich_rule:
@@ -864,7 +866,8 @@ class nftables(object):
             rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination)
             rule_fragment += self._rich_rule_source_fragment(rich_rule.source)
         rule_fragment += [proto, "sport", "%s" % portStr(port, "-")]
-        rule_fragment += ["ct", "state", "new,untracked"]
+        if not rich_rule or type(rich_rule.action) != Rich_Mark:
+            rule_fragment += ["ct", "state", "new,untracked"]
 
         rules = []
         if rich_rule:
-- 
2.20.1