setup_ip_forwarding.go 2.2 KB

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