setup_ip_forwarding.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. //go:build linux
  2. package bridge
  3. import (
  4. "context"
  5. "fmt"
  6. "os"
  7. "github.com/containerd/log"
  8. "github.com/docker/docker/libnetwork/iptables"
  9. )
  10. const (
  11. ipv4ForwardConf = "/proc/sys/net/ipv4/ip_forward"
  12. ipv4ForwardConfPerm = 0o644
  13. )
  14. func configureIPForwarding(enable bool) error {
  15. var val byte
  16. if enable {
  17. val = '1'
  18. }
  19. return os.WriteFile(ipv4ForwardConf, []byte{val, '\n'}, ipv4ForwardConfPerm)
  20. }
  21. func setupIPForwarding(enableIPTables bool, enableIP6Tables bool) error {
  22. // Get current IPv4 forward setup
  23. ipv4ForwardData, err := os.ReadFile(ipv4ForwardConf)
  24. if err != nil {
  25. return fmt.Errorf("Cannot read IP forwarding setup: %v", err)
  26. }
  27. // Enable IPv4 forwarding only if it is not already enabled
  28. if ipv4ForwardData[0] != '1' {
  29. // Enable IPv4 forwarding
  30. if err := configureIPForwarding(true); err != nil {
  31. return fmt.Errorf("Enabling IP forwarding failed: %v", err)
  32. }
  33. // When enabling ip_forward set the default policy on forward chain to
  34. // drop only if the daemon option iptables is not set to false.
  35. if enableIPTables {
  36. iptable := iptables.GetIptable(iptables.IPv4)
  37. if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
  38. if err := configureIPForwarding(false); err != nil {
  39. log.G(context.TODO()).Errorf("Disabling IP forwarding failed, %v", err)
  40. }
  41. return err
  42. }
  43. iptables.OnReloaded(func() {
  44. log.G(context.TODO()).Debug("Setting the default DROP policy on firewall reload")
  45. if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
  46. log.G(context.TODO()).Warnf("Setting the default DROP policy on firewall reload failed, %v", err)
  47. }
  48. })
  49. }
  50. }
  51. // add only iptables rules - forwarding is handled by setupIPv6Forwarding in setup_ipv6
  52. if enableIP6Tables {
  53. iptable := iptables.GetIptable(iptables.IPv6)
  54. if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
  55. log.G(context.TODO()).Warnf("Setting the default DROP policy on firewall reload failed, %v", err)
  56. }
  57. iptables.OnReloaded(func() {
  58. log.G(context.TODO()).Debug("Setting the default DROP policy on firewall reload")
  59. if err := iptable.SetDefaultPolicy(iptables.Filter, "FORWARD", iptables.Drop); err != nil {
  60. log.G(context.TODO()).Warnf("Setting the default DROP policy on firewall reload failed, %v", err)
  61. }
  62. })
  63. }
  64. return nil
  65. }