tun_test.go 8.5 KB

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