freedombone-app-vpn 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # VPN functions
  12. # https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-debian-8
  13. # https://jamielinux.com/blog/force-all-network-traffic-through-openvpn-using-iptables/
  14. #
  15. # License
  16. # =======
  17. #
  18. # Copyright (C) 2014-2017 Bob Mottram <bob@freedombone.net>
  19. #
  20. # This program is free software: you can redistribute it and/or modify
  21. # it under the terms of the GNU Affero General Public License as published by
  22. # the Free Software Foundation, either version 3 of the License, or
  23. # (at your option) any later version.
  24. #
  25. # This program is distributed in the hope that it will be useful,
  26. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. # GNU Affero General Public License for more details.
  29. #
  30. # You should have received a copy of the GNU Affero General Public License
  31. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  32. VARIANTS='full full-vim'
  33. IN_DEFAULT_INSTALL=0
  34. SHOW_ON_ABOUT=0
  35. OPENVPN_SERVER_NAME="${PROJECT_NAME}-vpn"
  36. OPENVPN_KEY_FILENAME='vpn.ovpn'
  37. vpn_variables=(MY_EMAIL_ADDRESS
  38. MY_USERNAME)
  39. function logging_on_vpn {
  40. echo -n ''
  41. }
  42. function logging_off_vpn {
  43. echo -n ''
  44. }
  45. function install_interactive_vpn {
  46. echo -n ''
  47. APP_INSTALLED=1
  48. }
  49. function reconfigure_vpn {
  50. echo -n ''
  51. }
  52. function upgrade_vpn {
  53. echo -n ''
  54. }
  55. function backup_local_vpn {
  56. for d in /home/*/ ; do
  57. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  58. if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
  59. cp /home/$USERNAME/$OPENVPN_KEY_FILENAME /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}
  60. fi
  61. done
  62. function_check backup_directory_to_usb
  63. backup_directory_to_usb /etc/openvpn/easy-rsa/keys vpn
  64. }
  65. function restore_local_vpn {
  66. temp_restore_dir=/root/tempvpn
  67. restore_directory_from_usb $temp_restore_dir vpn
  68. if [ -d ${temp_restore_dir} ]; then
  69. cp -r ${temp_restore_dir}/* /etc/openvpn/easy-rsa/keys
  70. rm -rf ${temp_restore_dir}
  71. for d in /home/*/ ; do
  72. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  73. if [ -f /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} ]; then
  74. cp /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} /home/$USERNAME/$OPENVPN_KEY_FILENAME
  75. chown $USERNAME:$USERNAME /home/$USERNAME/$OPENVPN_KEY_FILENAME
  76. fi
  77. done
  78. fi
  79. }
  80. function backup_remote_vpn {
  81. for d in /home/*/ ; do
  82. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  83. if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
  84. cp /home/$USERNAME/$OPENVPN_KEY_FILENAME /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}
  85. fi
  86. done
  87. function_check backup_directory_to_friend
  88. backup_directory_to_friend /etc/openvpn/easy-rsa/keys vpn
  89. }
  90. function restore_remote_vpn {
  91. temp_restore_dir=/root/tempvpn
  92. restore_directory_from_friend $temp_restore_dir vpn
  93. if [ -d ${temp_restore_dir} ]; then
  94. cp -r ${temp_restore_dir}/* /etc/openvpn/easy-rsa/keys
  95. rm -rf ${temp_restore_dir}
  96. for d in /home/*/ ; do
  97. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  98. if [ -f /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} ]; then
  99. cp /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} /home/$USERNAME/$OPENVPN_KEY_FILENAME
  100. chown $USERNAME:$USERNAME /home/$USERNAME/$OPENVPN_KEY_FILENAME
  101. fi
  102. done
  103. fi
  104. }
  105. function remove_vpn {
  106. systemctl stop openvpn
  107. apt-get -yq remove --purge fastd openvpn easy-rsa
  108. if [ -d /etc/openvpn ]; then
  109. rm -rf /etc/openvpn
  110. fi
  111. firewall_disable_vpn
  112. echo 0 > /proc/sys/net/ipv4/ip_forward
  113. sed -i 's|net.ipv4.ip_forward=.*|net.ipv4.ip_forward=0|g' /etc/sysctl.conf
  114. remove_completion_param install_vpn
  115. # remove any client keys
  116. for d in /home/*/ ; do
  117. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  118. if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
  119. shred -zu /home/$USERNAME/$OPENVPN_KEY_FILENAME
  120. fi
  121. done
  122. }
  123. function create_user_vpn_key {
  124. username=$1
  125. if [ ! -d /home/$username ]; then
  126. return
  127. fi
  128. echo $"Creating VPN key for $username"
  129. cd /etc/openvpn/easy-rsa
  130. echo '
  131. y
  132. y
  133. ' | ./build-key "$username"
  134. if [ ! -f /etc/openvpn/easy-rsa/keys/$username.crt ]; then
  135. echo $'VPN user cert not generated'
  136. exit 783528
  137. fi
  138. if [ ! -f /etc/openvpn/easy-rsa/keys/$username.key ]; then
  139. echo $'VPN user key not generated'
  140. exit 682523
  141. fi
  142. user_vpn_cert_file=/home/$username/$OPENVPN_KEY_FILENAME
  143. if [ ! -f /usr/share/doc/openvpn/examples/sample-config-files/client.conf ]; then
  144. echo $'No VPN client template found'
  145. exit 429823
  146. fi
  147. cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf $user_vpn_cert_file
  148. sed -i "s|remote .*|remote $DEFAULT_DOMAIN_NAME 1194|g" $user_vpn_cert_file
  149. sed -i 's|;user nobody|user nobody|g' $user_vpn_cert_file
  150. sed -i 's|;group nogroup|group nogroup|g' $user_vpn_cert_file
  151. sed -i 's|ca ca.crt|;ca ca.crt|g' $user_vpn_cert_file
  152. sed -i 's|cert client.crt|;cert client.crt|g' $user_vpn_cert_file
  153. sed -i 's|key client.key|;key client.key|g' $user_vpn_cert_file
  154. echo '<ca>' >> $user_vpn_cert_file
  155. cat /etc/openvpn/ca.crt >> $user_vpn_cert_file
  156. echo '</ca>' >> $user_vpn_cert_file
  157. echo '<cert>' >> $user_vpn_cert_file
  158. cat /etc/openvpn/easy-rsa/keys/$username.crt >> $user_vpn_cert_file
  159. echo '</cert>' >> $user_vpn_cert_file
  160. echo '<key>' >> $user_vpn_cert_file
  161. cat /etc/openvpn/easy-rsa/keys/$username.key >> $user_vpn_cert_file
  162. echo '</key>' >> $user_vpn_cert_file
  163. chown $username:$username $user_vpn_cert_file
  164. rm /etc/openvpn/easy-rsa/keys/$username.crt
  165. shred -zu /etc/openvpn/easy-rsa/keys/$username.key
  166. echo $"VPN key created at $user_vpn_cert_file"
  167. }
  168. function add_user_vpn {
  169. new_username="$1"
  170. new_user_password="$2"
  171. create_user_vpn_key $new_username
  172. }
  173. function remove_user_vpn {
  174. new_username="$1"
  175. }
  176. function install_vpn {
  177. apt-get -yq install fastd openvpn easy-rsa
  178. if [ ! -f /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz ]; then
  179. echo $'Example openvpn server config not found'
  180. exit 783953
  181. fi
  182. gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
  183. sed -i "s|;push \"redirect-gateway|push \"redirect-gateway|g" /etc/openvpn/server.conf
  184. sed -i 's|;push "dhcp-option|push "dhcp-option|g' /etc/openvpn/server.conf
  185. sed -i 's|;user nobody|user nobody|g' /etc/openvpn/server.conf
  186. sed -i 's|;group nogroup|group nogroup|g' /etc/openvpn/server.conf
  187. echo 1 > /proc/sys/net/ipv4/ip_forward
  188. sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
  189. sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
  190. sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' /etc/sysctl.conf
  191. cp -r /usr/share/easy-rsa/ /etc/openvpn
  192. if [ ! -d /etc/openvpn/easy-rsa/keys ]; then
  193. mkdir /etc/openvpn/easy-rsa/keys
  194. fi
  195. sed -i "s|export KEY_COUNTRY.*|export KEY_COUNTRY=\"US\"|g" /etc/openvpn/easy-rsa/vars
  196. sed -i "s|export KEY_PROVINCE.*|export KEY_PROVINCE=\"TX\"|g" /etc/openvpn/easy-rsa/vars
  197. sed -i "s|export KEY_CITY.*|export KEY_CITY=\"Dallas\"|g" /etc/openvpn/easy-rsa/vars
  198. sed -i "s|export KEY_ORG.*|export KEY_ORG=\"$PROJECT_NAME\"|g" /etc/openvpn/easy-rsa/vars
  199. sed -i "s|export KEY_EMAIL.*|export KEY_EMAIL=\"$MY_EMAIL_ADDRESS\"|g" /etc/openvpn/easy-rsa/vars
  200. sed -i "s|export KEY_OU=.*|export KEY_OU=\"MoonUnit\"|g" /etc/openvpn/easy-rsa/vars
  201. sed -i "s|export KEY_NAME.*|export KEY_NAME=\"$OPENVPN_SERVER_NAME\"|g" /etc/openvpn/easy-rsa/vars
  202. if [ ! -f /etc/openvpn/dh2048.pem ]; then
  203. openssl dhparam -out /etc/openvpn/dh2048.pem 2048
  204. fi
  205. cd /etc/openvpn/easy-rsa
  206. . ./vars
  207. ./clean-all
  208. vpn_openssl_version='1.0.0'
  209. if [ ! -f openssl-${vpn_openssl_version}.cnf ]; then
  210. echo $"openssl-${vpn_openssl_version}.cnf was not found"
  211. exit 7392353
  212. fi
  213. cp openssl-${vpn_openssl_version}.cnf openssl.cnf
  214. echo '
  215. ' | ./build-ca
  216. echo '
  217. y
  218. y
  219. ' | ./build-key-server $OPENVPN_SERVER_NAME
  220. if [ ! -f /etc/openvpn/easy-rsa/keys/$OPENVPN_SERVER_NAME.crt ]; then
  221. echo $'OpenVPN crt not found'
  222. exit 7823352
  223. fi
  224. if [ ! -f /etc/openvpn/easy-rsa/keys/$OPENVPN_SERVER_NAME.key ]; then
  225. echo $'OpenVPN key not found'
  226. exit 6839436
  227. fi
  228. if [ ! -f /etc/openvpn/easy-rsa/keys/ca.key ]; then
  229. echo $'OpenVPN ca not found'
  230. exit 7935203
  231. fi
  232. cp /etc/openvpn/easy-rsa/keys/{$OPENVPN_SERVER_NAME.crt,$OPENVPN_SERVER_NAME.key,ca.crt} /etc/openvpn
  233. create_user_vpn_key $MY_USERNAME
  234. firewall_enable_vpn
  235. systemctl start openvpn
  236. APP_INSTALLED=1
  237. }
  238. # NOTE: deliberately there is no "exit 0"