smoke.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/bin/bash
  2. set -e -x
  3. set -o pipefail
  4. mkdir -p logs
  5. cleanup() {
  6. echo
  7. echo " *** cleanup"
  8. echo
  9. set +e
  10. if [ "$(jobs -r)" ]
  11. then
  12. docker kill lighthouse1 host2 host3 host4
  13. fi
  14. }
  15. trap cleanup EXIT
  16. CONTAINER="nebula:${NAME:-smoke}"
  17. docker run --name lighthouse1 --rm "$CONTAINER" -config lighthouse1.yml -test
  18. docker run --name host2 --rm "$CONTAINER" -config host2.yml -test
  19. docker run --name host3 --rm "$CONTAINER" -config host3.yml -test
  20. docker run --name host4 --rm "$CONTAINER" -config host4.yml -test
  21. docker run --name lighthouse1 --device /dev/net/tun:/dev/net/tun --cap-add NET_ADMIN --rm "$CONTAINER" -config lighthouse1.yml 2>&1 | tee logs/lighthouse1 | sed -u 's/^/ [lighthouse1] /' &
  22. sleep 1
  23. docker run --name host2 --device /dev/net/tun:/dev/net/tun --cap-add NET_ADMIN --rm "$CONTAINER" -config host2.yml 2>&1 | tee logs/host2 | sed -u 's/^/ [host2] /' &
  24. sleep 1
  25. docker run --name host3 --device /dev/net/tun:/dev/net/tun --cap-add NET_ADMIN --rm "$CONTAINER" -config host3.yml 2>&1 | tee logs/host3 | sed -u 's/^/ [host3] /' &
  26. sleep 1
  27. docker run --name host4 --device /dev/net/tun:/dev/net/tun --cap-add NET_ADMIN --rm "$CONTAINER" -config host4.yml 2>&1 | tee logs/host4 | sed -u 's/^/ [host4] /' &
  28. sleep 1
  29. # grab tcpdump pcaps for debugging
  30. docker exec lighthouse1 tcpdump -i tun0 -q -w - -U 2>logs/lighthouse1.inside.log >logs/lighthouse1.inside.pcap &
  31. docker exec lighthouse1 tcpdump -i eth0 -q -w - -U 2>logs/lighthouse1.outside.log >logs/lighthouse1.outside.pcap &
  32. docker exec host2 tcpdump -i tun0 -q -w - -U 2>logs/host2.inside.log >logs/host2.inside.pcap &
  33. docker exec host2 tcpdump -i eth0 -q -w - -U 2>logs/host2.outside.log >logs/host2.outside.pcap &
  34. docker exec host3 tcpdump -i tun0 -q -w - -U 2>logs/host3.inside.log >logs/host3.inside.pcap &
  35. docker exec host3 tcpdump -i eth0 -q -w - -U 2>logs/host3.outside.log >logs/host3.outside.pcap &
  36. docker exec host4 tcpdump -i tun0 -q -w - -U 2>logs/host4.inside.log >logs/host4.inside.pcap &
  37. docker exec host4 tcpdump -i eth0 -q -w - -U 2>logs/host4.outside.log >logs/host4.outside.pcap &
  38. docker exec host2 ncat -nklv 0.0.0.0 2000 &
  39. docker exec host3 ncat -nklv 0.0.0.0 2000 &
  40. docker exec host4 ncat -nkluv 0.0.0.0 4000 &
  41. docker exec host2 ncat -e '/usr/bin/echo host2' -nkluv 0.0.0.0 3000 &
  42. docker exec host3 ncat -e '/usr/bin/echo host3' -nkluv 0.0.0.0 3000 &
  43. set +x
  44. echo
  45. echo " *** Testing ping from lighthouse1"
  46. echo
  47. set -x
  48. docker exec lighthouse1 ping -c1 192.168.100.2
  49. docker exec lighthouse1 ping -c1 192.168.100.3
  50. set +x
  51. echo
  52. echo " *** Testing ping from host2"
  53. echo
  54. set -x
  55. docker exec host2 ping -c1 192.168.100.1
  56. # Should fail because not allowed by host3 inbound firewall
  57. ! docker exec host2 ping -c1 192.168.100.3 -w5 || exit 1
  58. set +x
  59. echo
  60. echo " *** Testing ncat from host2"
  61. echo
  62. set -x
  63. # Should fail because not allowed by host3 inbound firewall
  64. ! docker exec host2 ncat -nzv -w5 192.168.100.3 2000 || exit 1
  65. ! docker exec host2 ncat -nzuv -w5 192.168.100.3 3000 | grep -q host3 || exit 1
  66. set +x
  67. echo
  68. echo " *** Testing ping from host3"
  69. echo
  70. set -x
  71. docker exec host3 ping -c1 192.168.100.1
  72. docker exec host3 ping -c1 192.168.100.2
  73. set +x
  74. echo
  75. echo " *** Testing ncat from host3"
  76. echo
  77. set -x
  78. docker exec host3 ncat -nzv -w5 192.168.100.2 2000
  79. docker exec host3 ncat -nzuv -w5 192.168.100.2 3000 | grep -q host2
  80. set +x
  81. echo
  82. echo " *** Testing ping from host4"
  83. echo
  84. set -x
  85. docker exec host4 ping -c1 192.168.100.1
  86. # Should fail because not allowed by host4 outbound firewall
  87. ! docker exec host4 ping -c1 192.168.100.2 -w5 || exit 1
  88. ! docker exec host4 ping -c1 192.168.100.3 -w5 || exit 1
  89. set +x
  90. echo
  91. echo " *** Testing ncat from host4"
  92. echo
  93. set -x
  94. # Should fail because not allowed by host4 outbound firewall
  95. ! docker exec host4 ncat -nzv -w5 192.168.100.2 2000 || exit 1
  96. ! docker exec host4 ncat -nzv -w5 192.168.100.3 2000 || exit 1
  97. ! docker exec host4 ncat -nzuv -w5 192.168.100.2 3000 | grep -q host2 || exit 1
  98. ! docker exec host4 ncat -nzuv -w5 192.168.100.3 3000 | grep -q host3 || exit 1
  99. set +x
  100. echo
  101. echo " *** Testing conntrack"
  102. echo
  103. set -x
  104. # host2 speaking to host4 on UDP 4000 should allow it to reply, when firewall rules would normally not permit this
  105. docker exec host2 sh -c "/usr/bin/echo host2 | ncat -nuv 192.168.100.4 4000"
  106. docker exec host2 ncat -e '/usr/bin/echo helloagainfromhost2' -nkluv 0.0.0.0 4000 &
  107. docker exec host4 sh -c "/usr/bin/echo host4 | ncat -nuv 192.168.100.2 4000"
  108. docker exec host4 sh -c 'kill 1'
  109. docker exec host3 sh -c 'kill 1'
  110. docker exec host2 sh -c 'kill 1'
  111. docker exec lighthouse1 sh -c 'kill 1'
  112. sleep 5
  113. if [ "$(jobs -r)" ]
  114. then
  115. echo "nebula still running after SIGTERM sent" >&2
  116. exit 1
  117. fi