From daf02514a9a5819225c9ff2af2aa048c6117dc01 Mon Sep 17 00:00:00 2001 From: kiu Date: Tue, 24 Sep 2024 22:47:43 +0200 Subject: [PATCH] V1 --- README.md | 3 + auto-wireguard_rocky_ubuntu.sh | 436 +++++++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+) create mode 100644 README.md create mode 100644 auto-wireguard_rocky_ubuntu.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..cbf899e --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Wireguard Install Auto + +Installe automatique de wireguard sous Rocky Linux 8 et Ubuntu \ No newline at end of file diff --git a/auto-wireguard_rocky_ubuntu.sh b/auto-wireguard_rocky_ubuntu.sh new file mode 100644 index 0000000..90e38c4 --- /dev/null +++ b/auto-wireguard_rocky_ubuntu.sh @@ -0,0 +1,436 @@ +#!/bin/bash + +#Code couleur +RED='\033[0;31m' +ORANGE='\033[0;33m' +NC='\033[0m' +GREEN='\033[0;32m' +# + +function isRoot() { + if [ "${EUID}" -ne 0 ]; then + echo "Vous devez exécuter ce script en tant que root" + exit 1 + fi +} + +function checkOS() { + # Vérifie la version du système d'exploitation (RockyLinux) + if [[ -e /etc/rocky-release ]]; then + source /etc/os-release + OS=rocky + elif [[ -e /etc/os-release ]]; then + source /etc/os-release + OS="ubuntu" + elif [[ -e /etc/os-release ]]; then + source /etc/os-release + OS="debian" + else + echo "Il semble que vous n'exécutez pas ce programme d'installation sur un système compatible" + exit 1 + fi +} + +function initialCheck() { + checkOS + isRoot +} + +function installQuestions() { + echo -e "\n${GREEN}Bienvenue dans le programme d'installation de WireGuard !${NC}" + echo "" + echo "Avant de continuer je dois vous poser quelques questions." + echo "Vous pouvez laisser les options par défaut et appuyer simplement sur Entrée si elles vous conviennent." + echo "" + + # Détecter l'adresse IPv4 publique et pré-remplir pour l'utilisateur + SERVER_PUB_IP=$(wget -qO- icanhazip.com) + if [[ ${SERVER_PUB_IP} ]]; + then + read -rp "Adresse publique IPv4 : " -e -i "${SERVER_PUB_IP}" SERVER_PUB_IP + + # Détecter l'interface publique et pré-remplir pour l'utilisateur + SERVER_NIC="$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | head -1)" + until [[ ${SERVER_PUB_NIC} =~ ^[a-zA-Z0-9_]+$ ]]; do + read -rp "Interface LAN (Public) : " -e -i "${SERVER_NIC}" SERVER_PUB_NIC + done + + until [[ ${SERVER_WG_NIC} =~ ^[a-zA-Z0-9_]+$ && ${#SERVER_WG_NIC} -lt 16 ]]; do + read -rp "Nom de l'interface WireGuard (Vous pouvez mettre ce que vous voulez) : " -e -i wg0 SERVER_WG_NIC + done + + until [[ ${SERVER_WG_IPV4} =~ ^([0-9]{1,3}\.){3} ]]; do + read -rp "IPv4 du tunel WireGuard (à modifier si vous le voulez) : " -e -i 10.8.0.1 SERVER_WG_IPV4 + done + + # Générer un nombre aléatoire dans la plage de ports privés + RANDOM_PORT=$(shuf -i49152-65535 -n1) + until [[ ${SERVER_PORT} =~ ^[0-9]+$ ]] && [ "${SERVER_PORT}" -ge 1 ] && [ "${SERVER_PORT}" -le 65535 ]; do + read -rp "Port du serveur WireGuard [1-65535]: " -e -i "${RANDOM_PORT}" SERVER_PORT + done + + # FFDN DNS par défaut + until [[ ${CLIENT_DNS_1} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; do + read -rp "Premier résolveur DNS à utiliser pour les clients : " -e -i 80.67.169.12 CLIENT_DNS_1 + done + until [[ ${CLIENT_DNS_2} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; do + read -rp "Deuxième résolveur DNS à utiliser pour les clients (facultatif) : " -e -i 80.67.169.40 CLIENT_DNS_2 + if [[ ${CLIENT_DNS_2} == "" ]]; then + CLIENT_DNS_2="${CLIENT_DNS_1}" + fi + done + + echo "" + echo "D'accord, c'était tout ce dont j'avais besoin. Nous sommes prêts à configurer votre serveur WireGuard maintenant." + echo "Vous pourrez générer un client à la fin de l'installation avec un fichier de configuration et un QRCode" + read -n1 -r -p "Appuyez sur n'importe quelle touche pour continuer..." +fi +} + +function installWireGuard() { + # Exécutez d'abord les questions de configuration + installQuestions + + # Installer les outils et le module WireGuard + if [[ ${OS} == 'rocky' ]]; then + dnf install epel-release elrepo-release -y + dnf update -y && dnf install kmod-wireguard wireguard-tools iptables qrencode -y + + elif [[ ${OS} == 'ubuntu' ]]; then + apt update -y + apt install wireguard iptables resolvconf qrencode -y + + elif [[ ${OS} == 'debian' ]]; then + apt update -y + apt install wireguard iptables resolvconf qrencode -y + # Activer le service resolvconf + systemctl enable resolvconf + # Ajouter les serveurs DNS à la configuration resolvconf + echo "nameserver ${CLIENT_DNS_1}" > /etc/resolvconf/resolv.conf.d/base + echo "nameserver ${CLIENT_DNS_2}" >> /etc/resolvconf/resolv.conf.d/base + # Mettre à jour la configuration resolvconf + resolvconf -u + # Redémarrer le service réseau pour que les modifications prennent effet + systemctl restart networking + fi + + # Assurez que le répertoire existe + mkdir /etc/wireguard >/dev/null 2>&1 + + chmod 600 -R /etc/wireguard/ + + SERVER_PRIV_KEY=$(wg genkey) + SERVER_PUB_KEY=$(echo "${SERVER_PRIV_KEY}" | wg pubkey) + + # Enregistrer les paramètres WireGuard + echo "SERVER_PUB_IP=${SERVER_PUB_IP} +SERVER_PUB_NIC=${SERVER_PUB_NIC} +SERVER_WG_NIC=${SERVER_WG_NIC} +SERVER_WG_IPV4=${SERVER_WG_IPV4} +SERVER_PORT=${SERVER_PORT} +SERVER_PRIV_KEY=${SERVER_PRIV_KEY} +SERVER_PUB_KEY=${SERVER_PUB_KEY} +CLIENT_DNS_1=${CLIENT_DNS_1} +CLIENT_DNS_2=${CLIENT_DNS_2}" >/etc/wireguard/params + + # Ajouter une interface serveur + echo "[Interface] +Address = ${SERVER_WG_IPV4}/24 +ListenPort = ${SERVER_PORT} +PrivateKey = ${SERVER_PRIV_KEY}" >"/etc/wireguard/${SERVER_WG_NIC}.conf" + + if pgrep firewalld; then + FIREWALLD_IPV4_ADDRESS=$(echo "${SERVER_WG_IPV4}" | cut -d"." -f1-3)".0" + echo "PostUp = firewall-cmd --add-port ${SERVER_PORT}/udp && firewall-cmd --add-rich-rule='rule family=ipv4 source address=${FIREWALLD_IPV4_ADDRESS}/24 masquerade' +PostDown = firewall-cmd --remove-port ${SERVER_PORT}/udp && firewall-cmd --remove-rich-rule='rule family=ipv4 source address=${FIREWALLD_IPV4_ADDRESS}/24 masquerade'" >>"/etc/wireguard/${SERVER_WG_NIC}.conf" + else + echo "PostUp = iptables -A FORWARD -i ${SERVER_PUB_NIC} -o ${SERVER_WG_NIC} -j ACCEPT; iptables -A FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; iptables -t nat -A POSTROUTING -o ${SERVER_PUB_NIC} -s 10.8.0.0/24 -j MASQUERADE; ip6tables -A FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE +PostDown = iptables -D FORWARD -i ${SERVER_PUB_NIC} -o ${SERVER_WG_NIC} -j ACCEPT; iptables -D FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; iptables -t nat -D POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE; ip6tables -D FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE" >>"/etc/wireguard/${SERVER_WG_NIC}.conf" + fi + + # Activer le routage sur le serveur + echo "net.ipv4.ip_forward = 1" >/etc/sysctl.d/wg.conf + + sysctl --system + + systemctl start "wg-quick@${SERVER_WG_NIC}" + systemctl enable "wg-quick@${SERVER_WG_NIC}" + + newClient + echo "Si vous souhaitez ajouter d'autres clients, il vous suffit d'exécuter ce script une autre fois !" + + # Vérifiez si WireGuard est en cours d'exécution + systemctl is-active --quiet "wg-quick@${SERVER_WG_NIC}" + WG_RUNNING=$? + + # WireGuard pourrait ne pas fonctionner si nous mettions à jour le noyau. Dit à l'utilisateur de redémarrer. + if [[ ${WG_RUNNING} -ne 0 ]]; then + echo -e "\n${RED}AVERTISSEMENT : WireGuard ne semble pas fonctionner.${NC}" + echo -e "${ORANGE}Vous pouvez vérifier si WireGuard fonctionne avec : systemctl status wg-quick@${SERVER_WG_NIC}${NC}" + echo -e "${ORANGE}Si vous obtenez quelque chose comme \"Impossible de trouver l'appareil ${SERVER_WG_NIC}\", s'il vous plaît redémarrez !${NC}" + fi +} + +function newClient() { + ENDPOINT="${SERVER_PUB_IP}:${SERVER_PORT}" + + echo "" + echo "Donnez moi un nom pour le client." + echo "Le nom doit être composé de caractères alphanumériques. Il peut également inclure un trait de soulignement ou un tiret et ne peut pas dépasser 15 caractères." + + until [[ ${CLIENT_NAME} =~ ^[a-zA-Z0-9_-]+$ && ${CLIENT_EXISTS} == '0' && ${#CLIENT_NAME} -lt 16 ]]; do + read -rp "Nom du client : " -e CLIENT_NAME + CLIENT_EXISTS=$(grep -c -E "^### Client ${CLIENT_NAME}\$" "/etc/wireguard/${SERVER_WG_NIC}.conf") + + if [[ ${CLIENT_EXISTS} == '1' ]]; then + echo "" + echo "Un client avec le nom spécifié a déjà été créé, veuillez choisir un autre nom." + echo "" + fi + done + + for DOT_IP in {2..254}; do + DOT_EXISTS=$(grep -c "${SERVER_WG_IPV4::-1}${DOT_IP}" "/etc/wireguard/${SERVER_WG_NIC}.conf") + if [[ ${DOT_EXISTS} == '0' ]]; then + break + fi + done + + if [[ ${DOT_EXISTS} == '1' ]]; then + echo "" + echo "Le sous-réseau configuré ne prend en charge que 253 clients." + exit 1 + fi + + BASE_IP=$(echo "$SERVER_WG_IPV4" | awk -F '.' '{ print $1"."$2"."$3 }') + until [[ ${IPV4_EXISTS} == '0' ]]; do + read -rp "IPv4 du client WireGuard : ${BASE_IP}." -e -i "${DOT_IP}" DOT_IP + CLIENT_WG_IPV4="${BASE_IP}.${DOT_IP}" + IPV4_EXISTS=$(grep -c "$CLIENT_WG_IPV4/24" "/etc/wireguard/${SERVER_WG_NIC}.conf") + + if [[ ${IPV4_EXISTS} == '1' ]]; then + echo "" + echo "Un client avec l'IPv4 spécifié a déjà été créé, veuillez choisir un autre IPv4." + echo "" + fi + done + + # Générer une paire de clés pour le client + CLIENT_PRIV_KEY=$(wg genkey) + CLIENT_PUB_KEY=$(echo "${CLIENT_PRIV_KEY}" | wg pubkey) + CLIENT_PRE_SHARED_KEY=$(wg genpsk) + + # Répertoire personnel de l'utilisateur, où sera écrite la configuration du client + mkdir /Wireguard + if [ -e "/Wireguard" ]; then + # si $1 est un nom d'utilisateur + HOME_DIR="/Wireguard" + elif [ "${SUDO_USER}" ]; then + # sinon, utilisez SUDO_USER + if [ "${SUDO_USER}" == "root" ]; then + # Si vous exécutez sudo en tant que root + HOME_DIR="/Wireguard" + else + HOME_DIR="/Wireguard" + fi + else + # sinon SUDO_USER, utilisez /root + HOME_DIR="/Wireguard" + fi + +# Créer une liste vide pour stocker les réseaux locaux +local_networks=() + +# Demander à l'utilisateur d'entrer les réseaux locaux +while true; do + read -rp "Entrez un réseau local (ou 'q' pour quitter) : " network + if [[ $network == "q" ]]; then + break + fi + local_networks+=("$network") +done + +# Convertir la liste des réseaux locaux en une seule chaîne, séparée par des virgules +allowed_ips=$(IFS=,; echo "${local_networks[*]}") + +# Créer un fichier client et ajouter le serveur en tant que pair +echo "[Interface] +PrivateKey = ${CLIENT_PRIV_KEY} +Address = ${CLIENT_WG_IPV4}/32 +DNS = ${CLIENT_DNS_1},${CLIENT_DNS_2} + +[Peer] +PublicKey = ${SERVER_PUB_KEY} +PresharedKey = ${CLIENT_PRE_SHARED_KEY} +Endpoint = ${ENDPOINT} +AllowedIPs = ${allowed_ips}" >>"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + + # Ajouter le client en tant qu'homologue au serveur + echo -e "\n### Client ${CLIENT_NAME} +[Peer] +PublicKey = ${CLIENT_PUB_KEY} +PresharedKey = ${CLIENT_PRE_SHARED_KEY} +AllowedIPs = ${CLIENT_WG_IPV4}/32" >>"/etc/wireguard/${SERVER_WG_NIC}.conf" + + wg syncconf "${SERVER_WG_NIC}" <(wg-quick strip "${SERVER_WG_NIC}") + + echo -e "\nVoici votre fichier de configuration client sous forme de QR Code :" + + qrencode -t ansiutf8 -l L <"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + echo "Le fichier de configuration est disponible en ${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + qrencode -s 20 -o "${HOME_DIR}/${CLIENT_NAME}.png" <"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + echo "Le QR code est sauvegarder dans ${HOME_DIR}/${CLIENT_NAME}.png" + read -n1 -r -p "Appuyez sur n'importe quelle touche pour continuer..." +} + +function revokeClient() { + NUMBER_OF_CLIENTS=$(grep -c -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf") + if [[ ${NUMBER_OF_CLIENTS} == '0' ]]; then + echo "" + echo "Vous n'avez aucun client existant !" + exit 1 + fi + + echo "" + echo "Sélectionnez le client existant que vous souhaitez révoquer" + grep -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf" | cut -d ' ' -f 3 | nl -s ') ' + until [[ ${CLIENT_NUMBER} -ge 1 && ${CLIENT_NUMBER} -le ${NUMBER_OF_CLIENTS} ]]; do + if [[ ${CLIENT_NUMBER} == '1' ]]; then + read -rp "Sélectionnez un client [1]: " CLIENT_NUMBER + else + read -rp "Sélectionnez un client [1-${NUMBER_OF_CLIENTS}]: " CLIENT_NUMBER + fi + done + + # faire correspondre le numéro sélectionné à un nom de client + CLIENT_NAME=$(grep -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf" | cut -d ' ' -f 3 | sed -n "${CLIENT_NUMBER}"p) + + # supprimer le bloc [Peer] correspondant à $CLIENT_NAME + sed -i "/^### Client ${CLIENT_NAME}\$/,/^$/d" "/etc/wireguard/${SERVER_WG_NIC}.conf" + + # supprimer le fichier client généré + rm -f "/Wireguard/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + #Supprimer le fichier QRCode + rm -f "/Wireguard/${CLIENT_NAME}.png" + + # redémarrer wireguard pour appliquer les modifications + wg syncconf "${SERVER_WG_NIC}" <(wg-quick strip "${SERVER_WG_NIC}") +} + +function uninstallWg() { + echo "" + read -rp "Voulez-vous vraiment supprimer WireGuard ? [y/n]: " -e -i n REMOVE + if [[ $REMOVE == 'y' ]]; then + checkOS + + systemctl stop "wg-quick@${SERVER_WG_NIC}" + systemctl disable "wg-quick@${SERVER_WG_NIC}" + + if [[ ${OS} == 'rocky' ]]; then + yum -y remove kmod-wireguard wireguard-tools qrencode epel-release elrepo-release yum-plugin-elrepo iptables + yum -y autoremove + elif [[ ${OS} == 'ubuntu' ]]; then + apt-get autoremove --purge -y wireguard qrencode + elif [[ ${OS} == 'debian' ]]; then + apt-get autoremove --purge -y wireguard qrencode + fi + + rm -rf /etc/wireguard + rm -f /etc/sysctl.d/wg.conf + rm -f /Wireguard + + # Recharger sysctl + sysctl --system + + # Vérifiez si WireGuard est en cours d'exécution + systemctl is-active --quiet "wg-quick@${SERVER_WG_NIC}" + WG_RUNNING=$? + + if [[ ${WG_RUNNING} -eq 0 ]]; then + echo "WireGuard n'a pas réussi à désinstaller correctement." + exit 1 + else + echo "WireGuard a été désinstallé avec succès." + exit 0 + fi + else + echo "" + echo "Suppression annulée !" + fi +} +function systemctlstatus() { + echo "" + systemctl status "wg-quick@${SERVER_WG_NIC}" +} +function systemctlstop() { + echo "" + systemctl stop "wg-quick@${SERVER_WG_NIC}" +} +function systemctlstart() { + echo "" + systemctl start "wg-quick@${SERVER_WG_NIC}" +} +function systemctlrestart() { + echo "" + systemctl restart "wg-quick@${SERVER_WG_NIC}" +} +function sexit() { + echo "" + exit +} +function manageMenu() { +clear + echo -e "\n${GREEN}Bienvenue sur WireGuard-Configuration !${NC}" + echo "" + echo "Que voulez vous faire?" + echo " 1) Ajouter un nouveau client" + echo " 2) Révoquer un client existant" + echo " 3) Vérifier le status de WireGuard" + echo " 4) Arreter Wireguard" + echo " 5) Démarrer Wireguard" + echo " 6) Redémarrer Wireguard" + echo -e " ${RED}7) /!\ Désinstaller WireGuard${NC}" + echo "Control + C pour quitter" + until [[ ${MENU_OPTION} =~ ^[1-8]$ ]]; do + read -rp "Sélectionnez une option [1-7]: " MENU_OPTION + done + case "${MENU_OPTION}" in + 1) + newClient + ;; + 2) + revokeClient + ;; + 3) + systemctlstatus + ;; + 4) + systemctlstop + ;; + 5) + systemctlstart + ;; + 6) + systemctlrestart + ;; + 8) + uninstallWg + ;; + + esac +} + +# Vérifiez OS... +initialCheck + +# Vérifiez si WireGuard est déjà installé et chargez les paramètres +if [[ -e /etc/wireguard/params ]]; then + source /etc/wireguard/params + manageMenu +else + installWireGuard +fi +while [ wireguardre ] +do + ./auto-wireguard_rocky_ubuntu.sh +done