437 lines
14 KiB
Bash
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
|