Advertisement
Guest User

Untitled

a guest
Apr 13th, 2018
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.62 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3. # Script for automatic setup of an IPsec VPN server on Ubuntu LTS and Debian.
  4. # Works on any dedicated server or virtual private server (VPS) except OpenVZ.
  5. #
  6. # DO NOT RUN THIS SCRIPT ON YOUR PC OR MAC!
  7. #
  8. # The latest version of this script is available at:
  9. # https://github.com/hwdsl2/setup-ipsec-vpn
  10. #
  11. # Copyright (C) 2014-2017 Lin Song <linsongui@gmail.com>
  12. # Based on the work of Thomas Sarlandie (Copyright 2012)
  13. #
  14. # This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
  15. # Unported License: http://creativecommons.org/licenses/by-sa/3.0/
  16. #
  17. # Attribution required: please include my name in any derivative and let me
  18. # know how you have improved it!
  19.  
  20. # =====================================================
  21.  
  22. # Define your own values for these variables
  23. # - IPsec pre-shared key, VPN username and password
  24. # - All values MUST be placed inside 'single quotes'
  25. # - DO NOT use these special characters within values: \ " '
  26.  
  27. YOUR_IPSEC_PSK='1Q2W3E4R5T6Y7U8I9O0P'
  28. YOUR_USERNAME='mirciulik'
  29. YOUR_PASSWORD='cavenecadas'
  30.  
  31. # Important notes: https://git.io/vpnnotes
  32. # Setup VPN clients: https://git.io/vpnclients
  33.  
  34. # =====================================================
  35.  
  36. export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  37. SYS_DT="$(date +%F-%T)"
  38.  
  39. exiterr() { echo "Error: $1" >&2; exit 1; }
  40. exiterr2() { exiterr "'apt-get install' failed."; }
  41. conf_bk() { /bin/cp -f "$1" "$1.old-$SYS_DT" 2>/dev/null; }
  42. bigecho() { echo; echo "## $1"; echo; }
  43.  
  44. check_ip() {
  45. IP_REGEX='^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'
  46. printf '%s' "$1" | tr -d '\n' | grep -Eq "$IP_REGEX"
  47. }
  48.  
  49. vpnsetup() {
  50.  
  51. os_type="$(lsb_release -si 2>/dev/null)"
  52. if [ -z "$os_type" ]; then
  53. [ -f /etc/os-release ] && os_type="$(. /etc/os-release && echo "$ID")"
  54. [ -f /etc/lsb-release ] && os_type="$(. /etc/lsb-release && echo "$DISTRIB_ID")"
  55. fi
  56. if ! printf '%s' "$os_type" | head -n 1 | grep -qiF -e ubuntu -e debian -e raspbian; then
  57. exiterr "This script only supports Ubuntu and Debian."
  58. fi
  59.  
  60. if [ "$(sed 's/\..*//' /etc/debian_version)" = "7" ]; then
  61. exiterr "Debian 7 is not supported."
  62. fi
  63.  
  64. if [ -f /proc/user_beancounters ]; then
  65. exiterr "OpenVZ VPS is not supported. Try OpenVPN: github.com/Nyr/openvpn-install"
  66. fi
  67.  
  68. if [ "$(id -u)" != 0 ]; then
  69. exiterr "Script must be run as root. Try 'sudo sh $0'"
  70. fi
  71.  
  72. net_iface=${VPN_NET_IFACE:-'eth0'}
  73. def_iface="$(route 2>/dev/null | grep '^default' | grep -o '[^ ]*$')"
  74. [ -z "$def_iface" ] && def_iface="$(ip -4 route list 0/0 2>/dev/null | grep -Po '(?<=dev )(\S+)')"
  75.  
  76. def_iface_state=$(cat "/sys/class/net/$def_iface/operstate" 2>/dev/null)
  77. if [ -n "$def_iface_state" ] && [ "$def_iface_state" != "down" ]; then
  78. if [ "$(uname -m | cut -c1-3)" != "arm" ]; then
  79. case "$def_iface" in
  80. wl*)
  81. exiterr "Wireless interface '$def_iface' detected. DO NOT run this script on your PC or Mac!"
  82. ;;
  83. esac
  84. fi
  85. net_iface="$def_iface"
  86. fi
  87.  
  88. net_iface_state=$(cat "/sys/class/net/$net_iface/operstate" 2>/dev/null)
  89. if [ -z "$net_iface_state" ] || [ "$net_iface_state" = "down" ] || [ "$net_iface" = "lo" ]; then
  90. printf "Error: Network interface '%s' is not available.\n" "$net_iface" >&2
  91. if [ -z "$VPN_NET_IFACE" ]; then
  92. cat 1>&2 <<EOF
  93. Unable to detect the default network interface. Manually re-run this script with:
  94. sudo VPN_NET_IFACE="your_default_interface_name" sh "$0"
  95. EOF
  96. fi
  97. exit 1
  98. fi
  99.  
  100. [ -n "$YOUR_IPSEC_PSK" ] && VPN_IPSEC_PSK="$YOUR_IPSEC_PSK"
  101. [ -n "$YOUR_USERNAME" ] && VPN_USER="$YOUR_USERNAME"
  102. [ -n "$YOUR_PASSWORD" ] && VPN_PASSWORD="$YOUR_PASSWORD"
  103.  
  104. if [ -z "$VPN_IPSEC_PSK" ] && [ -z "$VPN_USER" ] && [ -z "$VPN_PASSWORD" ]; then
  105. bigecho "VPN credentials not set by user. Generating random PSK and password..."
  106. VPN_IPSEC_PSK="$(LC_CTYPE=C tr -dc 'A-HJ-NPR-Za-km-z2-9' < /dev/urandom | head -c 16)"
  107. VPN_USER=vpnuser
  108. VPN_PASSWORD="$(LC_CTYPE=C tr -dc 'A-HJ-NPR-Za-km-z2-9' < /dev/urandom | head -c 16)"
  109. fi
  110.  
  111. if [ -z "$VPN_IPSEC_PSK" ] || [ -z "$VPN_USER" ] || [ -z "$VPN_PASSWORD" ]; then
  112. exiterr "All VPN credentials must be specified. Edit the script and re-enter them."
  113. fi
  114.  
  115. if printf '%s' "$VPN_IPSEC_PSK $VPN_USER $VPN_PASSWORD" | LC_ALL=C grep -q '[^ -~]\+'; then
  116. exiterr "VPN credentials must not contain non-ASCII characters."
  117. fi
  118.  
  119. case "$VPN_IPSEC_PSK $VPN_USER $VPN_PASSWORD" in
  120. *[\\\"\']*)
  121. exiterr "VPN credentials must not contain these special characters: \\ \" '"
  122. ;;
  123. esac
  124.  
  125. bigecho "VPN setup in progress... Please be patient."
  126.  
  127. # Create and change to working dir
  128. mkdir -p /opt/src
  129. cd /opt/src || exiterr "Cannot enter /opt/src."
  130.  
  131. bigecho "Populating apt-get cache..."
  132.  
  133. # Wait up to 60s for apt/dpkg lock
  134. count=0
  135. while fuser /var/lib/apt/lists/lock /var/lib/dpkg/lock >/dev/null 2>&1; do
  136. [ "$count" -ge "20" ] && exiterr "Cannot get apt/dpkg lock."
  137. count=$((count+1))
  138. printf '%s' '.'
  139. sleep 3
  140. done
  141.  
  142. export DEBIAN_FRONTEND=noninteractive
  143. apt-get -yq update || exiterr "'apt-get update' failed."
  144.  
  145. bigecho "Installing packages required for setup..."
  146.  
  147. apt-get -yq install wget dnsutils openssl \
  148. iproute gawk grep sed net-tools || exiterr2
  149.  
  150. bigecho "Trying to auto discover IP of this server..."
  151.  
  152. cat <<'EOF'
  153. In case the script hangs here for more than a few minutes,
  154. press Ctrl-C to abort. Then edit it and manually enter IP.
  155. EOF
  156.  
  157. # In case auto IP discovery fails, enter server's public IP here.
  158. PUBLIC_IP=${VPN_PUBLIC_IP:-''}
  159.  
  160. # Try to auto discover IP of this server
  161. [ -z "$PUBLIC_IP" ] && PUBLIC_IP=$(dig @resolver1.opendns.com -t A -4 myip.opendns.com +short)
  162.  
  163. # Check IP for correct format
  164. check_ip "$PUBLIC_IP" || PUBLIC_IP=$(wget -t 3 -T 15 -qO- http://ipv4.icanhazip.com)
  165. check_ip "$PUBLIC_IP" || exiterr "Cannot detect this server's public IP. Edit the script and manually enter it."
  166.  
  167. bigecho "Installing packages required for the VPN..."
  168.  
  169. apt-get -yq install libnss3-dev libnspr4-dev pkg-config \
  170. libpam0g-dev libcap-ng-dev libcap-ng-utils libselinux1-dev \
  171. dh-systemd htmldoc libaudit-dev libkrb5-dev libldap2-dev \
  172. libldns-dev libunbound-dev man2html xmlto devscripts \
  173. libcurl4-nss-dev flex bison gcc make libnss3-tools \
  174. libevent-dev ppp xl2tpd dns-root-data || exiterr2
  175.  
  176. bigecho "Installing Fail2Ban to protect SSH..."
  177.  
  178. apt-get -yq install fail2ban || exiterr2
  179.  
  180. bigecho "Compiling and installing Libreswan..."
  181.  
  182. SWAN_VER=3.23
  183. swan_file="libreswan-$SWAN_VER.tar.gz"
  184. swan_url1="https://github.com/libreswan/libreswan/archive/v$SWAN_VER.tar.gz"
  185. swan_url2="https://download.libreswan.org/$swan_file"
  186. if ! { wget -t 3 -T 30 -nv -O "$swan_file" "$swan_url1" || wget -t 3 -T 30 -nv -O "$swan_file" "$swan_url2"; }; then
  187. exiterr "Cannot download Libreswan source."
  188. fi
  189. /bin/rm -rf "/opt/src/libreswan-$SWAN_VER"
  190. tar xzf "$swan_file" && /bin/rm -f "$swan_file"
  191. cd "libreswan-$SWAN_VER" || exiterr "Cannot enter Libreswan source dir."
  192. sed -i '/docker-targets\.mk/d' Makefile
  193. cat > overlap.patch <<'EOF'
  194. diff --git a/programs/pluto/kernel_netlink.c b/programs/pluto/kernel_netlink.c
  195. index 8e1ff2799..7d44e1516 100644
  196. --- a/programs/pluto/kernel_netlink.c
  197. +++ b/programs/pluto/kernel_netlink.c
  198. @@ -2992,7 +2992,7 @@ const struct kernel_ops netkey_kernel_ops = {
  199. * if netlink specific changes are needed.
  200. */
  201. .remove_orphaned_holds = NULL, /* only used for klips /proc scanner */
  202. - .overlap_supported = FALSE,
  203. + .overlap_supported = TRUE,
  204. .sha2_truncbug_support = TRUE,
  205. .v6holes = netlink_v6holes,
  206. };
  207. EOF
  208. patch -p1 -s < overlap.patch
  209. cat > Makefile.inc.local <<'EOF'
  210. WERROR_CFLAGS =
  211. USE_DNSSEC = false
  212. EOF
  213. if [ "$(packaging/utils/lswan_detect.sh init)" = "systemd" ]; then
  214. apt-get -yq install libsystemd-dev || exiterr2
  215. fi
  216. NPROCS="$(grep -c ^processor /proc/cpuinfo)"
  217. [ -z "$NPROCS" ] && NPROCS=1
  218. make deb
  219. dpkg -i ../libreswan_3.23-1_amd64.deb
  220.  
  221. bigecho "Creating VPN configuration..."
  222.  
  223. L2TP_NET=${VPN_L2TP_NET:-'10.150.0.0/24'}
  224. L2TP_LOCAL=${VPN_L2TP_LOCAL:-'10.150.0.1'}
  225. L2TP_POOL=${VPN_L2TP_POOL:-'10.150.0.10-10.150.0.250'}
  226. XAUTH_NET=${VPN_XAUTH_NET:-'10.150.1.0/24'}
  227. XAUTH_POOL=${VPN_XAUTH_POOL:-'10.150.1.10-10.150.1.250'}
  228. DNS_SRV1=${VPN_DNS_SRV1:-'192.168.3.10'}
  229. DNS_SRV2=${VPN_DNS_SRV2:-'192.168.3.17'}
  230.  
  231. # Create IPsec (Libreswan) config
  232. conf_bk "/etc/ipsec.conf"
  233. cat > /etc/ipsec.conf <<EOF
  234. version 2.0
  235.  
  236. config setup
  237. virtual-private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!$L2TP_NET,%v4:!$XAUTH_NET
  238. protostack=netkey
  239. interfaces=%defaultroute
  240. uniqueids=no
  241.  
  242. conn shared
  243. left=%defaultroute
  244. leftid=$PUBLIC_IP
  245. right=%any
  246. encapsulation=yes
  247. authby=secret
  248. pfs=no
  249. rekey=no
  250. keyingtries=5
  251. dpddelay=30
  252. dpdtimeout=120
  253. dpdaction=clear
  254. ike=3des-sha1,3des-sha2,aes-sha1,aes-sha1;modp1024,aes-sha2,aes-sha2;modp1024,aes256-sha2_512
  255. phase2alg=3des-sha1,3des-sha2,aes-sha1,aes-sha2,aes256-sha2_512
  256. sha2-truncbug=yes
  257.  
  258. conn l2tp-psk
  259. auto=add
  260. leftprotoport=17/1701
  261. rightprotoport=17/%any
  262. type=transport
  263. phase2=esp
  264. also=shared
  265.  
  266. conn xauth-psk
  267. auto=add
  268. leftsubnet=0.0.0.0/0
  269. rightaddresspool=$XAUTH_POOL
  270. modecfgdns="$DNS_SRV1, $DNS_SRV2"
  271. leftxauthserver=yes
  272. rightxauthclient=yes
  273. leftmodecfgserver=yes
  274. rightmodecfgclient=yes
  275. modecfgpull=yes
  276. xauthby=file
  277. ike-frag=yes
  278. ikev2=never
  279. cisco-unity=yes
  280. also=shared
  281. EOF
  282.  
  283. # Workarounds for systems with ARM CPU (e.g. Raspberry Pi)
  284. # - Set "left" to private IP instead of "%defaultroute"
  285. # - Remove unsupported ESP algorithm
  286. if [ "$(uname -m | cut -c1-3)" = "arm" ]; then
  287. PRIVATE_IP=$(ip -4 route get 1 | awk '{print $NF;exit}')
  288. check_ip "$PRIVATE_IP" && sed -i "s/left=%defaultroute/left=$PRIVATE_IP/" /etc/ipsec.conf
  289. sed -i '/phase2alg/s/,aes256-sha2_512//' /etc/ipsec.conf
  290. fi
  291.  
  292. # Specify IPsec PSK
  293. conf_bk "/etc/ipsec.secrets"
  294. cat > /etc/ipsec.secrets <<EOF
  295. %any %any : PSK "$VPN_IPSEC_PSK"
  296. EOF
  297.  
  298. # Create xl2tpd config
  299. conf_bk "/etc/xl2tpd/xl2tpd.conf"
  300. cat > /etc/xl2tpd/xl2tpd.conf <<EOF
  301. [global]
  302. port = 1701
  303.  
  304. [lns default]
  305. ip range = $L2TP_POOL
  306. local ip = $L2TP_LOCAL
  307. require chap = yes
  308. refuse pap = yes
  309. require authentication = yes
  310. name = l2tpd
  311. pppoptfile = /etc/ppp/options.xl2tpd
  312. length bit = yes
  313. EOF
  314.  
  315. # Set xl2tpd options
  316. conf_bk "/etc/ppp/options.xl2tpd"
  317. cat > /etc/ppp/options.xl2tpd <<EOF
  318. +mschap-v2
  319. ipcp-accept-local
  320. ipcp-accept-remote
  321. ms-dns $DNS_SRV1
  322. ms-dns $DNS_SRV2
  323. noccp
  324. auth
  325. mtu 1280
  326. mru 1280
  327. proxyarp
  328. lcp-echo-failure 4
  329. lcp-echo-interval 30
  330. connect-delay 5000
  331. EOF
  332.  
  333. # Create VPN credentials
  334. conf_bk "/etc/ppp/chap-secrets"
  335. cat > /etc/ppp/chap-secrets <<EOF
  336. "$VPN_USER" l2tpd "$VPN_PASSWORD" *
  337. EOF
  338.  
  339. conf_bk "/etc/ipsec.d/passwd"
  340. VPN_PASSWORD_ENC=$(openssl passwd -1 "$VPN_PASSWORD")
  341. cat > /etc/ipsec.d/passwd <<EOF
  342. $VPN_USER:$VPN_PASSWORD_ENC:xauth-psk
  343. EOF
  344.  
  345. bigecho "Updating sysctl settings..."
  346.  
  347. if ! grep -qs "hwdsl2 VPN script" /etc/sysctl.conf; then
  348. conf_bk "/etc/sysctl.conf"
  349. if [ "$(getconf LONG_BIT)" = "64" ]; then
  350. SHM_MAX=68719476736
  351. SHM_ALL=4294967296
  352. else
  353. SHM_MAX=4294967295
  354. SHM_ALL=268435456
  355. fi
  356. cat >> /etc/sysctl.conf <<EOF
  357.  
  358. # Added by hwdsl2 VPN script
  359. kernel.msgmnb = 65536
  360. kernel.msgmax = 65536
  361. kernel.shmmax = $SHM_MAX
  362. kernel.shmall = $SHM_ALL
  363.  
  364. net.ipv4.ip_forward = 1
  365. net.ipv4.conf.all.accept_source_route = 0
  366. net.ipv4.conf.all.accept_redirects = 0
  367. net.ipv4.conf.all.send_redirects = 0
  368. net.ipv4.conf.all.rp_filter = 0
  369. net.ipv4.conf.default.accept_source_route = 0
  370. net.ipv4.conf.default.accept_redirects = 0
  371. net.ipv4.conf.default.send_redirects = 0
  372. net.ipv4.conf.default.rp_filter = 0
  373. net.ipv4.conf.$net_iface.send_redirects = 0
  374. net.ipv4.conf.$net_iface.rp_filter = 0
  375.  
  376. net.core.wmem_max = 12582912
  377. net.core.rmem_max = 12582912
  378. net.ipv4.tcp_rmem = 10240 87380 12582912
  379. net.ipv4.tcp_wmem = 10240 87380 12582912
  380. EOF
  381. fi
  382.  
  383. bigecho "Updating IPTables rules..."
  384.  
  385. # Check if IPTables rules need updating
  386. ipt_flag=0
  387. IPT_FILE="/etc/iptables.rules"
  388. if ! grep -qs "hwdsl2 VPN script" "$IPT_FILE" \
  389. || ! iptables -t nat -C POSTROUTING -s "$L2TP_NET" -o "$net_iface" -j MASQUERADE 2>/dev/null \
  390. || ! iptables -t nat -C POSTROUTING -s "$XAUTH_NET" -o "$net_iface" -m policy --dir out --pol none -j MASQUERADE 2>/dev/null; then
  391. ipt_flag=1
  392. fi
  393.  
  394. # Add IPTables rules for VPN
  395. if [ "$ipt_flag" = "1" ]; then
  396. service fail2ban stop >/dev/null 2>&1
  397. iptables-save > "$IPT_FILE.old-$SYS_DT"
  398. iptables -I INPUT 1 -p udp --dport 1701 -m policy --dir in --pol none -j DROP
  399. iptables -I INPUT 2 -m conntrack --ctstate INVALID -j DROP
  400. iptables -I INPUT 3 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  401. iptables -I INPUT 4 -p udp -m multiport --dports 500,4500 -j ACCEPT
  402. iptables -I INPUT 5 -p udp --dport 1701 -m policy --dir in --pol ipsec -j ACCEPT
  403. iptables -I INPUT 6 -p udp --dport 1701 -j DROP
  404. iptables -I FORWARD 1 -m conntrack --ctstate INVALID -j DROP
  405. iptables -I FORWARD 2 -i "$net_iface" -o ppp+ -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  406. iptables -I FORWARD 3 -i ppp+ -o "$net_iface" -j ACCEPT
  407. iptables -I FORWARD 4 -i ppp+ -o ppp+ -s "$L2TP_NET" -d "$L2TP_NET" -j ACCEPT
  408. iptables -I FORWARD 5 -i "$net_iface" -d "$XAUTH_NET" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  409. iptables -I FORWARD 6 -s "$XAUTH_NET" -o "$net_iface" -j ACCEPT
  410. # Uncomment if you wish to disallow traffic between VPN clients themselves
  411. # iptables -I FORWARD 2 -i ppp+ -o ppp+ -s "$L2TP_NET" -d "$L2TP_NET" -j DROP
  412. # iptables -I FORWARD 3 -s "$XAUTH_NET" -d "$XAUTH_NET" -j DROP
  413. iptables -A FORWARD -j DROP
  414. iptables -t nat -I POSTROUTING -s "$XAUTH_NET" -o "$net_iface" -m policy --dir out --pol none -j MASQUERADE
  415. iptables -t nat -I POSTROUTING -s "$L2TP_NET" -o "$net_iface" -j MASQUERADE
  416. echo "# Modified by hwdsl2 VPN script" > "$IPT_FILE"
  417. iptables-save >> "$IPT_FILE"
  418.  
  419. # Update rules for iptables-persistent
  420. IPT_FILE2="/etc/iptables/rules.v4"
  421. if [ -f "$IPT_FILE2" ]; then
  422. conf_bk "$IPT_FILE2"
  423. /bin/cp -f "$IPT_FILE" "$IPT_FILE2"
  424. fi
  425. fi
  426.  
  427. bigecho "Enabling services on boot..."
  428.  
  429. mkdir -p /etc/network/if-pre-up.d
  430. cat > /etc/network/if-pre-up.d/iptablesload <<'EOF'
  431. #!/bin/sh
  432. iptables-restore < /etc/iptables.rules
  433. exit 0
  434. EOF
  435.  
  436. for svc in fail2ban ipsec xl2tpd; do
  437. update-rc.d "$svc" enable >/dev/null 2>&1
  438. systemctl enable "$svc" 2>/dev/null
  439. done
  440. if ! grep -qs "hwdsl2 VPN script" /etc/rc.local; then
  441. if [ -f /etc/rc.local ]; then
  442. conf_bk "/etc/rc.local"
  443. sed --follow-symlinks -i '/^exit 0/d' /etc/rc.local
  444. else
  445. echo '#!/bin/sh' > /etc/rc.local
  446. fi
  447. cat >> /etc/rc.local <<'EOF'
  448.  
  449. # Added by hwdsl2 VPN script
  450. (sleep 15
  451. service ipsec restart
  452. service xl2tpd restart
  453. [ -f "/usr/sbin/netplan" ] && iptables-restore < /etc/iptables.rules
  454. echo 1 > /proc/sys/net/ipv4/ip_forward)&
  455. exit 0
  456. EOF
  457. fi
  458.  
  459. bigecho "Starting services..."
  460.  
  461. # Reload sysctl.conf
  462. sysctl -e -q -p
  463.  
  464. # Update file attributes
  465. chmod +x /etc/rc.local /etc/network/if-pre-up.d/iptablesload
  466. chmod 600 /etc/ipsec.secrets* /etc/ppp/chap-secrets* /etc/ipsec.d/passwd*
  467.  
  468. # Apply new IPTables rules
  469. iptables-restore < "$IPT_FILE"
  470.  
  471. # Restart services
  472. service fail2ban restart 2>/dev/null
  473. service ipsec restart 2>/dev/null
  474. service xl2tpd restart 2>/dev/null
  475.  
  476. cat <<EOF
  477.  
  478. ================================================
  479.  
  480. IPsec VPN server is now ready for use!
  481.  
  482. Connect to your new VPN with these details:
  483.  
  484. Server IP: $PUBLIC_IP
  485. IPsec PSK: $VPN_IPSEC_PSK
  486. Username: $VPN_USER
  487. Password: $VPN_PASSWORD
  488.  
  489. Write these down. You'll need them to connect!
  490.  
  491. Important notes: https://git.io/vpnnotes
  492. Setup VPN clients: https://git.io/vpnclients
  493.  
  494. ================================================
  495.  
  496. EOF
  497.  
  498. }
  499.  
  500. ## Defer setup until we have the complete script
  501. vpnsetup "$@"
  502.  
  503. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement