allow_list_test.go 4.7 KB

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