Blob Blame History Raw
From b0267902150824c1e0e6e626921181e461a101bd Mon Sep 17 00:00:00 2001
From: Eric Garver <e@erig.me>
Date: Wed, 19 Dec 2018 14:20:46 -0500
Subject: [PATCH 3/8] nftables: support RFC3964_IPv4 filtering

(cherry picked from commit 5afa02271418284ae95dc81304c7af65ff6e41ae)
---
 src/firewall/core/nftables.py | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/firewall/core/nftables.py b/src/firewall/core/nftables.py
index 72f2180ec504..1d0ce24d68a2 100644
--- a/src/firewall/core/nftables.py
+++ b/src/firewall/core/nftables.py
@@ -54,7 +54,7 @@ IPTABLES_TO_NFT_HOOK = {
     #},
     "raw": {
         "PREROUTING": ("prerouting", -300 + NFT_HOOK_OFFSET),
-    #    "OUTPUT": ("output", -300 + NFT_HOOK_OFFSET),
+        "OUTPUT": ("output", -300 + NFT_HOOK_OFFSET),
     },
     "mangle": {
         "PREROUTING": ("prerouting", -150 + NFT_HOOK_OFFSET),
@@ -412,6 +412,7 @@ class nftables(object):
                                   IPTABLES_TO_NFT_HOOK["raw"][chain][0],
                                   IPTABLES_TO_NFT_HOOK["raw"][chain][1]))
 
+        for chain in ["PREROUTING"]:
             default_rules.append("add chain inet %s raw_%s_ZONES_SOURCE" % (TABLE_NAME, chain))
             default_rules.append("add chain inet %s raw_%s_ZONES" % (TABLE_NAME, chain))
             default_rules.append("add rule inet %s raw_%s jump raw_%s_ZONES_SOURCE" % (TABLE_NAME, chain, chain))
@@ -1245,6 +1246,30 @@ class nftables(object):
                       "accept"]) # RHBZ#1058505, RHBZ#1575431 (bug in kernel 4.16-4.17)
         return rules
 
+    def build_rfc3964_ipv4_rules(self):
+        daddr_set = ["{",
+                     "::0.0.0.0/96,", # IPv4 compatible
+                     "::ffff:0.0.0.0/96,", # IPv4 mapped
+                     "2002:0000::/24,", # 0.0.0.0/8 (the system has no address assigned yet)
+                     "2002:0a00::/24,", # 10.0.0.0/8 (private)
+                     "2002:7f00::/24,", # 127.0.0.0/8 (loopback)
+                     "2002:ac10::/28,", # 172.16.0.0/12 (private)
+                     "2002:c0a8::/32,", # 192.168.0.0/16 (private)
+                     "2002:a9fe::/32,", # 169.254.0.0/16 (IANA Assigned DHCP link-local)
+                     "2002:e000::/19,", # 224.0.0.0/4 (multicast), 240.0.0.0/4 (reserved and broadcast)
+                     "}"]
+
+        rule_fragment = ["ip6", "daddr"] + daddr_set
+        if self._fw._log_denied in ["unicast", "all"]:
+            rule_fragment += ["log", "prefix", "\"RFC3964_IPv4_DROP: \""]
+        rule_fragment += ["drop"]
+
+        rules = []
+        for chain in ["PREROUTING", "OUTPUT"]:
+            rules.append(["insert", "rule", "inet", "%s" % TABLE_NAME,
+                          "raw_%s" % chain] + rule_fragment)
+        return rules
+
     def build_zone_rich_source_destination_rules(self, enable, zone, rich_rule):
         table = "filter"
         target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"],
-- 
2.18.0