install-netmaker.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #!/bin/bash
  2. set -e
  3. cat << "EOF"
  4. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  6. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  7. ______ ______ ______ __ __ __ ______ __
  8. /\ ___\ /\ == \ /\ __ \ /\ \ / / /\ \ /\__ _\ /\ \
  9. \ \ \__ \ \ \ __< \ \ __ \ \ \ \'/ \ \ \ \/_/\ \/ \ \ \____
  10. \ \_____\ \ \_\ \_\ \ \_\ \_\ \ \__| \ \_\ \ \_\ \ \_____\
  11. \/_____/ \/_/ /_/ \/_/\/_/ \/_/ \/_/ \/_/ \/_____/
  12. __ __ ______ ______ __ __ ______ __ __ ______ ______
  13. /\ "-.\ \ /\ ___\ /\__ _\ /\ "-./ \ /\ __ \ /\ \/ / /\ ___\ /\ == \
  14. \ \ \-. \ \ \ __\ \/_/\ \/ \ \ \-./\ \ \ \ __ \ \ \ _"-. \ \ __\ \ \ __<
  15. \ \_\\"\_\ \ \_____\ \ \_\ \ \_\ \ \_\ \ \_\ \_\ \ \_\ \_\ \ \_____\ \ \_\ \_\
  16. \/_/ \/_/ \/_____/ \/_/ \/_/ \/_/ \/_/\/_/ \/_/\/_/ \/_____/ \/_/ /_/
  17. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  18. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  19. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  20. EOF
  21. NETMAKER_BASE_DOMAIN=nm.$(curl -s ifconfig.me | tr . -).nip.io
  22. COREDNS_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
  23. SERVER_PUBLIC_IP=$(curl -s ifconfig.me)
  24. MASTER_KEY=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 30 ; echo '')
  25. EMAIL="[email protected]"
  26. echo "Default Base Domain: $NETMAKER_BASE_DOMAIN"
  27. echo "To Override, add a Wildcard (*.netmaker.example.com) DNS record pointing to $SERVER_PUBLIC_IP"
  28. echo "Or, add three DNS records pointing to $SERVER_PUBLIC_IP for the following (Replacing 'netmaker.example.com' with the domain of your choice):"
  29. echo " dashboard.netmaker.example.com"
  30. echo " api.netmaker.example.com"
  31. echo "-----------------------------------------------------"
  32. read -p "Domain (Hit 'enter' to use $NETMAKER_BASE_DOMAIN): " domain
  33. read -p "Contact Email: " email
  34. if [ -n "$domain" ]; then
  35. NETMAKER_BASE_DOMAIN=$domain
  36. fi
  37. if [ -n "$email" ]; then
  38. EMAIL=$email
  39. fi
  40. while true; do
  41. read -p "Configure a default network automatically (y/n)? " yn
  42. case $yn in
  43. [Yy]* ) MESH_SETUP="true"; break;;
  44. [Nn]* ) MESH_SETUP="false"; break;;
  45. * ) echo "Please answer yes or no.";;
  46. esac
  47. done
  48. while true; do
  49. read -p "Configure a VPN gateway automatically (y/n)? " yn
  50. case $yn in
  51. [Yy]* ) VPN_SETUP="true"; break;;
  52. [Nn]* ) VPN_SETUP="false"; break;;
  53. * ) echo "Please answer yes or no.";;
  54. esac
  55. done
  56. if [ "${VPN_SETUP}" == "true" ]; then
  57. while :; do
  58. read -ep '# of VPN clients to configure by default: ' num_clients
  59. [[ $num_clients =~ ^[[:digit:]]+$ ]] || continue
  60. (( ( (num_clients=(10#$num_clients)) <= 200 ) && num_clients >= 0 )) || continue
  61. break
  62. done
  63. fi
  64. if [ -n "$num_clients" ]; then
  65. NUM_CLIENTS=$num_clients
  66. fi
  67. while true; do
  68. read -p "Override master key ($MASTER_KEY) (y/n)? " yn
  69. case $yn in
  70. [Yy]* ) override="true"; break;;
  71. [Nn]* ) override="false"; break;;
  72. * ) echo "Please answer yes or no.";;
  73. esac
  74. done
  75. if [ "${override}" == "true" ]; then
  76. while :; do
  77. read -ep 'New Master Key: ' key
  78. result="$(cracklib-check <<<"$key")"
  79. okay="$(awk -F': ' '{ print $2}' <<<"$result")"
  80. if [[ "$okay" == "OK" ]]
  81. then
  82. MASTER_KEY=$key
  83. break
  84. else
  85. echo "Your password was rejected - $result"
  86. echo "Try again."
  87. fi
  88. done
  89. fi
  90. echo "-----------------------------------------------------------------"
  91. echo " SETUP ARGUMENTS"
  92. echo "-----------------------------------------------------------------"
  93. echo " domain: $NETMAKER_BASE_DOMAIN"
  94. echo " email: $EMAIL"
  95. echo " coredns ip: $COREDNS_IP"
  96. echo " public ip: $SERVER_PUBLIC_IP"
  97. echo " master key: $MASTER_KEY"
  98. echo " setup mesh?: $MESH_SETUP"
  99. echo " setup vpn?: $VPN_SETUP"
  100. if [ "${VPN_SETUP}" == "true" ]; then
  101. echo " # clients: $NUM_CLIENTS"
  102. fi
  103. while true; do
  104. read -p "Does everything look right (y/n)? " yn
  105. case $yn in
  106. [Yy]* ) override="true"; break;;
  107. [Nn]* ) echo "exiting..."; exit;;
  108. * ) echo "Please answer yes or no.";;
  109. esac
  110. done
  111. echo "Beginning installation in 5 seconds..."
  112. sleep 5
  113. echo "Setting Caddyfile..."
  114. sed -i "s/NETMAKER_BASE_DOMAIN/$NETMAKER_BASE_DOMAIN/g" /root/Caddyfile
  115. sed -i "s/YOUR_EMAIL/$EMAIL/g" /root/Caddyfile
  116. echo "Setting docker-compose..."
  117. sed -i "s/NETMAKER_BASE_DOMAIN/$NETMAKER_BASE_DOMAIN/g" /root/docker-compose.yml
  118. sed -i "s/SERVER_PUBLIC_IP/$SERVER_PUBLIC_IP/g" /root/docker-compose.yml
  119. sed -i "s/COREDNS_IP/$COREDNS_IP/g" /root/docker-compose.yml
  120. sed -i "s/REPLACE_MASTER_KEY/$MASTER_KEY/g" /root/docker-compose.yml
  121. echo "Starting containers..."
  122. docker-compose -f /root/docker-compose.yml up -d
  123. sleep 2
  124. setup_mesh() {
  125. echo "Creating default network (10.101.0.0/16)..."
  126. curl -s -o /dev/null -d '{"addressrange":"10.101.0.0/16","netid":"default"}' -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/networks
  127. sleep 2
  128. echo "Creating default key..."
  129. curlresponse=$(curl -s -d '{"uses":99999,"name":"defaultkey"}' -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/networks/default/keys)
  130. ACCESS_TOKEN=$(jq -r '.accessstring' <<< ${curlresponse})
  131. sleep 2
  132. echo "Configuring Netmaker server as ingress gateway..."
  133. curlresponse=$(curl -s -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/default)
  134. SERVER_ID=$(jq -r '.[0].macaddress' <<< ${curlresponse})
  135. curl -o /dev/null -s -X POST -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/default/$SERVER_ID/createingress
  136. VPN_ACCESS_TOKEN=$ACCESS_TOKEN
  137. }
  138. mesh_connect_logs() {
  139. sleep 5
  140. echo "-----------------------------------------------------------------"
  141. echo "-----------------------------------------------------------------"
  142. echo "DEFAULT NETWORK CLIENT INSTALL INSTRUCTIONS:"
  143. echo "-----------------------------------------------------------------"
  144. echo "-----------------------------------------------------------------"
  145. sleep 5
  146. echo "For Linux and Mac clients, install with the following command:"
  147. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  148. echo "curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | sudo KEY=$VPN_ACCESS_TOKEN sh -"
  149. sleep 5
  150. echo "-----------------------------------------------------------------"
  151. echo "-----------------------------------------------------------------"
  152. echo "For Windows clients, perform the following from powershell, as administrator:"
  153. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  154. echo "1. Make sure WireGuardNT is installed - https://download.wireguard.com/windows-client/wireguard-installer.exe"
  155. echo "2. Download netclient.exe - wget https://github.com/gravitl/netmaker/releases/download/latest/netclient.exe"
  156. echo "3. Install Netclient - powershell.exe .\\netclient.exe join -t $VPN_ACCESS_TOKEN"
  157. echo "4. Whitelist C:\ProgramData\Netclient in Windows Defender"
  158. sleep 5
  159. echo "-----------------------------------------------------------------"
  160. echo "-----------------------------------------------------------------"
  161. echo "For Android and iOS clients, perform the following steps:"
  162. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  163. echo "1. Log into UI at dashboard.$NETMAKER_BASE_DOMAIN"
  164. echo "2. Navigate to \"EXTERNAL CLIENTS\" tab"
  165. echo "3. Select the gateway and create clients"
  166. echo "4. Scan the QR Code from WireGuard app in iOS or Android"
  167. echo "-----------------------------------------------------------------"
  168. echo "-----------------------------------------------------------------"
  169. sleep 5
  170. }
  171. setup_vpn() {
  172. echo "Creating vpn network (10.201.0.0/16)..."
  173. curl -s -o /dev/null -d '{"addressrange":"10.201.0.0/16","netid":"vpn","defaultextclientdns":"8.8.8.8"}' -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/networks
  174. sleep 2
  175. echo "Configuring Netmaker server as vpn inlet..."
  176. curlresponse=$(curl -s -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/vpn)
  177. SERVER_ID=$(jq -r '.[0].macaddress' <<< ${curlresponse})
  178. curl -s -o /dev/null -X POST -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/vpn/$SERVER_ID/createingress
  179. echo "Waiting 10 seconds for server to apply configuration..."
  180. sleep 10
  181. echo "Configuring Netmaker server VPN gateway..."
  182. [ -z "$GATEWAY_IFACE" ] && GATEWAY_IFACE=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | grep -v default)
  183. curlresponse=$(curl -s -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/vpn)
  184. SERVER_ID=$(jq -r '.[0].macaddress' <<< ${curlresponse})
  185. EGRESS_JSON=$( jq -n \
  186. --arg gw "$GATEWAY_IFACE" \
  187. '{ranges: ["0.0.0.0/0"], interface: $gw}' )
  188. curl -s -o /dev/null -X POST -d "$EGRESS_JSON" -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/vpn/$SERVER_ID/creategateway
  189. echo "Creating client configs..."
  190. for ((a=1; a <= $NUM_CLIENTS; a++))
  191. do
  192. CLIENT_JSON=$( jq -n \
  193. --arg clientid "vpnclient-$a" \
  194. '{clientid: $clientid}' )
  195. curl -s -o /dev/null -d "$CLIENT_JSON" -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/extclients/vpn/$SERVER_ID
  196. done
  197. }
  198. vpn_connect_logs() {
  199. sleep 5
  200. echo "-----------------------------------------------------------------"
  201. echo "-----------------------------------------------------------------"
  202. echo "VPN GATEWAY CLIENT INSTALL INSTRUCTIONS:"
  203. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  204. echo "1. log into dashboard.$NETMAKER_BASE_DOMAIN"
  205. echo "2. Navigate to \"EXTERNAL CLIENTS\" tab"
  206. echo "3. Download or scan a client config (vpnclient-x) to the appropriate device"
  207. echo "4. Follow the steps for your system to configure WireGuard on the appropriate device"
  208. echo "5. Create and delete clients as necessary. Changes to netmaker server settings require regenerating ext clients."
  209. echo "-----------------------------------------------------------------"
  210. echo "-----------------------------------------------------------------"
  211. sleep 5
  212. }
  213. if [ "${MESH_SETUP}" != "false" ]; then
  214. setup_mesh
  215. fi
  216. if [ "${VPN_SETUP}" == "true" ]; then
  217. setup_vpn
  218. fi
  219. if [ "${MESH_SETUP}" != "false" ]; then
  220. mesh_connect_logs
  221. fi
  222. if [ "${VPN_SETUP}" == "true" ]; then
  223. vpn_connect_logs
  224. fi
  225. echo "Netmaker setup is now complete. You are ready to begin using Netmaker."
  226. echo "Visit dashboard.$NETMAKER_BASE_DOMAIN to log in"
  227. cp -f /etc/skel/.bashrc /root/.bashrc