Wireguard-install-auto/auto-wireguard_rocky_ubuntu.sh
2024-09-24 22:47:43 +02:00

437 lines
14 KiB
Bash

#!/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