outside_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package nebula
  2. import (
  3. "net"
  4. "net/netip"
  5. "testing"
  6. "github.com/slackhq/nebula/firewall"
  7. "github.com/stretchr/testify/assert"
  8. "golang.org/x/net/ipv4"
  9. )
  10. func Test_newPacket(t *testing.T) {
  11. p := &firewall.Packet{}
  12. // length fail
  13. err := newPacket([]byte{0, 1}, true, p)
  14. assert.EqualError(t, err, "packet is less than 20 bytes")
  15. // length fail with ip options
  16. h := ipv4.Header{
  17. Version: 1,
  18. Len: 100,
  19. Src: net.IPv4(10, 0, 0, 1),
  20. Dst: net.IPv4(10, 0, 0, 2),
  21. Options: []byte{0, 1, 0, 2},
  22. }
  23. b, _ := h.Marshal()
  24. err = newPacket(b, true, p)
  25. assert.EqualError(t, err, "packet is less than 28 bytes, ip header len: 24")
  26. // not an ipv4 packet
  27. err = newPacket([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, true, p)
  28. assert.EqualError(t, err, "packet is not ipv4, type: 0")
  29. // invalid ihl
  30. err = newPacket([]byte{4<<4 | (8 >> 2 & 0x0f), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, true, p)
  31. assert.EqualError(t, err, "packet had an invalid header length: 8")
  32. // account for variable ip header length - incoming
  33. h = ipv4.Header{
  34. Version: 1,
  35. Len: 100,
  36. Src: net.IPv4(10, 0, 0, 1),
  37. Dst: net.IPv4(10, 0, 0, 2),
  38. Options: []byte{0, 1, 0, 2},
  39. Protocol: firewall.ProtoTCP,
  40. }
  41. b, _ = h.Marshal()
  42. b = append(b, []byte{0, 3, 0, 4}...)
  43. err = newPacket(b, true, p)
  44. assert.Nil(t, err)
  45. assert.Equal(t, p.Protocol, uint8(firewall.ProtoTCP))
  46. assert.Equal(t, p.LocalIP, netip.MustParseAddr("10.0.0.2"))
  47. assert.Equal(t, p.RemoteIP, netip.MustParseAddr("10.0.0.1"))
  48. assert.Equal(t, p.RemotePort, uint16(3))
  49. assert.Equal(t, p.LocalPort, uint16(4))
  50. // account for variable ip header length - outgoing
  51. h = ipv4.Header{
  52. Version: 1,
  53. Protocol: 2,
  54. Len: 100,
  55. Src: net.IPv4(10, 0, 0, 1),
  56. Dst: net.IPv4(10, 0, 0, 2),
  57. Options: []byte{0, 1, 0, 2},
  58. }
  59. b, _ = h.Marshal()
  60. b = append(b, []byte{0, 5, 0, 6}...)
  61. err = newPacket(b, false, p)
  62. assert.Nil(t, err)
  63. assert.Equal(t, p.Protocol, uint8(2))
  64. assert.Equal(t, p.LocalIP, netip.MustParseAddr("10.0.0.1"))
  65. assert.Equal(t, p.RemoteIP, netip.MustParseAddr("10.0.0.2"))
  66. assert.Equal(t, p.RemotePort, uint16(6))
  67. assert.Equal(t, p.LocalPort, uint16(5))
  68. }