firewall_linux.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package libnetwork
  2. import (
  3. "github.com/docker/libnetwork/iptables"
  4. "github.com/sirupsen/logrus"
  5. )
  6. const userChain = "DOCKER-USER"
  7. var (
  8. ctrl *controller = nil
  9. )
  10. func setupArrangeUserFilterRule(c *controller) {
  11. ctrl = c
  12. iptables.OnReloaded(arrangeUserFilterRule)
  13. }
  14. // This chain allow users to configure firewall policies in a way that persists
  15. // docker operations/restarts. Docker will not delete or modify any pre-existing
  16. // rules from the DOCKER-USER filter chain.
  17. // Note once DOCKER-USER chain is created, docker engine does not remove it when
  18. // IPTableForwarding is disabled, because it contains rules configured by user that
  19. // are beyond docker engine's control.
  20. func arrangeUserFilterRule() {
  21. if ctrl == nil || !ctrl.iptablesEnabled() {
  22. return
  23. }
  24. _, err := iptables.NewChain(userChain, iptables.Filter, false)
  25. if err != nil {
  26. logrus.Warnf("Failed to create %s chain: %v", userChain, err)
  27. return
  28. }
  29. if err = iptables.AddReturnRule(userChain); err != nil {
  30. logrus.Warnf("Failed to add the RETURN rule for %s: %v", userChain, err)
  31. return
  32. }
  33. err = iptables.EnsureJumpRule("FORWARD", userChain)
  34. if err != nil {
  35. logrus.Warnf("Failed to ensure the jump rule for %s: %v", userChain, err)
  36. }
  37. }