Blame SOURCES/firewalld-0.7-0002-Add-RFC3964_IPv4-config-option.patch

21c891
From 21dae834490f1d004b2468c1532bf78fbf455d9e Mon Sep 17 00:00:00 2001
21c891
From: Eric Garver <e@erig.me>
21c891
Date: Wed, 19 Dec 2018 13:40:22 -0500
21c891
Subject: [PATCH 2/8] Add "RFC3964_IPv4" config option
21c891
21c891
As per RFC 3964, filter IPv6 traffic with 6to4 destination addresses
21c891
that correspond to IPv4 addresses that should not be routed over the
21c891
public internet.
21c891
21c891
Defaults to "yes".
21c891
21c891
(cherry picked from commit fce80236bf38dcdfa4a66cd86e6dc03dd08d7f03)
21c891
---
21c891
 config/firewalld.conf                  |  7 +++++++
21c891
 doc/xml/firewalld.conf.xml             | 12 ++++++++++++
21c891
 doc/xml/firewalld.dbus.xml             | 10 ++++++++++
21c891
 src/firewall/config/__init__.py.in     |  1 +
21c891
 src/firewall/core/fw.py                |  9 +++++++++
21c891
 src/firewall/core/io/firewalld_conf.py | 12 +++++++++++-
21c891
 src/firewall/server/config.py          | 20 +++++++++++++++++---
21c891
 src/tests/dbus/firewalld.conf.at       |  2 ++
21c891
 8 files changed, 69 insertions(+), 4 deletions(-)
21c891
21c891
diff --git a/config/firewalld.conf b/config/firewalld.conf
21c891
index 7cb02561fd4d..1dbce81469e0 100644
21c891
--- a/config/firewalld.conf
21c891
+++ b/config/firewalld.conf
21c891
@@ -70,3 +70,10 @@ FirewallBackend=nftables
21c891
 # behavior set this to "no".
21c891
 # Default: yes
21c891
 FlushAllOnReload=yes
21c891
+
21c891
+# RFC3964_IPv4
21c891
+# As per RFC 3964, filter IPv6 traffic with 6to4 destination addresses that
21c891
+# correspond to IPv4 addresses that should not be routed over the public
21c891
+# internet.
21c891
+# Defaults to "yes".
21c891
+RFC3964_IPv4=yes
21c891
diff --git a/doc/xml/firewalld.conf.xml b/doc/xml/firewalld.conf.xml
21c891
index 600919ae822d..457cadfaa38e 100644
21c891
--- a/doc/xml/firewalld.conf.xml
21c891
+++ b/doc/xml/firewalld.conf.xml
21c891
@@ -171,6 +171,18 @@
21c891
             </listitem>
21c891
         </varlistentry>
21c891
 
21c891
+        <varlistentry>
21c891
+            <term><option>RFC3964_IPv4</option></term>
21c891
+            <listitem>
21c891
+                <para>
21c891
+                As per RFC 3964, filter IPv6 traffic with 6to4 destination
21c891
+                addresses that correspond to IPv4 addresses that should not
21c891
+                be routed over the public internet.
21c891
+                Defaults to "yes".
21c891
+                </para>
21c891
+            </listitem>
21c891
+        </varlistentry>
21c891
+
21c891
     </variablelist>
21c891
 
21c891
   </refsect1>
21c891
diff --git a/doc/xml/firewalld.dbus.xml b/doc/xml/firewalld.dbus.xml
21c891
index 132200f3cb42..028d3778e4b6 100644
21c891
--- a/doc/xml/firewalld.dbus.xml
21c891
+++ b/doc/xml/firewalld.dbus.xml
21c891
@@ -2635,6 +2635,16 @@
21c891
               </para>
21c891
             </listitem>
21c891
           </varlistentry>
21c891
+          <varlistentry id="FirewallD1.config.Properties.RFC3964_IPv4">
21c891
+            <term>FirewallBackend - s - (rw)</term>
21c891
+            <listitem>
21c891
+              <para>
21c891
+                As per RFC 3964, filter IPv6 traffic with 6to4 destination
21c891
+                addresses that correspond to IPv4 addresses that should not be
21c891
+                routed over the public internet. Valid options are; yes, no.
21c891
+              </para>
21c891
+            </listitem>
21c891
+          </varlistentry>
21c891
         </variablelist>
21c891
       </refsect3>
21c891
     </refsect2>
21c891
diff --git a/src/firewall/config/__init__.py.in b/src/firewall/config/__init__.py.in
21c891
index 2cfbef804778..5bb318c5b269 100644
21c891
--- a/src/firewall/config/__init__.py.in
21c891
+++ b/src/firewall/config/__init__.py.in
21c891
@@ -131,3 +131,4 @@ FALLBACK_LOG_DENIED = "off"
21c891
 FALLBACK_AUTOMATIC_HELPERS = "system"
21c891
 FALLBACK_FIREWALL_BACKEND = "nftables"
21c891
 FALLBACK_FLUSH_ALL_ON_RELOAD = True
21c891
+FALLBACK_RFC3964_IPV4 = True
21c891
diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py
21c891
index e614a4609edc..e8d77f11b2ae 100644
21c891
--- a/src/firewall/core/fw.py
21c891
+++ b/src/firewall/core/fw.py
21c891
@@ -309,6 +309,15 @@ class Firewall(object):
21c891
                 log.debug1("FlushAllOnReload is set to '%s'",
21c891
                            self._flush_all_on_reload)
21c891
 
21c891
+            if self._firewalld_conf.get("RFC3964_IPv4"):
21c891
+                value = self._firewalld_conf.get("RFC3964_IPv4")
21c891
+                if value.lower() in [ "no", "false" ]:
21c891
+                    self._rfc3964_ipv4 = False
21c891
+                else:
21c891
+                    self._rfc3964_ipv4 = True
21c891
+                log.debug1("RFC3964_IPv4 is set to '%s'",
21c891
+                           self._rfc3964_ipv4)
21c891
+
21c891
         self.config.set_firewalld_conf(copy.deepcopy(self._firewalld_conf))
21c891
 
21c891
         self._select_firewall_backend(self._firewall_backend)
21c891
diff --git a/src/firewall/core/io/firewalld_conf.py b/src/firewall/core/io/firewalld_conf.py
21c891
index 953a6d2618ec..4ba5bf5f218d 100644
21c891
--- a/src/firewall/core/io/firewalld_conf.py
21c891
+++ b/src/firewall/core/io/firewalld_conf.py
21c891
@@ -30,7 +30,8 @@ from firewall.functions import b2u, u2b, PY2
21c891
 
21c891
 valid_keys = [ "DefaultZone", "MinimalMark", "CleanupOnExit", "Lockdown", 
21c891
                "IPv6_rpfilter", "IndividualCalls", "LogDenied",
21c891
-               "AutomaticHelpers", "FirewallBackend", "FlushAllOnReload" ]
21c891
+               "AutomaticHelpers", "FirewallBackend", "FlushAllOnReload",
21c891
+               "RFC3964_IPv4" ]
21c891
 
21c891
 class firewalld_conf(object):
21c891
     def __init__(self, filename):
21c891
@@ -81,6 +82,7 @@ class firewalld_conf(object):
21c891
             self.set("AutomaticHelpers", config.FALLBACK_AUTOMATIC_HELPERS)
21c891
             self.set("FirewallBackend", config.FALLBACK_FIREWALL_BACKEND)
21c891
             self.set("FlushAllOnReload", "yes" if config.FALLBACK_FLUSH_ALL_ON_RELOAD else "no")
21c891
+            self.set("RFC3964_IPv4", "yes" if config.FALLBACK_RFC3964_IPV4 else "no")
21c891
             raise
21c891
 
21c891
         for line in f:
21c891
@@ -192,6 +194,14 @@ class firewalld_conf(object):
21c891
                             config.FALLBACK_FLUSH_ALL_ON_RELOAD)
21c891
             self.set("FlushAllOnReload", str(config.FALLBACK_FLUSH_ALL_ON_RELOAD))
21c891
 
21c891
+        value = self.get("RFC3964_IPv4")
21c891
+        if not value or value.lower() not in [ "yes", "true", "no", "false" ]:
21c891
+            if value is not None:
21c891
+                log.warning("RFC3964_IPv4 '%s' is not valid, using default "
21c891
+                            "value %s", value if value else '',
21c891
+                            config.FALLBACK_RFC3964_IPV4)
21c891
+            self.set("RFC3964_IPv4", str(config.FALLBACK_RFC3964_IPV4))
21c891
+
21c891
     # save to self.filename if there are key/value changes
21c891
     def write(self):
21c891
         if len(self._config) < 1:
21c891
diff --git a/src/firewall/server/config.py b/src/firewall/server/config.py
21c891
index ba04107fe4a1..971dc7d4a14a 100644
21c891
--- a/src/firewall/server/config.py
21c891
+++ b/src/firewall/server/config.py
21c891
@@ -107,6 +107,7 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
                                                 "AutomaticHelpers": "readwrite",
21c891
                                                 "FirewallBackend": "readwrite",
21c891
                                                 "FlushAllOnReload": "readwrite",
21c891
+                                                "RFC3964_IPv4": "readwrite",
21c891
                                               })
21c891
 
21c891
     @handle_exceptions
21c891
@@ -487,7 +488,7 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
         if prop not in [ "DefaultZone", "MinimalMark", "CleanupOnExit",
21c891
                          "Lockdown", "IPv6_rpfilter", "IndividualCalls",
21c891
                          "LogDenied", "AutomaticHelpers", "FirewallBackend",
21c891
-                         "FlushAllOnReload" ]:
21c891
+                         "FlushAllOnReload", "RFC3964_IPv4" ]:
21c891
             raise dbus.exceptions.DBusException(
21c891
                 "org.freedesktop.DBus.Error.InvalidArgs: "
21c891
                 "Property '%s' does not exist" % prop)
21c891
@@ -536,6 +537,10 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
             if value is None:
21c891
                 value = "yes" if config.FALLBACK_FLUSH_ALL_ON_RELOAD else "no"
21c891
             return dbus.String(value)
21c891
+        elif prop == "RFC3964_IPv4":
21c891
+            if value is None:
21c891
+                value = "yes" if config.FALLBACK_RFC3964_IPV4 else "no"
21c891
+            return dbus.String(value)
21c891
 
21c891
     @dbus_handle_exceptions
21c891
     def _get_dbus_property(self, prop):
21c891
@@ -559,6 +564,8 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
             return dbus.String(self._get_property(prop))
21c891
         elif prop == "FlushAllOnReload":
21c891
             return dbus.String(self._get_property(prop))
21c891
+        elif prop == "RFC3964_IPv4":
21c891
+            return dbus.String(self._get_property(prop))
21c891
         else:
21c891
             raise dbus.exceptions.DBusException(
21c891
                 "org.freedesktop.DBus.Error.InvalidArgs: "
21c891
@@ -599,7 +606,7 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
             for x in [ "DefaultZone", "MinimalMark", "CleanupOnExit",
21c891
                        "Lockdown", "IPv6_rpfilter", "IndividualCalls",
21c891
                        "LogDenied", "AutomaticHelpers", "FirewallBackend",
21c891
-                       "FlushAllOnReload" ]:
21c891
+                       "FlushAllOnReload", "RFC3964_IPv4" ]:
21c891
                 ret[x] = self._get_property(x)
21c891
         elif interface_name in [ config.dbus.DBUS_INTERFACE_CONFIG_DIRECT,
21c891
                                  config.dbus.DBUS_INTERFACE_CONFIG_POLICIES ]:
21c891
@@ -626,7 +633,8 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
             if property_name in [ "MinimalMark", "CleanupOnExit", "Lockdown",
21c891
                                   "IPv6_rpfilter", "IndividualCalls",
21c891
                                   "LogDenied", "AutomaticHelpers",
21c891
-                                  "FirewallBackend", "FlushAllOnReload" ]:
21c891
+                                  "FirewallBackend", "FlushAllOnReload",
21c891
+                                  "RFC3964_IPv4" ]:
21c891
                 if property_name == "MinimalMark":
21c891
                     try:
21c891
                         int(new_value)
21c891
@@ -665,6 +673,12 @@ class FirewallDConfig(slip.dbus.service.Object):
21c891
                         raise FirewallError(errors.INVALID_VALUE,
21c891
                                             "'%s' for %s" % \
21c891
                                             (new_value, property_name))
21c891
+                if property_name == "RFC3964_IPv4":
21c891
+                    if new_value.lower() not in ["yes", "true", "no", "false"]:
21c891
+                        raise FirewallError(errors.INVALID_VALUE,
21c891
+                                            "'%s' for %s" % \
21c891
+                                            (new_value, property_name))
21c891
+
21c891
                 self.config.get_firewalld_conf().set(property_name, new_value)
21c891
                 self.config.get_firewalld_conf().write()
21c891
                 self.PropertiesChanged(interface_name,
21c891
diff --git a/src/tests/dbus/firewalld.conf.at b/src/tests/dbus/firewalld.conf.at
21c891
index 72c61bdc4940..07f6d31de725 100644
21c891
--- a/src/tests/dbus/firewalld.conf.at
21c891
+++ b/src/tests/dbus/firewalld.conf.at
21c891
@@ -14,6 +14,7 @@ string "IndividualCalls" : variant string "no"
21c891
 string "Lockdown" : variant string "no"
21c891
 string "LogDenied" : variant string "off"
21c891
 string "MinimalMark" : variant int32 100
21c891
+string "RFC3964_IPv4" : variant string "yes"
21c891
 ])
21c891
 
21c891
 m4_define([_helper], [
21c891
@@ -33,6 +34,7 @@ _helper([IndividualCalls], [string:"yes"], [variant string "yes"])
21c891
 _helper([FirewallBackend], [string:"iptables"], [variant string "iptables"])
21c891
 _helper([FlushAllOnReload], [string:"no"], [variant string "no"])
21c891
 _helper([CleanupOnExit], [string:"yes"], [variant string "yes"])
21c891
+_helper([RFC3964_IPv4], [string:"no"], [variant string "no"])
21c891
 dnl Note: DefaultZone is RO
21c891
 m4_undefine([_helper])
21c891
 
21c891
-- 
21c891
2.18.0
21c891