allow_list_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package nebula
  2. import (
  3. "net/netip"
  4. "regexp"
  5. "testing"
  6. "github.com/gaissmai/bart"
  7. "github.com/slackhq/nebula/config"
  8. "github.com/slackhq/nebula/test"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. )
  12. func TestNewAllowListFromConfig(t *testing.T) {
  13. l := test.NewLogger()
  14. c := config.NewC(l)
  15. c.Settings["allowlist"] = map[string]any{
  16. "192.168.0.0": true,
  17. }
  18. r, err := newAllowListFromConfig(c, "allowlist", nil)
  19. require.EqualError(t, err, "config `allowlist` has invalid CIDR: 192.168.0.0. netip.ParsePrefix(\"192.168.0.0\"): no '/'")
  20. assert.Nil(t, r)
  21. c.Settings["allowlist"] = map[string]any{
  22. "192.168.0.0/16": "abc",
  23. }
  24. r, err = newAllowListFromConfig(c, "allowlist", nil)
  25. require.EqualError(t, err, "config `allowlist` has invalid value (type string): abc")
  26. c.Settings["allowlist"] = map[string]any{
  27. "192.168.0.0/16": true,
  28. "10.0.0.0/8": false,
  29. }
  30. r, err = newAllowListFromConfig(c, "allowlist", nil)
  31. require.EqualError(t, err, "config `allowlist` contains both true and false rules, but no default set for 0.0.0.0/0")
  32. c.Settings["allowlist"] = map[string]any{
  33. "0.0.0.0/0": true,
  34. "10.0.0.0/8": false,
  35. "10.42.42.0/24": true,
  36. "fd00::/8": true,
  37. "fd00:fd00::/16": false,
  38. }
  39. r, err = newAllowListFromConfig(c, "allowlist", nil)
  40. require.EqualError(t, err, "config `allowlist` contains both true and false rules, but no default set for ::/0")
  41. c.Settings["allowlist"] = map[string]any{
  42. "0.0.0.0/0": true,
  43. "10.0.0.0/8": false,
  44. "10.42.42.0/24": true,
  45. }
  46. r, err = newAllowListFromConfig(c, "allowlist", nil)
  47. if assert.NoError(t, err) {
  48. assert.NotNil(t, r)
  49. }
  50. c.Settings["allowlist"] = map[string]any{
  51. "0.0.0.0/0": true,
  52. "10.0.0.0/8": false,
  53. "10.42.42.0/24": true,
  54. "::/0": false,
  55. "fd00::/8": true,
  56. "fd00:fd00::/16": false,
  57. }
  58. r, err = newAllowListFromConfig(c, "allowlist", nil)
  59. if assert.NoError(t, err) {
  60. assert.NotNil(t, r)
  61. }
  62. // Test interface names
  63. c.Settings["allowlist"] = map[string]any{
  64. "interfaces": map[string]any{
  65. `docker.*`: "foo",
  66. },
  67. }
  68. lr, err := NewLocalAllowListFromConfig(c, "allowlist")
  69. require.EqualError(t, err, "config `allowlist.interfaces` has invalid value (type string): foo")
  70. c.Settings["allowlist"] = map[string]any{
  71. "interfaces": map[string]any{
  72. `docker.*`: false,
  73. `eth.*`: true,
  74. },
  75. }
  76. lr, err = NewLocalAllowListFromConfig(c, "allowlist")
  77. require.EqualError(t, err, "config `allowlist.interfaces` values must all be the same true/false value")
  78. c.Settings["allowlist"] = map[string]any{
  79. "interfaces": map[string]any{
  80. `docker.*`: false,
  81. },
  82. }
  83. lr, err = NewLocalAllowListFromConfig(c, "allowlist")
  84. if assert.NoError(t, err) {
  85. assert.NotNil(t, lr)
  86. }
  87. }
  88. func TestAllowList_Allow(t *testing.T) {
  89. assert.True(t, ((*AllowList)(nil)).Allow(netip.MustParseAddr("1.1.1.1")))
  90. tree := new(bart.Table[bool])
  91. tree.Insert(netip.MustParsePrefix("0.0.0.0/0"), true)
  92. tree.Insert(netip.MustParsePrefix("10.0.0.0/8"), false)
  93. tree.Insert(netip.MustParsePrefix("10.42.42.42/32"), true)
  94. tree.Insert(netip.MustParsePrefix("10.42.0.0/16"), true)
  95. tree.Insert(netip.MustParsePrefix("10.42.42.0/24"), true)
  96. tree.Insert(netip.MustParsePrefix("10.42.42.0/24"), false)
  97. tree.Insert(netip.MustParsePrefix("::1/128"), true)
  98. tree.Insert(netip.MustParsePrefix("::2/128"), false)
  99. al := &AllowList{cidrTree: tree}
  100. assert.True(t, al.Allow(netip.MustParseAddr("1.1.1.1")))
  101. assert.False(t, al.Allow(netip.MustParseAddr("10.0.0.4")))
  102. assert.True(t, al.Allow(netip.MustParseAddr("10.42.42.42")))
  103. assert.False(t, al.Allow(netip.MustParseAddr("10.42.42.41")))
  104. assert.True(t, al.Allow(netip.MustParseAddr("10.42.0.1")))
  105. assert.True(t, al.Allow(netip.MustParseAddr("::1")))
  106. assert.False(t, al.Allow(netip.MustParseAddr("::2")))
  107. }
  108. func TestLocalAllowList_AllowName(t *testing.T) {
  109. assert.True(t, ((*LocalAllowList)(nil)).AllowName("docker0"))
  110. rules := []AllowListNameRule{
  111. {Name: regexp.MustCompile("^docker.*$"), Allow: false},
  112. {Name: regexp.MustCompile("^tun.*$"), Allow: false},
  113. }
  114. al := &LocalAllowList{nameRules: rules}
  115. assert.False(t, al.AllowName("docker0"))
  116. assert.False(t, al.AllowName("tun0"))
  117. assert.True(t, al.AllowName("eth0"))
  118. rules = []AllowListNameRule{
  119. {Name: regexp.MustCompile("^eth.*$"), Allow: true},
  120. {Name: regexp.MustCompile("^ens.*$"), Allow: true},
  121. }
  122. al = &LocalAllowList{nameRules: rules}
  123. assert.False(t, al.AllowName("docker0"))
  124. assert.True(t, al.AllowName("eth0"))
  125. assert.True(t, al.AllowName("ens5"))
  126. }