Advertisement
MertcanGokgoz

Secure WireGuard server installer

Mar 14th, 2019
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 9.56 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # Based On http://bit.ly/2tYrIml
  4. #
  5. # Secure WireGuard server installer is Only Works on Debian 9
  6. #
  7. # Changes
  8. #   - Added IPv6
  9. #   - Improvement Security
  10. #   - BBR Enable
  11. #   - Added Cleanbrowsing DNS
  12. #   - Remove Yandex DNS
  13. #
  14. # Revised by
  15. #   Mertcan GÖKGÖZ - 03.11.2019 20:00 (GMT +3)
  16. #   https://mertcangokgoz.com/
  17. #
  18. # How to use
  19. #   1. Start Terminal
  20. #   2. Change the file permission "chmod +x Wg-Install.sh"
  21. #   3. Choose the options
  22. #   4. Wait For Install
  23. #   5. Enjoy!
  24. #
  25.  
  26. WG_CONFIG="/etc/wireguard/wg0.conf"
  27.  
  28. if [[ "$EUID" -ne 0 ]]; then
  29.     echo "Sorry, you need to run this as root"
  30.     exit
  31. fi
  32.  
  33. if [[ ! -e /dev/net/tun ]]; then
  34.     echo "The TUN device is not available. You need to enable TUN before running this script"
  35.     exit
  36. fi
  37.  
  38. if [ "$( lsb_release -is )" = "Debian" ]; then
  39.   os_ver="$(sed 's/\..*//' /etc/debian_version 2>/dev/null)"
  40.   if [ "$os_ver" != "9" ]; then
  41.     echo "Only supports Debian 9 (Stretch)"
  42.     exit 1
  43.   fi
  44. fi
  45.  
  46. if [ "$( systemd-detect-virt )" == "openvz" ]; then
  47.     echo "OpenVZ virtualization is not supported"
  48.     exit
  49. fi
  50.  
  51. if [ ! -f "$WG_CONFIG" ]; then
  52.     ### Install server and add default client
  53.     INTERACTIVE=${INTERACTIVE:-yes}
  54.     PRIVATE_SUBNET_V4=${PRIVATE_SUBNET_V4:-"10.8.0.0/24"}
  55.     PRIVATE_SUBNET_MASK_V4=$( echo "$PRIVATE_SUBNET_V4" | cut -d "/" -f 2 )
  56.     GATEWAY_ADDRESS_V4="${PRIVATE_SUBNET_V4::-4}1"
  57.     PRIVATE_SUBNET_V6=${PRIVATE_SUBNET_V6:-"fc00:8:0::0/64"}
  58.     PRIVATE_SUBNET_MASK_V6=$( echo "$PRIVATE_SUBNET_V6" | cut -d "/" -f 2 )
  59.     GATEWAY_ADDRESS_V6="${PRIVATE_SUBNET_V6::-4}1"
  60.  
  61.     if [ "$SERVER_HOST" == "" ]; then
  62.         SERVER_HOST="$(wget -O - -q https://checkip.amazonaws.com)"
  63.         if [ "$INTERACTIVE" == "yes" ]; then
  64.             read -r -p "Servers public IP address is $SERVER_HOST. Is that correct? [y/n]: " -e -i "y" CONFIRM
  65.             if [ "$CONFIRM" == "n" ]; then
  66.                 echo "Aborted. Use environment variable SERVER_HOST to set the correct public IP address"
  67.                 exit
  68.             fi
  69.         fi
  70.     fi
  71.  
  72.         echo "What port do you want WireGuard to listen to?"
  73.     echo "   1) Default: 51820"
  74.     echo "   2) Custom"
  75.     echo "   3) Random [2000-65535]"
  76.     until [[ "$PORT_CHOICE" =~ ^[1-3]$ ]]; do
  77.         read -rp "Port choice [1-3]: " -e -i 1 PORT_CHOICE
  78.     done
  79.     case $PORT_CHOICE in
  80.         1)
  81.             SERVER_PORT="51820"
  82.         ;;
  83.         2)
  84.             until [[ "$SERVER_PORT" =~ ^[0-9]+$ ]] && [ "$SERVER_PORT" -ge 1 ] && [ "$SERVER_PORT" -le 65535 ]; do
  85.                 read -rp "Custom port [1-65535]: " -e -i 51820 SERVER_PORT
  86.             done
  87.         ;;
  88.         3)
  89.             # Generate random number within private ports range
  90.             SERVER_PORT=$(shuf -i2000-65535 -n1)
  91.             echo "Random Port: $SERVER_PORT"
  92.         ;;
  93.     esac
  94.  
  95.     if [ "$CLIENT_DNS" == "" ]; then
  96.         echo "Which DNS do you want to use with the VPN?"
  97.         echo "   1) Cloudflare"
  98.         echo "   2) Google"
  99.         echo "   3) OpenDNS"
  100.         echo "   4) AdGuard(Only IPv4)"
  101.         echo "   5) AdGuard Family Protection(Only IPv4)"
  102.         echo "   6) Quad9(Only IPv4)"
  103.         echo "   7) Quad9 Uncensored(Only IPv4)"
  104.         echo "   8) FDN(Only IPv4)"
  105.         echo "   9) DNS.WATCH(Only IPv4)"
  106.         echo "   10) Cleanbrowsing Security Filter"
  107.         read -r -p "DNS [1-10]: " -e -i 1 DNS_CHOICE
  108.  
  109.         case $DNS_CHOICE in
  110.             1)
  111.             CLIENT_DNS="1.1.1.1,2606:4700:4700::1111"
  112.             ;;
  113.             2)
  114.             CLIENT_DNS="8.8.8.8,2001:4860:4860::8888"
  115.             ;;
  116.             3)
  117.             CLIENT_DNS="208.67.222.222,2620:119:35::35"
  118.             ;;
  119.             4)
  120.             CLIENT_DNS="176.103.130.130,176.103.130.131"
  121.             ;;
  122.             5)
  123.             CLIENT_DNS="176.103.130.132,176.103.130.134"
  124.             ;;
  125.             6)
  126.             CLIENT_DNS="9.9.9.9,149.112.112.112"
  127.             ;;
  128.             7)
  129.             CLIENT_DNS="9.9.9.10,149.112.112.10"
  130.             ;;
  131.             8)
  132.             CLIENT_DNS="80.67.169.40,80.67.169.12"
  133.             ;;
  134.             9)
  135.             CLIENT_DNS="84.200.69.80,84.200.70.40"
  136.             ;;
  137.             10)
  138.             CLIENT_DNS="185.228.168.9,2a0d:2a00:1::2"
  139.             ;;
  140.         esac
  141.        
  142.     fi
  143.    
  144.     echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
  145.     printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
  146.     apt-get update
  147.     apt-get upgrade -y
  148.     apt-get dist-upgrade -y
  149.     apt-get autoremove clean -y
  150.     apt-get install build-essential dkms git haveged -y
  151.     apt-get install linux-headers-"$(uname -r)" -y && modprobe wireguard
  152.     apt-get install wireguard qrencode iptables-persistent -y
  153.  
  154.     # Generate Keys
  155.     SERVER_PRIVKEY=$( wg genkey )
  156.     SERVER_PUBKEY=$( echo "$SERVER_PRIVKEY" | wg pubkey )
  157.     CLIENT_PRIVKEY=$( wg genkey )
  158.     CLIENT_PUBKEY=$( echo "$CLIENT_PRIVKEY" | wg pubkey )
  159.     PRESHARED_KEY=$( echo "$(wg genpsk)" )
  160.     CLIENT_ADDRESS_V4="${PRIVATE_SUBNET_V4::-4}3"
  161.     CLIENT_ADDRESS_V6="${PRIVATE_SUBNET_V6::-4}3"
  162.  
  163.     mkdir -p /etc/wireguard
  164.     touch $WG_CONFIG && chmod 600 $WG_CONFIG
  165.  
  166.     echo "# $PRIVATE_SUBNET_V4 $PRIVATE_SUBNET_V6 $SERVER_HOST:$SERVER_PORT $SERVER_PUBKEY $CLIENT_DNS
  167. [Interface]
  168. Address = $GATEWAY_ADDRESS_V4/$PRIVATE_SUBNET_MASK_V4, $GATEWAY_ADDRESS_V6/$PRIVATE_SUBNET_MASK_V6
  169. ListenPort = $SERVER_PORT
  170. PrivateKey = $SERVER_PRIVKEY
  171. PostUp = echo nameserver $CLIENT_DNS; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  172. PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
  173. SaveConfig = false" > $WG_CONFIG
  174.  
  175.     echo "# client
  176. [Peer]
  177. PublicKey = $CLIENT_PUBKEY
  178. PresharedKey = $PRESHARED_KEY
  179. AllowedIPs = $CLIENT_ADDRESS_V4/32, $CLIENT_ADDRESS_V6/128" >> $WG_CONFIG
  180.  
  181.     echo "[Interface]
  182. PrivateKey = $CLIENT_PRIVKEY
  183. Address = $CLIENT_ADDRESS_V4/$PRIVATE_SUBNET_MASK_V4, $CLIENT_ADDRESS_V6/$PRIVATE_SUBNET_MASK_V6
  184. DNS = $CLIENT_DNS
  185. MTU = 1420
  186.  
  187. [Peer]
  188. PublicKey = $SERVER_PUBKEY
  189. PresharedKey = $PRESHARED_KEY
  190. AllowedIPs = 0.0.0.0/0, ::/0
  191. Endpoint = $SERVER_HOST:$SERVER_PORT
  192. PersistentKeepalive = 25" > "$HOME"/client-wg0.conf
  193.  
  194.     {
  195.         echo "net.ipv4.ip_forward=1"
  196.         echo "net.ipv4.conf.all.forwarding=1"
  197.         echo "net.ipv6.conf.all.forwarding=1"
  198.         echo "net.core.default_qdisc=fq"
  199.         echo "net.ipv4.tcp_congestion_control=bbr"
  200.     } >> /etc/sysctl.conf
  201.     sysctl -p
  202.  
  203.     iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT   
  204.     ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT  
  205.     iptables -A FORWARD -m conntrack --ctstate NEW -s "$PRIVATE_SUBNET_V4" -m policy --pol none --dir in -j ACCEPT 
  206.     ip6tables -A FORWARD -m conntrack --ctstate NEW -s "$PRIVATE_SUBNET_V6" -m policy --pol none --dir in -j ACCEPT
  207.     iptables -t nat -A POSTROUTING -s "$PRIVATE_SUBNET_V4" -m policy --pol none --dir out -j MASQUERADE
  208.     ip6tables -t nat -A POSTROUTING -s "$PRIVATE_SUBNET_V6" -m policy --pol none --dir out -j MASQUERADE   
  209.     iptables -A INPUT -p udp --dport "$SERVER_PORT" -j ACCEPT  
  210.     ip6tables -A INPUT -p udp --dport "$SERVER_PORT" -j ACCEPT 
  211.     iptables-save > /etc/iptables/rules.v4 
  212.  
  213.     systemctl enable wg-quick@wg0.service
  214.     systemctl start wg-quick@wg0.service
  215.  
  216.     git clone https://git.zx2c4.com/blind-operator-mode
  217.     cd blind-operator-mode || exit
  218.     make
  219.     make install
  220.     sysctl -w net.ipv4.ping_group_range="0 0"
  221.     cd "$HOME" || exit
  222.  
  223.     qrencode -t ansiutf8 -l L < "$HOME"/client-wg0.conf
  224.     echo "Client config --> $HOME/client-wg0.conf"
  225.     echo "Now reboot the server and enjoy your fresh VPN installation! :^)"
  226. else
  227.     ### Server is installed, add a new client
  228.     CLIENT_NAME="$1"
  229.     if [ "$CLIENT_NAME" == "" ]; then
  230.         echo "Tell me a name for the client config file. Use one word only, no special characters."
  231.         read -r -p "Client name: " -e CLIENT_NAME
  232.     fi
  233.     CLIENT_PRIVKEY=$( wg genkey )
  234.     CLIENT_PUBKEY=$( echo "$CLIENT_PRIVKEY" | wg pubkey )
  235.     PRIVATE_SUBNET_V4=$( head -n1 $WG_CONFIG | awk '{print $2}')
  236.     PRIVATE_SUBNET_MASK_V4=$( echo "$PRIVATE_SUBNET_V4" | cut -d "/" -f 2 )
  237.     PRIVATE_SUBNET_V6=$( head -n1 $WG_CONFIG | awk '{print $3}')
  238.     PRIVATE_SUBNET_MASK_V6=$( echo "$PRIVATE_SUBNET_V6" | cut -d "/" -f 2 )
  239.     SERVER_ENDPOINT=$( head -n1 $WG_CONFIG | awk '{print $4}')
  240.     SERVER_PUBKEY=$( head -n1 $WG_CONFIG | awk '{print $5}')
  241.     CLIENT_DNS=$( head -n1 $WG_CONFIG | awk '{print $6}')
  242.     LASTIP4=$( grep "/32" $WG_CONFIG | tail -n1 | awk '{print $3}' | cut -d "/" -f 1 | cut -d "." -f 4 )
  243.     LASTIP6=$( grep "/64" $WG_CONFIG | tail -n1 | awk '{print $6}' | cut -d "/" -f 1 | cut -d "." -f 4 )
  244.     CLIENT_ADDRESS_V4="${PRIVATE_SUBNET_V4::-4}$((LASTIP4+1))"
  245.     CLIENT_ADDRESS_V6="${PRIVATE_SUBNET_V6::-4}$((LASTIP6+1))"
  246.     echo "# $CLIENT_NAME
  247. [Peer]
  248. PublicKey = $CLIENT_PUBKEY
  249. AllowedIPs = $CLIENT_ADDRESS_V4/32, $CLIENT_ADDRESS_V6/128" >> $WG_CONFIG
  250.  
  251.     echo "[Interface]
  252. PrivateKey = $CLIENT_PRIVKEY
  253. Address = $CLIENT_ADDRESS_V4/$PRIVATE_SUBNET_MASK_V4, $CLIENT_ADDRESS_V6/$PRIVATE_SUBNET_MASK_V6
  254. DNS = $CLIENT_DNS
  255. BlockDNS = true
  256. MTU = 1420
  257.  
  258. [Peer]
  259. PublicKey = $SERVER_PUBKEY
  260. PresharedKey = $PRESHARED_KEY
  261. AllowedIPs = 0.0.0.0/0, ::/0
  262. Endpoint = $SERVER_ENDPOINT
  263. PersistentKeepalive = 25" > "$HOME"/"$CLIENT_NAME"-wg0.conf
  264. qrencode -t ansiutf8 -l L < "$HOME"/"$CLIENT_NAME"-wg0.conf
  265.  
  266.     ip address | grep -q wg0 && wg set wg0 peer "$CLIENT_PUBKEY" allowed-ips "$CLIENT_ADDRESS_V4/32 , $CLIENT_ADDRESS_V6/64"
  267.     echo "Client added, new configuration file --> $HOME/$CLIENT_NAME-wg0.conf"
  268. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement