Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5c499fc

Browse files
committed
Only enable bridge netfiltering when needed
Kernel module br_netfilter is loaded when the daemon starts with either iptables or ip6tables enabled. That automatically sets: net.bridge.bridge-nf-call-arptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 So, when: - docker was running happily with iptables=false, and - no explicit ip6tables=false, and - br_netfilter was not loaded ... the change in moby 27.0 to enable ip6tables by default, resulted in net.bridge.bridge-nf-call-iptables being enabled. If the host also had a firewall with default-drop on its forward chain - that resulted in packets getting dropped between containers on a bridge network. So, only try to load br_netfilter when it's needed - it's only needed to implement "--icc=false", which can only be used when iptables or ip6tables is enabled. Signed-off-by: Rob Murray <[email protected]> (cherry picked from commit db25b0d) Signed-off-by: Rob Murray <[email protected]>
1 parent 98f24aa commit 5c499fc

File tree

2 files changed

+7
-10
lines changed

2 files changed

+7
-10
lines changed

libnetwork/drivers/bridge/bridge_linux.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"fmt"
66
"net"
77
"net/netip"
8-
"os"
9-
"os/exec"
108
"strconv"
119
"sync"
1210

@@ -482,14 +480,6 @@ func (d *driver) configure(option map[string]interface{}) error {
482480
return &ErrInvalidDriverConfig{}
483481
}
484482

485-
if config.EnableIPTables || config.EnableIP6Tables {
486-
if _, err := os.Stat("/proc/sys/net/bridge"); err != nil {
487-
if out, err := exec.Command("modprobe", "-va", "bridge", "br_netfilter").CombinedOutput(); err != nil {
488-
log.G(context.TODO()).Warnf("Running modprobe bridge br_netfilter failed with message: %s, error: %v", out, err)
489-
}
490-
}
491-
}
492-
493483
if config.EnableIPTables {
494484
removeIPChains(iptables.IPv4)
495485

libnetwork/drivers/bridge/setup_bridgenetfiltering.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"errors"
88
"fmt"
99
"os"
10+
"os/exec"
1011
"syscall"
1112

1213
"github.com/containerd/log"
@@ -46,6 +47,12 @@ func setupIPv6BridgeNetFiltering(config *networkConfiguration, _ *bridgeInterfac
4647

4748
// Enable bridge net filtering if not already enabled. See GitHub issue #11404
4849
func enableBridgeNetFiltering(nfParam string) error {
50+
if _, err := os.Stat("/proc/sys/net/bridge"); err != nil {
51+
if out, err := exec.Command("modprobe", "-va", "bridge", "br_netfilter").CombinedOutput(); err != nil {
52+
log.G(context.TODO()).WithError(err).Errorf("Running modprobe bridge br_netfilter failed with message: %s", out)
53+
return fmt.Errorf("cannot restrict inter-container communication: modprobe br_netfilter failed: %w", err)
54+
}
55+
}
4956
enabled, err := getKernelBoolParam(nfParam)
5057
if err != nil {
5158
var pathErr *os.PathError

0 commit comments

Comments
 (0)