firewall_linux_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package libnetwork
  2. import (
  3. "fmt"
  4. "strings"
  5. "testing"
  6. "github.com/docker/docker/internal/testutils/netnsutils"
  7. "github.com/docker/docker/libnetwork/config"
  8. "github.com/docker/docker/libnetwork/iptables"
  9. "github.com/docker/docker/libnetwork/netlabel"
  10. "github.com/docker/docker/libnetwork/options"
  11. "gotest.tools/v3/assert"
  12. is "gotest.tools/v3/assert/cmp"
  13. )
  14. const (
  15. fwdChainName = "FORWARD"
  16. usrChainName = userChain
  17. )
  18. func TestUserChain(t *testing.T) {
  19. iptable4 := iptables.GetIptable(iptables.IPv4)
  20. iptable6 := iptables.GetIptable(iptables.IPv6)
  21. tests := []struct {
  22. iptables bool
  23. insert bool // insert other rules to FORWARD
  24. fwdChain []string
  25. userChain []string
  26. }{
  27. {
  28. iptables: false,
  29. insert: false,
  30. fwdChain: []string{"-P FORWARD ACCEPT"},
  31. },
  32. {
  33. iptables: true,
  34. insert: false,
  35. fwdChain: []string{"-P FORWARD ACCEPT", "-A FORWARD -j DOCKER-USER"},
  36. userChain: []string{"-N DOCKER-USER", "-A DOCKER-USER -j RETURN"},
  37. },
  38. {
  39. iptables: true,
  40. insert: true,
  41. fwdChain: []string{"-P FORWARD ACCEPT", "-A FORWARD -j DOCKER-USER", "-A FORWARD -j DROP"},
  42. userChain: []string{"-N DOCKER-USER", "-A DOCKER-USER -j RETURN"},
  43. },
  44. }
  45. for _, tc := range tests {
  46. tc := tc
  47. t.Run(fmt.Sprintf("iptables=%v,insert=%v", tc.iptables, tc.insert), func(t *testing.T) {
  48. defer netnsutils.SetupTestOSContext(t)()
  49. defer resetIptables(t)
  50. c, err := New(
  51. OptionBoltdbWithRandomDBFile(t),
  52. config.OptionDriverConfig("bridge", map[string]any{
  53. netlabel.GenericData: options.Generic{
  54. "EnableIPTables": tc.iptables,
  55. "EnableIP6Tables": tc.iptables,
  56. },
  57. }))
  58. assert.NilError(t, err)
  59. defer c.Stop()
  60. // init. condition, FORWARD chain empty DOCKER-USER not exist
  61. assert.Check(t, is.DeepEqual(getRules(t, iptable4, fwdChainName), []string{"-P FORWARD ACCEPT"}))
  62. assert.Check(t, is.DeepEqual(getRules(t, iptable6, fwdChainName), []string{"-P FORWARD ACCEPT"}))
  63. if tc.insert {
  64. _, err = iptable4.Raw("-A", fwdChainName, "-j", "DROP")
  65. assert.Check(t, err)
  66. _, err = iptable6.Raw("-A", fwdChainName, "-j", "DROP")
  67. assert.Check(t, err)
  68. }
  69. arrangeUserFilterRule()
  70. assert.Check(t, is.DeepEqual(getRules(t, iptable4, fwdChainName), tc.fwdChain))
  71. assert.Check(t, is.DeepEqual(getRules(t, iptable6, fwdChainName), tc.fwdChain))
  72. if tc.userChain != nil {
  73. assert.Check(t, is.DeepEqual(getRules(t, iptable4, usrChainName), tc.userChain))
  74. assert.Check(t, is.DeepEqual(getRules(t, iptable6, usrChainName), tc.userChain))
  75. } else {
  76. _, err = iptable4.Raw("-S", usrChainName)
  77. assert.Check(t, is.ErrorContains(err, "No chain/target/match by that name"), "ipv4 chain %v: created unexpectedly", usrChainName)
  78. _, err = iptable6.Raw("-S", usrChainName)
  79. assert.Check(t, is.ErrorContains(err, "No chain/target/match by that name"), "ipv6 chain %v: created unexpectedly", usrChainName)
  80. }
  81. })
  82. }
  83. }
  84. func getRules(t *testing.T, iptable *iptables.IPTable, chain string) []string {
  85. t.Helper()
  86. output, err := iptable.Raw("-S", chain)
  87. assert.NilError(t, err, "chain %s: failed to get rules", chain)
  88. rules := strings.Split(string(output), "\n")
  89. if len(rules) > 0 {
  90. rules = rules[:len(rules)-1]
  91. }
  92. return rules
  93. }
  94. func resetIptables(t *testing.T) {
  95. t.Helper()
  96. for _, ipVer := range []iptables.IPVersion{iptables.IPv4, iptables.IPv6} {
  97. iptable := iptables.GetIptable(ipVer)
  98. _, err := iptable.Raw("-F", fwdChainName)
  99. assert.Check(t, err)
  100. _ = iptable.RemoveExistingChain(usrChainName, iptables.Filter)
  101. }
  102. }