The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7091

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From c345988eca772a976ddd2d3a22807bfbd628609e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 27 Mar 2020 10:00:41 +0000
Subject: [PATCH 1/3] lxd/firewall/drivers/drivers/consts: Adds FilterIPv6All
 constant

Indicator for allowing all IPv6 traffic to be blocked.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/firewall/drivers/drivers_consts.go | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 lxd/firewall/drivers/drivers_consts.go

diff --git a/lxd/firewall/drivers/drivers_consts.go 
b/lxd/firewall/drivers/drivers_consts.go
new file mode 100644
index 0000000000..aecb2c0ca8
--- /dev/null
+++ b/lxd/firewall/drivers/drivers_consts.go
@@ -0,0 +1,4 @@
+package drivers
+
+// FilterIPv6All used to indicate to firewall package to filter all IPv6 
traffic.
+const FilterIPv6All = "::"

From 5dbcb040e00566b7ac82c5ec76be8ab7c184e15e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 27 Mar 2020 10:02:08 +0000
Subject: [PATCH 2/3] lxd/device/nic/bridged: Allow security.ipv6_filtering to
 be used on networks without IPv6

If no static or dynamic IPv6 addresses are available to the instance, with 
security.ipv6_filtering=true, all IPv6 traffic will be blocked.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/device/nic_bridged.go | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/lxd/device/nic_bridged.go b/lxd/device/nic_bridged.go
index fde4ba269c..a72fd13053 100644
--- a/lxd/device/nic_bridged.go
+++ b/lxd/device/nic_bridged.go
@@ -21,6 +21,7 @@ import (
        "github.com/lxc/lxd/lxd/db"
        deviceConfig "github.com/lxc/lxd/lxd/device/config"
        "github.com/lxc/lxd/lxd/dnsmasq"
+       firewallDrivers "github.com/lxc/lxd/lxd/firewall/drivers"
        "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/instance/instancetype"
        "github.com/lxc/lxd/lxd/network"
@@ -475,6 +476,11 @@ func (d *nicBridged) removeFilters(m deviceConfig.Device) {
                IPv6 = net.ParseIP(m["ipv6.address"])
        }
 
+       // If no static IPv6 assigned, try removing the filter all rule in case 
it was setup.
+       if IPv6 == nil {
+               IPv6 = net.ParseIP(firewallDrivers.FilterIPv6All)
+       }
+
        // Remove filters for static MAC and IPs (if specified above).
        // This covers the case when filtering is used with an unmanaged bridge.
        err := d.state.Firewall.InstanceClearBridgeFilter(d.inst.Project(), 
d.inst.Name(), d.name, m["parent"], m["host_name"], m["hwaddr"], IPv4, IPv6)
@@ -570,8 +576,9 @@ func (d *nicBridged) setFilters() (err error) {
                IPv4 = nil
        }
 
-       if !shared.IsTrue(d.config["security.ipv6_filtering"]) {
-               IPv6 = nil
+       // If no allocated IPv6 address for filtering and filtering enabled, 
then block all IPv6 traffic.
+       if shared.IsTrue(d.config["security.ipv6_filtering"]) && IPv6 == nil {
+               IPv6 = net.ParseIP(firewallDrivers.FilterIPv6All)
        }
 
        return d.state.Firewall.InstanceSetupBridgeFilter(d.inst.Project(), 
d.inst.Name(), d.name, d.config["parent"], d.config["host_name"], 
d.config["hwaddr"], IPv4, IPv6)
@@ -612,7 +619,7 @@ func (d *nicBridged) allocateFilterIPs(n *network.Network) 
(net.IP, net.IP, erro
 
        // Check DHCPv6 is enabled on parent if dynamic IPv6 allocation is 
needed.
        if shared.IsTrue(d.config["security.ipv6_filtering"]) && IPv6 == nil && 
!canIPv6Allocate {
-               return nil, nil, fmt.Errorf("Cannot use security.ipv6_filtering 
as DHCPv6 is disabled or no IPv6 on parent %s and no static IPv6 address set", 
d.config["parent"])
+               logger.Warnf("IPv6 filtering enabled on %q device %q without a 
static IPv6 specified or dynamic allocation enabled, all IPv6 traffic will be 
blocked", d.inst.Name(), d.name)
        }
 
        dnsmasq.ConfigMutex.Lock()

From 7d8ad23340154069e7a78dc7e27ba3baae609e2b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 27 Mar 2020 10:03:07 +0000
Subject: [PATCH 3/3] lxd/firewall/drivers/drivers/xtables: Adds FilterIPv6All
 support

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/firewall/drivers/drivers_xtables.go | 26 +++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/lxd/firewall/drivers/drivers_xtables.go 
b/lxd/firewall/drivers/drivers_xtables.go
index dd7ff16635..7cdad1259c 100644
--- a/lxd/firewall/drivers/drivers_xtables.go
+++ b/lxd/firewall/drivers/drivers_xtables.go
@@ -450,14 +450,24 @@ func (d Xtables) generateFilterEbtablesRules(hostName, 
hwAddr string, IPv4, IPv6
        }
 
        if IPv6 != nil {
-               rules = append(rules,
-                       // Allow DHCPv6 and Router Solicitation to the host 
only. This must come before the IP source filtering rules below.
-                       []string{"ebtables", "-t", "filter", "-A", "INPUT", 
"-p", "IPv6", "-s", hwAddr, "-i", hostName, "--ip6-src", "fe80::/ffc0::", 
"--ip6-dst", "ff02::1:2/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 
"--ip6-proto", "udp", "--ip6-dport", "547", "-j", "ACCEPT"},
-                       []string{"ebtables", "-t", "filter", "-A", "INPUT", 
"-p", "IPv6", "-s", hwAddr, "-i", hostName, "--ip6-src", "fe80::/ffc0::", 
"--ip6-dst", "ff02::2/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "--ip6-proto", 
"ipv6-icmp", "--ip6-icmp-type", "router-solicitation", "-j", "ACCEPT"},
-                       // IP source filtering rules. Blocks any packet coming 
from instance with an incorrect IP source address.
-                       []string{"ebtables", "-t", "filter", "-A", "INPUT", 
"-p", "IPv6", "-i", hostName, "--ip6-src", "!", 
fmt.Sprintf("%s/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", IPv6.String()), "-j", 
"DROP"},
-                       []string{"ebtables", "-t", "filter", "-A", "FORWARD", 
"-p", "IPv6", "-i", hostName, "--ip6-src", "!", 
fmt.Sprintf("%s/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", IPv6.String()), "-j", 
"DROP"},
-               )
+               if IPv6.String() == FilterIPv6All {
+                       rules = append(rules,
+                               []string{"ebtables", "-t", "filter", "-A", 
"INPUT", "-p", "IPv6", "-i", hostName, "-j", "DROP"},
+                               []string{"ebtables", "-t", "filter", "-A", 
"FORWARD", "-p", "IPv6", "-i", hostName, "-j", "DROP"},
+                       )
+               } else {
+                       rules = append(rules,
+                               // Allow DHCPv6 and Router Solicitation to the 
host only. This must come before the IP source filtering rules below.
+                               []string{"ebtables", "-t", "filter", "-A", 
"INPUT", "-p", "IPv6", "-s", hwAddr, "-i", hostName, "--ip6-src", 
"fe80::/ffc0::", "--ip6-dst", 
"ff02::1:2/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "--ip6-proto", "udp", 
"--ip6-dport", "547", "-j", "ACCEPT"},
+                               []string{"ebtables", "-t", "filter", "-A", 
"INPUT", "-p", "IPv6", "-s", hwAddr, "-i", hostName, "--ip6-src", 
"fe80::/ffc0::", "--ip6-dst", 
"ff02::2/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "--ip6-proto", "ipv6-icmp", 
"--ip6-icmp-type", "router-solicitation", "-j", "ACCEPT"},
+                               // IP source filtering rules. Blocks any packet 
coming from instance with an incorrect IP source address.
+                               []string{"ebtables", "-t", "filter", "-A", 
"INPUT", "-p", "IPv6", "-i", hostName, "--ip6-src", "!", 
fmt.Sprintf("%s/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", IPv6.String()), "-j", 
"DROP"},
+                               []string{"ebtables", "-t", "filter", "-A", 
"FORWARD", "-p", "IPv6", "-i", hostName, "--ip6-src", "!", 
fmt.Sprintf("%s/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", IPv6.String()), "-j", 
"DROP"},
+                               // Block any IPv6 router advertisement packets 
from instance.
+                               []string{"ebtables", "-t", "filter", "-A", 
"INPUT", "-p", "IPv6", "-i", hostName, "--ip6-proto", "ipv6-icmp", 
"--ip6-icmp-type", "router-advertisement", "-j", "DROP"},
+                               []string{"ebtables", "-t", "filter", "-A", 
"FORWARD", "-p", "IPv6", "-i", hostName, "--ip6-proto", "ipv6-icmp", 
"--ip6-icmp-type", "router-advertisement", "-j", "DROP"},
+                       )
+               }
        }
 
        return rules
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to