2021-05-25 23:48:54 +00:00
|
|
|
// +build linux
|
|
|
|
|
2015-03-04 10:11:31 -08:00
|
|
|
package bridge
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
2016-11-21 11:53:07 -07:00
|
|
|
|
2021-04-06 00:24:47 +00:00
|
|
|
"github.com/docker/docker/libnetwork/iptables"
|
2017-07-26 14:18:31 -07:00
|
|
|
"github.com/sirupsen/logrus"
|
2015-03-04 10:11:31 -08:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2015-03-04 13:25:43 -08:00
|
|
|
ipv4ForwardConf = "/proc/sys/net/ipv4/ip_forward"
|
|
|
|
ipv4ForwardConfPerm = 0644
|
2015-03-04 10:11:31 -08:00
|
|
|
)
|
|
|
|
|
2016-10-28 13:54:52 -07:00
|
|
|
func configureIPForwarding(enable bool) error {
|
|
|
|
var val byte
|
|
|
|
if enable {
|
|
|
|
val = '1'
|
|
|
|
}
|
|
|
|
return ioutil.WriteFile(ipv4ForwardConf, []byte{val, '\n'}, ipv4ForwardConfPerm)
|
|
|
|
}
|
|
|
|
|
2020-07-19 16:07:22 +02:00
|
|
|
func setupIPForwarding(enableIPTables bool, enableIP6Tables bool) error {
|
2015-07-27 13:31:03 +02:00
|
|
|
// Get current IPv4 forward setup
|
|
|
|
ipv4ForwardData, err := ioutil.ReadFile(ipv4ForwardConf)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Cannot read IP forwarding setup: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enable IPv4 forwarding only if it is not already enabled
|
|
|
|
if ipv4ForwardData[0] != '1' {
|
|
|
|
// Enable IPv4 forwarding
|
2016-10-28 13:54:52 -07:00
|
|
|
if err := configureIPForwarding(true); err != nil {
|
|
|
|
return fmt.Errorf("Enabling IP forwarding failed: %v", err)
|
2015-07-27 13:31:03 +02:00
|
|
|
}
|
2019-10-07 17:50:38 +01:00
|
|
|
// When enabling ip_forward set the default policy on forward chain to
|
|
|
|
// drop only if the daemon option iptables is not set to false.
|
2020-07-21 18:38:34 +02:00
|
|
|
if enableIPTables {
|
|
|
|
iptable := iptables.GetIptable(iptables.IPv4)
|
2017-11-28 15:15:55 -06:00
|
|
|
if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
|
2020-07-21 18:38:34 +02:00
|
|
|
if err := configureIPForwarding(false); err != nil {
|
|
|
|
logrus.Errorf("Disabling IP forwarding failed, %v", err)
|
|
|
|
}
|
|
|
|
return err
|
2016-10-28 13:54:52 -07:00
|
|
|
}
|
2020-07-21 18:38:34 +02:00
|
|
|
iptables.OnReloaded(func() {
|
|
|
|
logrus.Debug("Setting the default DROP policy on firewall reload")
|
|
|
|
if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
|
|
|
|
logrus.Warnf("Setting the default DROP policy on firewall reload failed, %v", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
2015-03-04 11:37:16 -08:00
|
|
|
}
|
2020-07-19 16:07:22 +02:00
|
|
|
|
|
|
|
// add only iptables rules - forwarding is handled by setupIPv6Forwarding in setup_ipv6
|
|
|
|
if enableIP6Tables {
|
|
|
|
iptable := iptables.GetIptable(iptables.IPv6)
|
|
|
|
if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
|
|
|
|
logrus.Warnf("Setting the default DROP policy on firewall reload failed, %v", err)
|
|
|
|
}
|
2020-07-20 19:56:34 +02:00
|
|
|
iptables.OnReloaded(func() {
|
|
|
|
logrus.Debug("Setting the default DROP policy on firewall reload")
|
|
|
|
if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
|
|
|
|
logrus.Warnf("Setting the default DROP policy on firewall reload failed, %v", err)
|
|
|
|
}
|
|
|
|
})
|
2020-07-19 16:07:22 +02:00
|
|
|
}
|
|
|
|
|
2015-03-04 11:37:16 -08:00
|
|
|
return nil
|
2015-03-04 10:11:31 -08:00
|
|
|
}
|