install-netmaker.sh 11 KB

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