smoke-vagrant.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #!/bin/bash
  2. set -e -x
  3. set -o pipefail
  4. export VAGRANT_CWD="$PWD/vagrant-$1"
  5. mkdir -p logs
  6. NETWORK="nebula-smoke"
  7. cleanup() {
  8. echo
  9. echo " *** cleanup"
  10. echo
  11. set +e
  12. if [ "$(jobs -r)" ]
  13. then
  14. docker kill lighthouse1 host2
  15. fi
  16. vagrant destroy -f
  17. docker network rm "$NETWORK" >/dev/null 2>&1
  18. }
  19. trap cleanup EXIT
  20. # Create a dedicated smoke network with an explicit subnet (required for --ip
  21. # below). Probe a short list of candidates so a locally-used range doesn't
  22. # fail the whole test — we only need one to be free.
  23. docker network rm "$NETWORK" >/dev/null 2>&1 || true
  24. for candidate in 172.30.0.0/24 172.31.0.0/24 10.98.0.0/24 10.99.0.0/24 192.168.230.0/24; do
  25. if docker network create --subnet "$candidate" "$NETWORK" >/dev/null 2>&1; then
  26. break
  27. fi
  28. done
  29. if ! docker network inspect "$NETWORK" >/dev/null 2>&1; then
  30. echo "failed to create $NETWORK: every candidate subnet is in use" >&2
  31. exit 1
  32. fi
  33. # Derive container IPs from the network's assigned subnet. Slots: .2 lighthouse1,
  34. # .3 host2 — matches the placeholders in build.sh.
  35. SUBNET="$(docker network inspect -f '{{(index .IPAM.Config 0).Subnet}}' "$NETWORK")"
  36. PREFIX="${SUBNET%/*}"
  37. PREFIX="${PREFIX%.*}"
  38. LIGHTHOUSE_IP="$PREFIX.2"
  39. HOST2_IP="$PREFIX.3"
  40. # Sed the placeholder TEST-NET-3 IPs in the host configs to the real ones.
  41. # This must happen before `vagrant up` rsyncs build/ into the VM for host3.
  42. for f in build/host2.yml build/host3.yml; do
  43. sed "s|203\.0\.113\.|$PREFIX.|g" "$f" >"$f.tmp"
  44. mv "$f.tmp" "$f"
  45. done
  46. CONTAINER="nebula:${NAME:-smoke}"
  47. docker run --name lighthouse1 --rm "$CONTAINER" -config lighthouse1.yml -test
  48. docker run --name host2 --rm -v "$PWD/build/host2.yml:/nebula/host2.yml:ro" "$CONTAINER" -config host2.yml -test
  49. vagrant up
  50. vagrant ssh -c "cd /nebula && /nebula/$1-nebula -config host3.yml -test" -- -T
  51. docker run --name lighthouse1 --network "$NETWORK" --ip "$LIGHTHOUSE_IP" --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] /' &
  52. sleep 1
  53. docker run --name host2 --network "$NETWORK" --ip "$HOST2_IP" -v "$PWD/build/host2.yml:/nebula/host2.yml:ro" --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] /' &
  54. sleep 1
  55. vagrant ssh -c "cd /nebula && sudo sh -c 'echo \$\$ >/nebula/pid && exec /nebula/$1-nebula -config host3.yml'" 2>&1 -- -T | tee logs/host3 | sed -u 's/^/ [host3] /' &
  56. sleep 15
  57. # grab tcpdump pcaps for debugging
  58. docker exec lighthouse1 tcpdump -i nebula1 -q -w - -U 2>logs/lighthouse1.inside.log >logs/lighthouse1.inside.pcap &
  59. docker exec lighthouse1 tcpdump -i eth0 -q -w - -U 2>logs/lighthouse1.outside.log >logs/lighthouse1.outside.pcap &
  60. docker exec host2 tcpdump -i nebula1 -q -w - -U 2>logs/host2.inside.log >logs/host2.inside.pcap &
  61. docker exec host2 tcpdump -i eth0 -q -w - -U 2>logs/host2.outside.log >logs/host2.outside.pcap &
  62. # vagrant ssh -c "tcpdump -i nebula1 -q -w - -U" 2>logs/host3.inside.log >logs/host3.inside.pcap &
  63. # vagrant ssh -c "tcpdump -i eth0 -q -w - -U" 2>logs/host3.outside.log >logs/host3.outside.pcap &
  64. #docker exec host2 ncat -nklv 0.0.0.0 2000 &
  65. #vagrant ssh -c "ncat -nklv 0.0.0.0 2000" &
  66. #docker exec host2 ncat -e '/usr/bin/echo host2' -nkluv 0.0.0.0 3000 &
  67. #vagrant ssh -c "ncat -e '/usr/bin/echo host3' -nkluv 0.0.0.0 3000" &
  68. set +x
  69. echo
  70. echo " *** Testing ping from lighthouse1"
  71. echo
  72. set -x
  73. docker exec lighthouse1 ping -c1 192.168.100.2
  74. docker exec lighthouse1 ping -c1 192.168.100.3
  75. set +x
  76. echo
  77. echo " *** Testing ping from host2"
  78. echo
  79. set -x
  80. docker exec host2 ping -c1 192.168.100.1
  81. # Should fail because not allowed by host3 inbound firewall
  82. ! docker exec host2 ping -c1 192.168.100.3 -w5 || exit 1
  83. #set +x
  84. #echo
  85. #echo " *** Testing ncat from host2"
  86. #echo
  87. #set -x
  88. # Should fail because not allowed by host3 inbound firewall
  89. #! docker exec host2 ncat -nzv -w5 192.168.100.3 2000 || exit 1
  90. #! docker exec host2 ncat -nzuv -w5 192.168.100.3 3000 | grep -q host3 || exit 1
  91. set +x
  92. echo
  93. echo " *** Testing ping from host3"
  94. echo
  95. set -x
  96. vagrant ssh -c "ping -c1 192.168.100.1" -- -T
  97. vagrant ssh -c "ping -c1 192.168.100.2" -- -T
  98. #set +x
  99. #echo
  100. #echo " *** Testing ncat from host3"
  101. #echo
  102. #set -x
  103. #vagrant ssh -c "ncat -nzv -w5 192.168.100.2 2000"
  104. #vagrant ssh -c "ncat -nzuv -w5 192.168.100.2 3000" | grep -q host2
  105. vagrant ssh -c "sudo xargs kill </nebula/pid" -- -T
  106. docker exec host2 sh -c 'kill 1'
  107. docker exec lighthouse1 sh -c 'kill 1'
  108. # Wait up to 30s for all backgrounded jobs to exit. vagrant ssh in particular
  109. # takes a beat to tear down after nebula exits on the VM, so a fixed sleep is
  110. # racy.
  111. for _ in $(seq 1 30); do
  112. [ -z "$(jobs -r)" ] && break
  113. sleep 1
  114. done
  115. if [ "$(jobs -r)" ]
  116. then
  117. echo "nebula still running after SIGTERM sent" >&2
  118. exit 1
  119. fi