#!/bin/bash # Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0 # Importer les fonctions communes source "$(dirname "$0")/../common/common_utils.sh" # Vérifier si le script est exécuté en root check_root # Installer dnsmasq s'il n'est pas déjà installé if ! command -v dnsmasq &> /dev/null; then echo "Installation de dnsmasq..." apt update && apt install -y dnsmasq echo "Installation d'outils réseau..." apt install -y avahi-utils net-tools smbclient nmap systemctl disable --now avahi-daemon else echo "dnsmasq est déjà installé." fi # Récupérer toutes les interfaces réseau sauf loopback mapfile -t NOMS < <(ip -o link show | awk -F': ' '{print $2}' | grep -v lo) if [[ ${#NOMS[@]} -eq 0 ]]; then echo "Aucune interface réseau trouvée." exit 1 fi # Construire les options avec IP si existante OPTIONS=() for IFACE in "${NOMS[@]}"; do # Nettoyer l'interface de @ifX IFACE_CLEAN=$(echo "$IFACE" | cut -d'@' -f1) IP=$(ip -4 -o addr show "$IFACE_CLEAN" 2>/dev/null | awk '{print $4}' | cut -d'/' -f1) if [[ -n "$IP" ]]; then OPTIONS+=("$IFACE_CLEAN ($IP)") else OPTIONS+=("$IFACE_CLEAN (Pas d'IP)") fi done echo "Sélectionnez l'interface réseau à utiliser (IP affichée si existante) :" PS3="Votre choix : " select CHOIX in "${OPTIONS[@]}"; do if [[ -n "$CHOIX" ]]; then INTERFACE=$(echo "$CHOIX" | awk '{print $1}') break else echo "Choix invalide. Veuillez réessayer." fi done # Maintenant que l'interface est choisie, récupérer l'IP IP_EXISTANTE=$(ip -4 -o addr show "$INTERFACE" 2>/dev/null | awk '{print $4}' | cut -d'/' -f1) if [[ -n "$IP_EXISTANTE" ]]; then IP_SERVEUR="$IP_EXISTANTE" else read -rp "Aucune IP détectée sur $INTERFACE. Veuillez entrer une IP à utiliser : " IP_SAISIE IP_SERVEUR="$IP_SAISIE" fi echo "✅ Interface sélectionnée : $INTERFACE" echo "✅ Adresse IP sélectionnée : $IP_SERVEUR" # Vérifier si l'IP est privée ou publique if [[ "$IP_SERVEUR" =~ ^10\. ]] || [[ "$IP_SERVEUR" =~ ^192\.168\. ]] || [[ "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then echo "✅ Adresse IP privée détectée : $IP_SERVEUR" else echo "⚠️ Attention : L'adresse IP $IP_SERVEUR semble PUBLIQUE !" fi FORCE=false if [[ "$1" == "--force" ]]; then FORCE=true echo "Mode forçage activé : reconfiguration complète..." fi DNSMASQ_CONF="/etc/dnsmasq.conf" if grep -q "# CONFIGURE_PAR_CEDRIX" "$DNSMASQ_CONF" && [ "$FORCE" = false ]; then echo "dnsmasq est déjà configuré. Utilisez --force pour reconfigurer." exit 0 fi # Déduire le sous-réseau et proposer des domaines en fonction du réseau détecté if [[ "$IP_SERVEUR" =~ ^10\. ]]; then SOUS_RESEAU=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1".0.0.0/8"}') DHCP_START=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1".0.0.10"}') DHCP_END=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1".0.0.100"}') DOMAIN_SUGGESTIONS=("lan10.local" "private10.local" "intranet10.local") elif [[ "$IP_SERVEUR" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then SOUS_RESEAU=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2".0.0/16"}') DHCP_START=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2".0.10"}') DHCP_END=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2".0.100"}') DOMAIN_SUGGESTIONS=("lan172.local" "private172.local" "intranet172.local") elif [[ "$IP_SERVEUR" =~ ^192\.168\. ]]; then SOUS_RESEAU=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2"."$3".0/24"}') DHCP_START=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2"."$3".10"}') DHCP_END=$(echo "$IP_SERVEUR" | awk -F '.' '{print $1"."$2"."$3".100"}') DOMAIN_SUGGESTIONS=("home.local" "office.local" "lan.local") fi # Afficher les suggestions de domaine et demander à l'utilisateur de choisir echo "Propositions de domaine :" for i in "${!DOMAIN_SUGGESTIONS[@]}"; do echo "[$((i+1))] ${DOMAIN_SUGGESTIONS[$i]}" done echo "[0] Saisir un autre domaine" read -p "Choisissez un domaine (1-${#DOMAIN_SUGGESTIONS[@]}) ou 0 pour entrer le vôtre : " CHOIX_DOMAINE if [[ "$CHOIX_DOMAINE" =~ ^[1-9]+$ ]] && ((CHOIX_DOMAINE >= 1 && CHOIX_DOMAINE <= ${#DOMAIN_SUGGESTIONS[@]})); then DOMAINE=${DOMAIN_SUGGESTIONS[$((CHOIX_DOMAINE-1))]} elif [[ "$CHOIX_DOMAINE" == "0" ]]; then read -p "Entrez votre domaine personnalisé : " DOMAINE if [[ -z "$DOMAINE" ]]; then echo "Domaine invalide." exit 1 fi else echo "Choix invalide." exit 1 fi # Configurer dnsmasq echo "Configuration de dnsmasq..." cat < $DNSMASQ_CONF # CONFIGURE_PAR_CEDRIX # Configuration de dnsmasq # Interface réseau principale interface=$(ip route show default | awk '/default/ {print $5}') listen-address=127.0.0.1,$IP_SERVEUR # Activer le service DHCP dhcp-range=${DHCP_START},${DHCP_END},12h # Associer le nom de domaine domain=${DOMAINE} # Gestion des Alias alias=8.8.8.8,$IP_SERVEUR # Activer la mise à jour DNS dynamique pour les clients DHCP dhcp-authoritative expand-hosts domain-needed no-negcache bogus-priv filterwin2k no-resolv server=9.9.9.9 server=149.112.112.112 # Activer la journalisation pour voir les affectations DHCP/DNS log-queries log-dhcp # Option DHCP dhcp-option=1,255.255.255.0 # Passerelle par défaut dhcp-option=3,$IP_SERVEUR # DNS dhcp-option=6,$IP_SERVEUR # NIS Domain Name # dhcp-option=40,$DOMAINE # Domaine DNS dhcp-option=15,$DOMAINE # TTL des paquests (eviter les boucles réseau) dhcp-option=23,64 # Taille MTU dhcp-option=26,1500 # Désactiver NetBIOS sur Windows dhcp-option=43,01:04:00:00:00:02 # Suffixe DNS dhcp-option=119,$DOMAINE # WPAD (Web Proxy Auto-Discovery Protocol) dhcp-option=252,"\n" dhcp-name-match=set:wpad-ignore,wpad dhcp-ignore-names=tag:wpad-ignore EOF # Redémarrer dnsmasq pour appliquer les modifications systemctl restart dnsmasq # Modifier /etc/resolv.conf echo 'nameserver 127.0.0.1' > /etc/resolv.conf echo "Configuration DNS mise à jour sur 127.0.0.1" # Redémarrer les services nécessaires echo "Redémarrage des services..." for service in dnsmasq systemd-resolved networking NetworkManager; do if systemctl list-unit-files | grep -qw "${service}.service"; then echo "Redémarrage de $service..." if timeout 5s systemctl restart "$service" 2>/dev/null; then echo "$service redémarré." else echo "⚠️ Timeout ou erreur sur $service." fi else echo "Service $service non disponible sur ce système." fi done echo "Configuration terminée avec succès!" echo "Serveur DHCP/DNS fonctionnel sur $IP_SERVEUR" echo "Les clients recevront une IP entre $DHCP_START et $DHCP_END et seront associés au domaine $DOMAINE"