install-netmaker.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  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 docker-compose..."
  118. sed -i "s/NETMAKER_BASE_DOMAIN/$NETMAKER_BASE_DOMAIN/g" /root/docker-compose.yml
  119. sed -i "s/SERVER_PUBLIC_IP/$SERVER_PUBLIC_IP/g" /root/docker-compose.yml
  120. sed -i "s/COREDNS_IP/$COREDNS_IP/g" /root/docker-compose.yml
  121. sed -i "s/REPLACE_MASTER_KEY/$MASTER_KEY/g" /root/docker-compose.yml
  122. echo "Starting containers..."
  123. docker-compose -f /root/docker-compose.yml up -d
  124. sleep 2
  125. setup_mesh() {
  126. echo "Creating default network (10.101.0.0/16)..."
  127. 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
  128. sleep 2
  129. echo "Creating default key..."
  130. curlresponse=$(curl -s -d '{"uses":99999,"name":"defaultkey"}' -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/networks/default/keys)
  131. ACCESS_TOKEN=$(jq -r '.accessstring' <<< ${curlresponse})
  132. sleep 2
  133. echo "Configuring Netmaker server as ingress gateway..."
  134. curlresponse=$(curl -s -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/default)
  135. SERVER_ID=$(jq -r '.[0].macaddress' <<< ${curlresponse})
  136. 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
  137. VPN_ACCESS_TOKEN=$ACCESS_TOKEN
  138. }
  139. mesh_connect_logs() {
  140. sleep 5
  141. echo "-----------------------------------------------------------------"
  142. echo "-----------------------------------------------------------------"
  143. echo "DEFAULT NETWORK CLIENT INSTALL INSTRUCTIONS:"
  144. echo "-----------------------------------------------------------------"
  145. echo "-----------------------------------------------------------------"
  146. sleep 5
  147. echo "For Linux and Mac clients, install with the following command:"
  148. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  149. echo "curl -sfL https://raw.githubusercontent.com/gravitl/netmaker/develop/scripts/netclient-install.sh | sudo KEY=$VPN_ACCESS_TOKEN sh -"
  150. sleep 5
  151. echo "-----------------------------------------------------------------"
  152. echo "-----------------------------------------------------------------"
  153. echo "For Windows clients, perform the following from powershell, as administrator:"
  154. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  155. echo "1. Make sure WireGuardNT is installed - https://download.wireguard.com/windows-client/wireguard-installer.exe"
  156. echo "2. Download netclient.exe - wget https://github.com/gravitl/netmaker/releases/download/latest/netclient.exe"
  157. echo "3. Install Netclient - powershell.exe .\\netclient.exe join -t $VPN_ACCESS_TOKEN"
  158. echo "4. Whitelist C:\ProgramData\Netclient in Windows Defender"
  159. sleep 5
  160. echo "-----------------------------------------------------------------"
  161. echo "-----------------------------------------------------------------"
  162. echo "For Android and iOS clients, perform the following steps:"
  163. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  164. echo "1. Log into UI at dashboard.$NETMAKER_BASE_DOMAIN"
  165. echo "2. Navigate to \"EXTERNAL CLIENTS\" tab"
  166. echo "3. Select the gateway and create clients"
  167. echo "4. Scan the QR Code from WireGuard app in iOS or Android"
  168. echo "-----------------------------------------------------------------"
  169. echo "-----------------------------------------------------------------"
  170. sleep 5
  171. }
  172. setup_vpn() {
  173. echo "Creating vpn network (10.201.0.0/16)..."
  174. 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
  175. sleep 2
  176. echo "Configuring Netmaker server as vpn inlet..."
  177. curlresponse=$(curl -s -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/vpn)
  178. SERVER_ID=$(jq -r '.[0].macaddress' <<< ${curlresponse})
  179. 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
  180. echo "Waiting 10 seconds for server to apply configuration..."
  181. sleep 10
  182. echo "Configuring Netmaker server VPN gateway..."
  183. [ -z "$GATEWAY_IFACE" ] && GATEWAY_IFACE=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | grep -v default)
  184. curlresponse=$(curl -s -H "Authorization: Bearer $MASTER_KEY" -H 'Content-Type: application/json' localhost:8081/api/nodes/vpn)
  185. SERVER_ID=$(jq -r '.[0].macaddress' <<< ${curlresponse})
  186. EGRESS_JSON=$( jq -n \
  187. --arg gw "$GATEWAY_IFACE" \
  188. '{ranges: ["0.0.0.0/0"], interface: $gw}' )
  189. 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
  190. echo "Creating client configs..."
  191. for ((a=1; a <= $NUM_CLIENTS; a++))
  192. do
  193. CLIENT_JSON=$( jq -n \
  194. --arg clientid "vpnclient-$a" \
  195. '{clientid: $clientid}' )
  196. 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
  197. done
  198. }
  199. vpn_connect_logs() {
  200. sleep 5
  201. echo "-----------------------------------------------------------------"
  202. echo "-----------------------------------------------------------------"
  203. echo "VPN GATEWAY CLIENT INSTALL INSTRUCTIONS:"
  204. echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
  205. echo "1. log into dashboard.$NETMAKER_BASE_DOMAIN"
  206. echo "2. Navigate to \"EXTERNAL CLIENTS\" tab"
  207. echo "3. Download or scan a client config (vpnclient-x) to the appropriate device"
  208. echo "4. Follow the steps for your system to configure WireGuard on the appropriate device"
  209. echo "5. Create and delete clients as necessary. Changes to netmaker server settings require regenerating ext clients."
  210. echo "-----------------------------------------------------------------"
  211. echo "-----------------------------------------------------------------"
  212. sleep 5
  213. }
  214. if [ "${MESH_SETUP}" != "false" ]; then
  215. setup_mesh
  216. fi
  217. if [ "${VPN_SETUP}" == "true" ]; then
  218. setup_vpn
  219. fi
  220. if [ "${MESH_SETUP}" != "false" ]; then
  221. mesh_connect_logs
  222. fi
  223. if [ "${VPN_SETUP}" == "true" ]; then
  224. vpn_connect_logs
  225. fi
  226. echo "Netmaker setup is now complete. You are ready to begin using Netmaker."
  227. echo "Visit dashboard.$NETMAKER_BASE_DOMAIN to log in"
  228. cp -f /etc/skel/.bashrc /root/.bashrc