210 lines
6.6 KiB
Bash
210 lines
6.6 KiB
Bash
#!/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 <<EOF > $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"
|