freedombone-app-vpn 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  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. # http://www.farrellf.com/projects/software/2016-05-04_Running_a_VPN_Server_with_OpenVPN_and_Stunnel/index_.php
  15. #
  16. # License
  17. # =======
  18. #
  19. # Copyright (C) 2014-2017 Bob Mottram <bob@freedombone.net>
  20. #
  21. # This program is free software: you can redistribute it and/or modify
  22. # it under the terms of the GNU Affero General Public License as published by
  23. # the Free Software Foundation, either version 3 of the License, or
  24. # (at your option) any later version.
  25. #
  26. # This program is distributed in the hope that it will be useful,
  27. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  29. # GNU Affero General Public License for more details.
  30. #
  31. # You should have received a copy of the GNU Affero General Public License
  32. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  33. VARIANTS='full full-vim'
  34. IN_DEFAULT_INSTALL=0
  35. SHOW_ON_ABOUT=0
  36. OPENVPN_SERVER_NAME="server"
  37. OPENVPN_KEY_FILENAME='client.ovpn'
  38. VPN_COUNTRY_CODE="US"
  39. VPN_AREA="Apparent Free Speech Zone"
  40. VPN_LOCATION="Freedomville"
  41. VPN_ORGANISATION="Freedombone"
  42. VPN_UNIT="Freedombone Unit"
  43. STUNNEL_PORT=3439
  44. VPN_TLS_PORT=553
  45. vpn_variables=(MY_EMAIL_ADDRESS
  46. DEFAULT_DOMAIN_NAME
  47. MY_USERNAME
  48. VPN_COUNTRY_CODE
  49. VPN_AREA
  50. VPN_LOCATION
  51. VPN_ORGANISATION
  52. VPN_UNIT
  53. VPN_TLS_PORT)
  54. function logging_on_vpn {
  55. echo -n ''
  56. }
  57. function logging_off_vpn {
  58. echo -n ''
  59. }
  60. function install_interactive_vpn {
  61. read_config_param VPN_TLS_PORT
  62. if [ ! $VPN_TLS_PORT ]; then
  63. VPN_TLS_PORT=553
  64. fi
  65. VPN_DETAILS_COMPLETE=
  66. while [ ! $VPN_DETAILS_COMPLETE ]
  67. do
  68. data=$(tempfile 2>/dev/null)
  69. trap "rm -f $data" 0 1 2 5 15
  70. currtlsport=$(grep 'VPN_TLS_PORT' temp.cfg | awk -F '=' '{print $2}')
  71. if [ $currtlsport ]; then
  72. VPN_TLS_PORT=$currtlsport
  73. fi
  74. dialog --backtitle $"Freedombone Configuration" \
  75. --title $"VPN Configuration" \
  76. --form $"\nPlease enter your VPN details. Changing the port to 443 will help defend against censorship but will prevent other web apps from running." 12 65 1 \
  77. $"TLS port:" 1 1 "$VPN_TLS_PORT" 1 12 5 5 \
  78. 2> $data
  79. sel=$?
  80. case $sel in
  81. 1) exit 1;;
  82. 255) exit 1;;
  83. esac
  84. tlsport=$(cat $data | sed -n 1p)
  85. if [ ${#tlsport} -gt 1 ]; then
  86. if [[ "$tlsport" != *' '* && "$tlsport" != *'.'* ]]; then
  87. VPN_TLS_PORT="$tlsport"
  88. VPN_DETAILS_COMPLETE="yes"
  89. write_config_param "VPN_TLS_PORT" "$VPN_TLS_PORT"
  90. fi
  91. fi
  92. done
  93. clear
  94. APP_INSTALLED=1
  95. }
  96. function vpn_change_tls_port {
  97. EXISTING_VPN_TLS_PORT=$VPN_TLS_PORT
  98. data=$(tempfile 2>/dev/null)
  99. trap "rm -f $data" 0 1 2 5 15
  100. dialog --title $"VPN Configuration" \
  101. --backtitle $"Freedombone Control Panel" \
  102. --inputbox $'Change TLS port' 10 50 $VPN_TLS_PORT 2>$data
  103. sel=$?
  104. case $sel in
  105. 0)
  106. tlsport=$(<$data)
  107. if [ ${#tlsport} -gt 0 ]; then
  108. if [[ "$tlsport" != "$EXISTING_VPN_TLS_PORT" ]]; then
  109. clear
  110. VPN_TLS_PORT=$tlsport
  111. write_config_param "VPN_TLS_PORT" "$VPN_TLS_PORT"
  112. sed -i "s|accept =.*|accept = $VPN_TLS_PORT|g" /etc/stunnel/stunnel.conf
  113. sed -i "s|accept =.*|accept = $VPN_TLS_PORT|g" /etc/stunnel/stunnel-client.conf
  114. for d in /home/*/ ; do
  115. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  116. if [ -f /home/$USERNAME/stunnel-client.conf ]; then
  117. cp /etc/stunnel/stunnel-client.conf /home/$USERNAME/stunnel-client.conf
  118. chown $USERNAME:$USERNAME /home/$USERNAME/stunnel-client.conf
  119. fi
  120. done
  121. if [ $VPN_TLS_PORT -eq 443 ]; then
  122. systemctl stop nginx
  123. systemctl disable nginx
  124. else
  125. systemctl enable nginx
  126. systemctl restart nginx
  127. fi
  128. systemctl restart stunnel
  129. dialog --title $"VPN Configuration" \
  130. --msgbox $"TLS port changed to $VPN_TLS_PORT" 6 60
  131. fi
  132. fi
  133. ;;
  134. esac
  135. }
  136. function vpn_regenerate_client_keys {
  137. data=$(tempfile 2>/dev/null)
  138. trap "rm -f $data" 0 1 2 5 15
  139. dialog --title $"Regenerate VPN keys for a user" \
  140. --backtitle $"Freedombone Control Panel" \
  141. --inputbox $'username' 10 50 2>$data
  142. sel=$?
  143. case $sel in
  144. 0)
  145. USERNAME=$(<$data)
  146. if [ ${#USERNAME} -gt 0 ]; then
  147. if [ -d /home/$USERNAME ]; then
  148. clear
  149. create_user_vpn_key $USERNAME
  150. dialog --title $"Regenerate VPN keys for a user" \
  151. --msgbox $"VPN keys were regenerated for $USERNAME" 6 60
  152. fi
  153. fi
  154. ;;
  155. esac
  156. }
  157. function configure_interactive_vpn {
  158. read_config_param VPN_TLS_PORT
  159. while true
  160. do
  161. data=$(tempfile 2>/dev/null)
  162. trap "rm -f $data" 0 1 2 5 15
  163. dialog --backtitle $"Freedombone Control Panel" \
  164. --title $"VPN Configuration" \
  165. --radiolist $"Choose an operation:" 13 70 3 \
  166. 1 $"Change TLS port (currently $VPN_TLS_PORT)" off \
  167. 2 $"Regenerate keys for a user" off \
  168. 3 $"Exit" on 2> $data
  169. sel=$?
  170. case $sel in
  171. 1) return;;
  172. 255) return;;
  173. esac
  174. case $(cat $data) in
  175. 1) vpn_change_tls_port;;
  176. 2) vpn_regenerate_client_keys;;
  177. 3) break;;
  178. esac
  179. done
  180. }
  181. function reconfigure_vpn {
  182. echo -n ''
  183. }
  184. function upgrade_vpn {
  185. echo -n ''
  186. }
  187. function backup_local_vpn {
  188. for d in /home/*/ ; do
  189. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  190. if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
  191. cp /home/$USERNAME/$OPENVPN_KEY_FILENAME /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}
  192. fi
  193. done
  194. function_check backup_directory_to_usb
  195. backup_directory_to_usb /etc/openvpn/easy-rsa/keys vpn
  196. backup_directory_to_usb /etc/stunnel vpnstunnel
  197. }
  198. function restore_local_vpn {
  199. temp_restore_dir=/root/tempvpn
  200. restore_directory_from_usb $temp_restore_dir vpn
  201. if [ -d ${temp_restore_dir} ]; then
  202. cp -r ${temp_restore_dir}/* /etc/openvpn/easy-rsa/keys
  203. cp -r ${temp_restore_dir}/${OPENVPN_SERVER_NAME}* /etc/openvpn/
  204. cp -r ${temp_restore_dir}/dh* /etc/openvpn/
  205. rm -rf ${temp_restore_dir}
  206. for d in /home/*/ ; do
  207. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  208. if [ -f /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} ]; then
  209. cp /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} /home/$USERNAME/$OPENVPN_KEY_FILENAME
  210. chown $USERNAME:$USERNAME /home/$USERNAME/$OPENVPN_KEY_FILENAME
  211. fi
  212. done
  213. fi
  214. temp_restore_dir=/root/tempvpnstunnel
  215. restore_directory_from_usb $temp_restore_dir vpnstunnel
  216. if [ -d ${temp_restore_dir} ]; then
  217. cp -r ${temp_restore_dir}/* /etc/stunnel
  218. rm -rf ${temp_restore_dir}
  219. for d in /home/*/ ; do
  220. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  221. if [ -f /home/$USERNAME/stunnel.pem ]; then
  222. cp /etc/stunnel/stunnel.pem /home/$USERNAME/stunnel.pem
  223. chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.pem
  224. fi
  225. if [ -f /home/$USERNAME/stunnel.p12 ]; then
  226. cp /etc/stunnel/stunnel.p12 /home/$USERNAME/stunnel.p12
  227. chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.p12
  228. fi
  229. done
  230. fi
  231. }
  232. function backup_remote_vpn {
  233. for d in /home/*/ ; do
  234. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  235. if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
  236. cp /home/$USERNAME/$OPENVPN_KEY_FILENAME /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME}
  237. fi
  238. done
  239. function_check backup_directory_to_friend
  240. backup_directory_to_friend /etc/openvpn/easy-rsa/keys vpn
  241. backup_directory_to_friend /etc/stunnel vpnstunnel
  242. }
  243. function restore_remote_vpn {
  244. temp_restore_dir=/root/tempvpn
  245. restore_directory_from_friend $temp_restore_dir vpn
  246. if [ -d ${temp_restore_dir} ]; then
  247. cp -r ${temp_restore_dir}/* /etc/openvpn/easy-rsa/keys
  248. cp -r ${temp_restore_dir}/${OPENVPN_SERVER_NAME}* /etc/openvpn/
  249. cp -r ${temp_restore_dir}/dh* /etc/openvpn/
  250. rm -rf ${temp_restore_dir}
  251. for d in /home/*/ ; do
  252. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  253. if [ -f /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} ]; then
  254. cp /etc/openvpn/easy-rsa/keys/${USERNAME}_${OPENVPN_KEY_FILENAME} /home/$USERNAME/$OPENVPN_KEY_FILENAME
  255. chown $USERNAME:$USERNAME /home/$USERNAME/$OPENVPN_KEY_FILENAME
  256. fi
  257. done
  258. fi
  259. temp_restore_dir=/root/tempvpnstunnel
  260. restore_directory_from_friend $temp_restore_dir vpnstunnel
  261. if [ -d ${temp_restore_dir} ]; then
  262. cp -r ${temp_restore_dir}/* /etc/stunnel
  263. rm -rf ${temp_restore_dir}
  264. for d in /home/*/ ; do
  265. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  266. if [ -f /home/$USERNAME/stunnel.pem ]; then
  267. cp /etc/stunnel/stunnel.pem /home/$USERNAME/stunnel.pem
  268. chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.pem
  269. fi
  270. if [ -f /home/$USERNAME/stunnel.p12 ]; then
  271. cp /etc/stunnel/stunnel.p12 /home/$USERNAME/stunnel.p12
  272. chown $USERNAME:$USERNAME /home/$USERNAME/stunnel.p12
  273. fi
  274. done
  275. fi
  276. }
  277. function remove_vpn {
  278. systemctl stop stunnel
  279. systemctl disable stunnel
  280. rm /etc/systemd/system/stunnel.service
  281. systemctl stop openvpn
  282. if [ $VPN_TLS_PORT -ne 443 ]; then
  283. firewall_remove VPN-TLS $VPN_TLS_PORT
  284. else
  285. systemctl enable nginx
  286. systemctl restart nginx
  287. fi
  288. apt-get -yq remove --purge fastd openvpn easy-rsa
  289. apt-get -yq remove stunnel4
  290. if [ -d /etc/openvpn ]; then
  291. rm -rf /etc/openvpn
  292. fi
  293. firewall_disable_vpn
  294. echo 0 > /proc/sys/net/ipv4/ip_forward
  295. sed -i 's|net.ipv4.ip_forward=.*|net.ipv4.ip_forward=0|g' /etc/sysctl.conf
  296. remove_completion_param install_vpn
  297. # remove any client keys
  298. for d in /home/*/ ; do
  299. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  300. if [ -f /home/$USERNAME/$OPENVPN_KEY_FILENAME ]; then
  301. shred -zu /home/$USERNAME/$OPENVPN_KEY_FILENAME
  302. fi
  303. rm /home/$USERNAME/stunnel*
  304. done
  305. userdel -f vpn
  306. groupdel -f vpn
  307. if [ -d /etc/stunnel ]; then
  308. rm -rf /etc/stunnel
  309. fi
  310. }
  311. function create_user_vpn_key {
  312. username=$1
  313. if [ ! -d /home/$username ]; then
  314. return
  315. fi
  316. echo $"Creating VPN key for $username"
  317. cd /etc/openvpn/easy-rsa
  318. if [ -f /etc/openvpn/easy-rsa/keys/$username.crt ]; then
  319. rm /etc/openvpn/easy-rsa/keys/$username.crt
  320. fi
  321. if [ -f /etc/openvpn/easy-rsa/keys/$username.key ]; then
  322. rm /etc/openvpn/easy-rsa/keys/$username.key
  323. fi
  324. if [ -f /etc/openvpn/easy-rsa/keys/$username.csr ]; then
  325. rm /etc/openvpn/easy-rsa/keys/$username.csr
  326. fi
  327. sed -i 's| --interact||g' build-key
  328. ./build-key "$username"
  329. if [ ! -f /etc/openvpn/easy-rsa/keys/$username.crt ]; then
  330. echo $'VPN user cert not generated'
  331. exit 783528
  332. fi
  333. user_cert=$(cat /etc/openvpn/easy-rsa/keys/$username.crt)
  334. if [ ${#user_cert} -lt 10 ]; then
  335. cat /etc/openvpn/easy-rsa/keys/$username.crt
  336. echo $'User cert generation failed'
  337. exit 634659
  338. fi
  339. if [ ! -f /etc/openvpn/easy-rsa/keys/$username.key ]; then
  340. echo $'VPN user key not generated'
  341. exit 682523
  342. fi
  343. user_key=$(cat /etc/openvpn/easy-rsa/keys/$username.key)
  344. if [ ${#user_key} -lt 10 ]; then
  345. cat /etc/openvpn/easy-rsa/keys/$username.key
  346. echo $'User key generation failed'
  347. exit 285838
  348. fi
  349. user_vpn_cert_file=/home/$username/$OPENVPN_KEY_FILENAME
  350. echo 'client' > $user_vpn_cert_file
  351. echo 'dev tun' >> $user_vpn_cert_file
  352. echo 'proto tcp' >> $user_vpn_cert_file
  353. echo "remote localhost $STUNNEL_PORT" >> $user_vpn_cert_file
  354. echo "route $DEFAULT_DOMAIN_NAME 255.255.255.255 net_gateway" >> $user_vpn_cert_file
  355. echo 'resolv-retry infinite' >> $user_vpn_cert_file
  356. echo 'nobind' >> $user_vpn_cert_file
  357. echo 'tun-mtu 1500' >> $user_vpn_cert_file
  358. echo 'tun-mtu-extra 32' >> $user_vpn_cert_file
  359. echo 'mssfix 1450' >> $user_vpn_cert_file
  360. echo 'persist-key' >> $user_vpn_cert_file
  361. echo 'persist-tun' >> $user_vpn_cert_file
  362. echo 'auth-nocache' >> $user_vpn_cert_file
  363. echo 'remote-cert-tls server' >> $user_vpn_cert_file
  364. echo 'comp-lzo' >> $user_vpn_cert_file
  365. echo 'verb 3' >> $user_vpn_cert_file
  366. echo '' >> $user_vpn_cert_file
  367. echo '<ca>' >> $user_vpn_cert_file
  368. cat /etc/openvpn/ca.crt >> $user_vpn_cert_file
  369. echo '</ca>' >> $user_vpn_cert_file
  370. echo '<cert>' >> $user_vpn_cert_file
  371. cat /etc/openvpn/easy-rsa/keys/$username.crt >> $user_vpn_cert_file
  372. echo '</cert>' >> $user_vpn_cert_file
  373. echo '<key>' >> $user_vpn_cert_file
  374. cat /etc/openvpn/easy-rsa/keys/$username.key >> $user_vpn_cert_file
  375. echo '</key>' >> $user_vpn_cert_file
  376. chown $username:$username $user_vpn_cert_file
  377. # keep a backup
  378. cp $user_vpn_cert_file /etc/openvpn/easy-rsa/keys/$username.ovpn
  379. #rm /etc/openvpn/easy-rsa/keys/$username.crt
  380. #rm /etc/openvpn/easy-rsa/keys/$username.csr
  381. shred -zu /etc/openvpn/easy-rsa/keys/$username.key
  382. echo $"VPN key created at $user_vpn_cert_file"
  383. }
  384. function add_user_vpn {
  385. new_username="$1"
  386. new_user_password="$2"
  387. create_user_vpn_key $new_username
  388. if [ -f /etc/stunnel/stunnel.pem ]; then
  389. cp /etc/stunnel/stunnel.pem /home/$new_username/stunnel.pem
  390. chown $new_username:$new_username /home/$new_username/stunnel.pem
  391. fi
  392. if [ -f /etc/stunnel/stunnel.p12 ]; then
  393. cp /etc/stunnel/stunnel.p12 /home/$new_username/stunnel.p12
  394. chown $new_username:$new_username /home/$new_username/stunnel.p12
  395. fi
  396. cp /etc/stunnel/stunnel-client.conf /home/$new_username/stunnel-client.conf
  397. chown $new_username:$new_username /home/$new_username/stunnel-client.conf
  398. }
  399. function remove_user_vpn {
  400. new_username="$1"
  401. }
  402. function install_stunnel {
  403. apt-get -yq install stunnel4
  404. cd /etc/stunnel
  405. openssl req -x509 -nodes -days 3650 -sha256 \
  406. -subj "/O=$VPN_ORGANISATION/OU=$VPN_UNIT/C=$VPN_COUNTRY_CODE/ST=$VPN_AREA/L=$VPN_LOCATION/CN=$HOSTNAME" \
  407. -newkey rsa:2048 -keyout key.pem \
  408. -out cert.pem
  409. if [ ! -f key.pem ]; then
  410. echo $'stunnel key not created'
  411. exit 793530
  412. fi
  413. if [ ! -f cert.pem ]; then
  414. echo $'stunnel cert not created'
  415. exit 204587
  416. fi
  417. chmod 400 key.pem
  418. chmod 640 cert.pem
  419. cat key.pem cert.pem >> stunnel.pem
  420. chmod 640 stunnel.pem
  421. openssl pkcs12 -export -out stunnel.p12 -inkey key.pem -in cert.pem -passout pass:
  422. if [ ! -f stunnel.p12 ]; then
  423. echo $'stunnel pkcs12 not created'
  424. exit 639353
  425. fi
  426. chmod 640 stunnel.p12
  427. echo 'chroot = /var/lib/stunnel4' > stunnel.conf
  428. echo 'pid = /stunnel4.pid' >> stunnel.conf
  429. echo 'setuid = stunnel4' >> stunnel.conf
  430. echo 'setgid = stunnel4' >> stunnel.conf
  431. echo 'socket = l:TCP_NODELAY=1' >> stunnel.conf
  432. echo 'socket = r:TCP_NODELAY=1' >> stunnel.conf
  433. echo 'cert = /etc/stunnel/stunnel.pem' >> stunnel.conf
  434. echo '[openvpn]' >> stunnel.conf
  435. echo "accept = $VPN_TLS_PORT" >> stunnel.conf
  436. echo 'connect = localhost:1194' >> stunnel.conf
  437. echo 'cert = /etc/stunnel/stunnel.pem' >> stunnel.conf
  438. sed -i 's|ENABLED=.*|ENABLED=1|g' /etc/default/stunnel4
  439. echo '[openvpn]' > stunnel-client.conf
  440. echo 'client = yes' >> stunnel-client.conf
  441. echo "accept = $STUNNEL_PORT" >> stunnel-client.conf
  442. echo "connect = $DEFAULT_DOMAIN_NAME:$VPN_TLS_PORT" >> stunnel-client.conf
  443. echo 'cert = stunnel.pem' >> stunnel-client.conf
  444. echo '[Unit]' > /etc/systemd/system/stunnel.service
  445. echo 'Description=SSL tunnel for network daemons' >> /etc/systemd/system/stunnel.service
  446. echo 'Documentation=man:stunnel https://www.stunnel.org/docs.html' >> /etc/systemd/system/stunnel.service
  447. echo 'DefaultDependencies=no' >> /etc/systemd/system/stunnel.service
  448. echo 'After=network.target' >> /etc/systemd/system/stunnel.service
  449. echo 'After=syslog.target' >> /etc/systemd/system/stunnel.service
  450. echo '' >> /etc/systemd/system/stunnel.service
  451. echo '[Install]' >> /etc/systemd/system/stunnel.service
  452. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/stunnel.service
  453. echo 'Alias=stunnel.target' >> /etc/systemd/system/stunnel.service
  454. echo '' >> /etc/systemd/system/stunnel.service
  455. echo '[Service]' >> /etc/systemd/system/stunnel.service
  456. echo 'Type=forking' >> /etc/systemd/system/stunnel.service
  457. echo 'RuntimeDirectory=stunnel' >> /etc/systemd/system/stunnel.service
  458. echo 'EnvironmentFile=-/etc/stunnel/stunnel.conf' >> /etc/systemd/system/stunnel.service
  459. echo 'ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf' >> /etc/systemd/system/stunnel.service
  460. echo 'ExecStop=/usr/bin/killall -9 stunnel' >> /etc/systemd/system/stunnel.service
  461. echo 'RemainAfterExit=yes' >> /etc/systemd/system/stunnel.service
  462. if [ $VPN_TLS_PORT -eq 443 ]; then
  463. systemctl stop nginx
  464. systemctl disable nginx
  465. else
  466. systemctl enable nginx
  467. systemctl restart nginx
  468. fi
  469. systemctl enable stunnel
  470. systemctl daemon-reload
  471. systemctl start stunnel
  472. cp /etc/stunnel/stunnel.pem /home/$MY_USERNAME/stunnel.pem
  473. cp /etc/stunnel/stunnel.p12 /home/$MY_USERNAME/stunnel.p12
  474. cp /etc/stunnel/stunnel-client.conf /home/$MY_USERNAME/stunnel-client.conf
  475. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/stunnel*
  476. }
  477. function install_vpn {
  478. apt-get -yq install fastd openvpn easy-rsa
  479. groupadd vpn
  480. useradd -r -s /bin/false -g vpn vpn
  481. # server configuration
  482. echo 'port 1194' > /etc/openvpn/server.conf
  483. echo 'proto tcp' >> /etc/openvpn/server.conf
  484. echo 'dev tun' >> /etc/openvpn/server.conf
  485. echo 'tun-mtu 1500' >> /etc/openvpn/server.conf
  486. echo 'tun-mtu-extra 32' >> /etc/openvpn/server.conf
  487. echo 'mssfix 1450' >> /etc/openvpn/server.conf
  488. echo 'ca /etc/openvpn/ca.crt' >> /etc/openvpn/server.conf
  489. echo 'cert /etc/openvpn/server.crt' >> /etc/openvpn/server.conf
  490. echo 'key /etc/openvpn/server.key' >> /etc/openvpn/server.conf
  491. echo 'dh /etc/openvpn/dh2048.pem' >> /etc/openvpn/server.conf
  492. echo 'server 10.8.0.0 255.255.255.0' >> /etc/openvpn/server.conf
  493. echo 'push "redirect-gateway def1 bypass-dhcp"' >> /etc/openvpn/server.conf
  494. echo "push \"dhcp-option DNS 85.214.73.63\"" >> /etc/openvpn/server.conf
  495. echo "push \"dhcp-option DNS 213.73.91.35\"" >> /etc/openvpn/server.conf
  496. echo 'keepalive 5 30' >> /etc/openvpn/server.conf
  497. echo 'comp-lzo' >> /etc/openvpn/server.conf
  498. echo 'persist-key' >> /etc/openvpn/server.conf
  499. echo 'persist-tun' >> /etc/openvpn/server.conf
  500. echo 'status /dev/null' >> /etc/openvpn/server.conf
  501. echo 'verb 3' >> /etc/openvpn/server.conf
  502. echo '' >> /etc/openvpn/server.conf
  503. echo 1 > /proc/sys/net/ipv4/ip_forward
  504. sed -i 's|# net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
  505. sed -i 's|#net.ipv4.ip_forward|net.ipv4.ip_forward|g' /etc/sysctl.conf
  506. sed -i 's|net.ipv4.ip_forward.*|net.ipv4.ip_forward=1|g' /etc/sysctl.conf
  507. cp -r /usr/share/easy-rsa/ /etc/openvpn
  508. if [ ! -d /etc/openvpn/easy-rsa/keys ]; then
  509. mkdir /etc/openvpn/easy-rsa/keys
  510. fi
  511. # keys configuration
  512. sed -i "s|export KEY_COUNTRY.*|export KEY_COUNTRY=\"US\"|g" /etc/openvpn/easy-rsa/vars
  513. sed -i "s|export KEY_PROVINCE.*|export KEY_PROVINCE=\"TX\"|g" /etc/openvpn/easy-rsa/vars
  514. sed -i "s|export KEY_CITY.*|export KEY_CITY=\"Dallas\"|g" /etc/openvpn/easy-rsa/vars
  515. sed -i "s|export KEY_ORG.*|export KEY_ORG=\"$PROJECT_NAME\"|g" /etc/openvpn/easy-rsa/vars
  516. sed -i "s|export KEY_EMAIL.*|export KEY_EMAIL=\"$MY_EMAIL_ADDRESS\"|g" /etc/openvpn/easy-rsa/vars
  517. sed -i "s|export KEY_OU=.*|export KEY_OU=\"MoonUnit\"|g" /etc/openvpn/easy-rsa/vars
  518. sed -i "s|export KEY_NAME.*|export KEY_NAME=\"$OPENVPN_SERVER_NAME\"|g" /etc/openvpn/easy-rsa/vars
  519. # generate host keys
  520. if [ ! -f /etc/openvpn/dh2048.pem ]; then
  521. openssl dhparam -out /etc/openvpn/dh2048.pem 2048
  522. fi
  523. if [ ! -f /etc/openvpn/dh2048.pem ]; then
  524. echo $'vpn dhparams were not generated'
  525. exit 73724523
  526. fi
  527. cp /etc/openvpn/dh2048.pem /etc/openvpn/easy-rsa/keys/dh2048.pem
  528. cd /etc/openvpn/easy-rsa
  529. . ./vars
  530. ./clean-all
  531. vpn_openssl_version='1.0.0'
  532. if [ ! -f openssl-${vpn_openssl_version}.cnf ]; then
  533. echo $"openssl-${vpn_openssl_version}.cnf was not found"
  534. exit 7392353
  535. fi
  536. cp openssl-${vpn_openssl_version}.cnf openssl.cnf
  537. if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt ]; then
  538. rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt
  539. fi
  540. if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key ]; then
  541. rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key
  542. fi
  543. if [ -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.csr ]; then
  544. rm /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.csr
  545. fi
  546. sed -i 's| --interact||g' build-key-server
  547. sed -i 's| --interact||g' build-ca
  548. ./build-ca
  549. ./build-key-server $OPENVPN_SERVER_NAME
  550. if [ ! -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt ]; then
  551. echo $'OpenVPN crt not found'
  552. exit 7823352
  553. fi
  554. server_cert=$(cat /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt)
  555. if [ ${#server_cert} -lt 10 ]; then
  556. cat /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.crt
  557. echo $'Server cert generation failed'
  558. exit 3284682
  559. fi
  560. if [ ! -f /etc/openvpn/easy-rsa/keys/${OPENVPN_SERVER_NAME}.key ]; then
  561. echo $'OpenVPN key not found'
  562. exit 6839436
  563. fi
  564. if [ ! -f /etc/openvpn/easy-rsa/keys/ca.key ]; then
  565. echo $'OpenVPN ca not found'
  566. exit 7935203
  567. fi
  568. cp /etc/openvpn/easy-rsa/keys/{$OPENVPN_SERVER_NAME.crt,$OPENVPN_SERVER_NAME.key,ca.crt} /etc/openvpn
  569. create_user_vpn_key $MY_USERNAME
  570. firewall_enable_vpn
  571. if [ $VPN_TLS_PORT -ne 443 ]; then
  572. firewall_add VPN-TLS $VPN_TLS_PORT tcp
  573. fi
  574. systemctl start openvpn
  575. install_stunnel
  576. systemctl restart openvpn
  577. APP_INSTALLED=1
  578. }
  579. # NOTE: deliberately there is no "exit 0"