tun_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package nebula
  2. import (
  3. "fmt"
  4. "net"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func Test_parseRoutes(t *testing.T) {
  9. l := NewTestLogger()
  10. c := NewConfig(l)
  11. _, n, _ := net.ParseCIDR("10.0.0.0/24")
  12. // test no routes config
  13. routes, err := parseRoutes(c, n)
  14. assert.Nil(t, err)
  15. assert.Len(t, routes, 0)
  16. // not an array
  17. c.Settings["tun"] = map[interface{}]interface{}{"routes": "hi"}
  18. routes, err = parseRoutes(c, n)
  19. assert.Nil(t, routes)
  20. assert.EqualError(t, err, "tun.routes is not an array")
  21. // no routes
  22. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{}}
  23. routes, err = parseRoutes(c, n)
  24. assert.Nil(t, err)
  25. assert.Len(t, routes, 0)
  26. // weird route
  27. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{"asdf"}}
  28. routes, err = parseRoutes(c, n)
  29. assert.Nil(t, routes)
  30. assert.EqualError(t, err, "entry 1 in tun.routes is invalid")
  31. // no mtu
  32. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{}}}
  33. routes, err = parseRoutes(c, n)
  34. assert.Nil(t, routes)
  35. assert.EqualError(t, err, "entry 1.mtu in tun.routes is not present")
  36. // bad mtu
  37. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{"mtu": "nope"}}}
  38. routes, err = parseRoutes(c, n)
  39. assert.Nil(t, routes)
  40. assert.EqualError(t, err, "entry 1.mtu in tun.routes is not an integer: strconv.Atoi: parsing \"nope\": invalid syntax")
  41. // low mtu
  42. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{"mtu": "499"}}}
  43. routes, err = parseRoutes(c, n)
  44. assert.Nil(t, routes)
  45. assert.EqualError(t, err, "entry 1.mtu in tun.routes is below 500: 499")
  46. // missing route
  47. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{"mtu": "500"}}}
  48. routes, err = parseRoutes(c, n)
  49. assert.Nil(t, routes)
  50. assert.EqualError(t, err, "entry 1.route in tun.routes is not present")
  51. // unparsable route
  52. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{"mtu": "500", "route": "nope"}}}
  53. routes, err = parseRoutes(c, n)
  54. assert.Nil(t, routes)
  55. assert.EqualError(t, err, "entry 1.route in tun.routes failed to parse: invalid CIDR address: nope")
  56. // below network range
  57. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{"mtu": "500", "route": "1.0.0.0/8"}}}
  58. routes, err = parseRoutes(c, n)
  59. assert.Nil(t, routes)
  60. assert.EqualError(t, err, "entry 1.route in tun.routes is not contained within the network attached to the certificate; route: 1.0.0.0/8, network: 10.0.0.0/24")
  61. // above network range
  62. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{map[interface{}]interface{}{"mtu": "500", "route": "10.0.1.0/24"}}}
  63. routes, err = parseRoutes(c, n)
  64. assert.Nil(t, routes)
  65. assert.EqualError(t, err, "entry 1.route in tun.routes is not contained within the network attached to the certificate; route: 10.0.1.0/24, network: 10.0.0.0/24")
  66. // happy case
  67. c.Settings["tun"] = map[interface{}]interface{}{"routes": []interface{}{
  68. map[interface{}]interface{}{"mtu": "9000", "route": "10.0.0.0/29"},
  69. map[interface{}]interface{}{"mtu": "8000", "route": "10.0.0.1/32"},
  70. }}
  71. routes, err = parseRoutes(c, n)
  72. assert.Nil(t, err)
  73. assert.Len(t, routes, 2)
  74. tested := 0
  75. for _, r := range routes {
  76. if r.mtu == 8000 {
  77. assert.Equal(t, "10.0.0.1/32", r.route.String())
  78. tested++
  79. } else {
  80. assert.Equal(t, 9000, r.mtu)
  81. assert.Equal(t, "10.0.0.0/29", r.route.String())
  82. tested++
  83. }
  84. }
  85. if tested != 2 {
  86. t.Fatal("Did not see both routes")
  87. }
  88. }
  89. func Test_parseUnsafeRoutes(t *testing.T) {
  90. l := NewTestLogger()
  91. c := NewConfig(l)
  92. _, n, _ := net.ParseCIDR("10.0.0.0/24")
  93. // test no routes config
  94. routes, err := parseUnsafeRoutes(c, n)
  95. assert.Nil(t, err)
  96. assert.Len(t, routes, 0)
  97. // not an array
  98. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": "hi"}
  99. routes, err = parseUnsafeRoutes(c, n)
  100. assert.Nil(t, routes)
  101. assert.EqualError(t, err, "tun.unsafe_routes is not an array")
  102. // no routes
  103. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{}}
  104. routes, err = parseUnsafeRoutes(c, n)
  105. assert.Nil(t, err)
  106. assert.Len(t, routes, 0)
  107. // weird route
  108. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{"asdf"}}
  109. routes, err = parseUnsafeRoutes(c, n)
  110. assert.Nil(t, routes)
  111. assert.EqualError(t, err, "entry 1 in tun.unsafe_routes is invalid")
  112. // no via
  113. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{}}}
  114. routes, err = parseUnsafeRoutes(c, n)
  115. assert.Nil(t, routes)
  116. assert.EqualError(t, err, "entry 1.via in tun.unsafe_routes is not present")
  117. // invalid via
  118. for _, invalidValue := range []interface{}{
  119. 127, false, nil, 1.0, []string{"1", "2"},
  120. } {
  121. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": invalidValue}}}
  122. routes, err = parseUnsafeRoutes(c, n)
  123. assert.Nil(t, routes)
  124. assert.EqualError(t, err, fmt.Sprintf("entry 1.via in tun.unsafe_routes is not a string: found %T", invalidValue))
  125. }
  126. // unparsable via
  127. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"mtu": "500", "via": "nope"}}}
  128. routes, err = parseUnsafeRoutes(c, n)
  129. assert.Nil(t, routes)
  130. assert.EqualError(t, err, "entry 1.via in tun.unsafe_routes failed to parse address: nope")
  131. // missing route
  132. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "mtu": "500"}}}
  133. routes, err = parseUnsafeRoutes(c, n)
  134. assert.Nil(t, routes)
  135. assert.EqualError(t, err, "entry 1.route in tun.unsafe_routes is not present")
  136. // unparsable route
  137. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "mtu": "500", "route": "nope"}}}
  138. routes, err = parseUnsafeRoutes(c, n)
  139. assert.Nil(t, routes)
  140. assert.EqualError(t, err, "entry 1.route in tun.unsafe_routes failed to parse: invalid CIDR address: nope")
  141. // within network range
  142. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "route": "10.0.0.0/24"}}}
  143. routes, err = parseUnsafeRoutes(c, n)
  144. assert.Nil(t, routes)
  145. assert.EqualError(t, err, "entry 1.route in tun.unsafe_routes is contained within the network attached to the certificate; route: 10.0.0.0/24, network: 10.0.0.0/24")
  146. // below network range
  147. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "route": "1.0.0.0/8"}}}
  148. routes, err = parseUnsafeRoutes(c, n)
  149. assert.Len(t, routes, 1)
  150. assert.Nil(t, err)
  151. // above network range
  152. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "route": "10.0.1.0/24"}}}
  153. routes, err = parseUnsafeRoutes(c, n)
  154. assert.Len(t, routes, 1)
  155. assert.Nil(t, err)
  156. // no mtu
  157. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "route": "1.0.0.0/8"}}}
  158. routes, err = parseUnsafeRoutes(c, n)
  159. assert.Len(t, routes, 1)
  160. assert.Equal(t, DEFAULT_MTU, routes[0].mtu)
  161. // bad mtu
  162. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "mtu": "nope"}}}
  163. routes, err = parseUnsafeRoutes(c, n)
  164. assert.Nil(t, routes)
  165. assert.EqualError(t, err, "entry 1.mtu in tun.unsafe_routes is not an integer: strconv.Atoi: parsing \"nope\": invalid syntax")
  166. // low mtu
  167. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{map[interface{}]interface{}{"via": "127.0.0.1", "mtu": "499"}}}
  168. routes, err = parseUnsafeRoutes(c, n)
  169. assert.Nil(t, routes)
  170. assert.EqualError(t, err, "entry 1.mtu in tun.unsafe_routes is below 500: 499")
  171. // happy case
  172. c.Settings["tun"] = map[interface{}]interface{}{"unsafe_routes": []interface{}{
  173. map[interface{}]interface{}{"via": "127.0.0.1", "mtu": "9000", "route": "1.0.0.0/29"},
  174. map[interface{}]interface{}{"via": "127.0.0.1", "mtu": "8000", "route": "1.0.0.1/32"},
  175. }}
  176. routes, err = parseUnsafeRoutes(c, n)
  177. assert.Nil(t, err)
  178. assert.Len(t, routes, 2)
  179. tested := 0
  180. for _, r := range routes {
  181. if r.mtu == 8000 {
  182. assert.Equal(t, "1.0.0.1/32", r.route.String())
  183. tested++
  184. } else {
  185. assert.Equal(t, 9000, r.mtu)
  186. assert.Equal(t, "1.0.0.0/29", r.route.String())
  187. tested++
  188. }
  189. }
  190. if tested != 2 {
  191. t.Fatal("Did not see both unsafe_routes")
  192. }
  193. }