Afficher les connexions réseau actives et les ports ouverts sous Linux

ss -tulnp

La commande ss -tulnp est utilisée sous Linux pour afficher les connexions réseau actives et les ports ouverts sur sa machine. Voici ce que chaque option signifie :

-t : Affiche les connexions TCP.
-u : Affiche les connexions UDP.
-l : Affiche uniquement les ports en écoute (listening).
-n : Affiche les numéros de port au lieu de résoudre les noms de service (plus rapide).
-p : Affiche le processus (PID et nom) qui utilise le port.

À quoi ça sert ?

Vérifier quels ports sont ouverts sur sa machine.
Savoir quels services écoutent sur ces ports.
Identifier quel processus utilise un port (utile pour déboguer ou arrêter un service).
Diagnostiquer des problèmes réseau (ex : un service ne démarre pas à cause d’un port déjà utilisé).

Scanner son réseau local

Nom du fichier : ScanReseauLocal.sh

#!/bin/bash

# Si on n'est pas dans un terminal, se relancer dans mate-terminal
if ! [ -t 1 ]; then
    mate-terminal -- bash -c "sudo bash '$0'; exec bash"
    exit
fi

# =============================================================
#  ScanReseauLocal.sh — Scanner réseau local (Debian)
#  Dépendances : nmap       →  sudo apt install nmap
#  Optionnelles : avahi-utils →  sudo apt install avahi-utils (mDNS)
# =============================================================

# Utilisation :

# Scan automatique (détecte ton réseau tout seul)
# sudo ~/Bureau/ScanReseauLocal.sh

# Scan sur une plage personnalisée
# sudo ~/Bureau/ScanReseauLocal.sh 192.168.1.0/24

# Scan + ports ouverts d'un appareil précis
# sudo ~/Bureau/ScanReseauLocal.sh --ports 192.168.0.42

set -uo pipefail

# ── Couleurs ─────────────────────────────────────────────────
BOLD='\033[1m'
CYAN='\033[0;36m'
GREEN='\033[0;32m'
ORANGE='\033[38;5;214m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m'

# ── Vérifications préalables ─────────────────────────────────
check_deps() {
    local missing=()
    for cmd in nmap ip; do
        command -v "$cmd" &>/dev/null || missing+=("$cmd")
    done
    if [[ ${#missing[@]} -gt 0 ]]; then
        echo -e "${RED}Dépendances manquantes : ${missing[*]}${NC}"
        echo -e "Installe-les avec : ${ORANGE}sudo apt install nmap iproute2${NC}"
        exit 1
    fi

    # Avertissement si avahi-resolve manque
    if ! command -v avahi-resolve &>/dev/null; then
        echo -e "${YELLOW}⚠  avahi-resolve non installé : device name (mDNS) indisponible${NC}"
        echo -e "   ${ORANGE}sudo apt install avahi-utils${NC}"
        echo
    fi
}

# ── Détection automatique du réseau actif ────────────────────
detect_network() {
    local cidr
    cidr=$(ip -4 addr show scope global \
           | grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+/\d+' \
           | head -1)

    if [[ -z "$cidr" ]]; then
        echo -e "${RED}Impossible de détecter le réseau. Vérif ta connexion.${NC}"
        exit 1
    fi
    echo "$cidr"
}

# ── Résolution du device name via mDNS ───────────────────────
resolve_device_name() {
    local ip="$1"
    local name=""

    if command -v avahi-resolve &>/dev/null; then
        local mdns
        mdns=$(avahi-resolve -a "$ip" 2>/dev/null \
               | awk '{print $2}' \
               | sed 's/\.local\.$//')
        [[ -n "$mdns" ]] && name="$mdns (mDNS)"
    fi

    echo "$name"
}

# ── Scan principal ───────────────────────────────────────────
scan_network() {
    local cidr="$1"

    echo
    echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
    echo -e "${BOLD}${CYAN}   🔍  SCAN RÉSEAU LOCAL                  ${NC}"
    echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
    echo -e "  Plage cible : ${ORANGE}${cidr}${NC}"
    echo -e "  Démarré le  : $(date '+%d/%m/%Y %H:%M:%S')"
    echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
    echo

    local raw
    raw=$(sudo nmap -sn -T4 \
        -PE -PP \
        -PS21,22,23,25,80,443,445,3389,8080 \
        -PA80,443 \
        -PR \
        "$cidr" 2>/dev/null)

    local count=0

    while IFS= read -r line; do
        if [[ "$line" =~ ^"Nmap scan report for " ]]; then
            local host="${line#Nmap scan report for }"
            local ip hostname
            local regex='\(([^)]+)\)$'
            if [[ "$host" =~ $regex ]]; then
                hostname="${host%% (*}"
                ip="${BASH_REMATCH[1]}"
            else
                ip="$host"
                hostname=""
            fi

            local mac vendor mac_line
            mac_line=$(echo "$raw" | grep -A3 "^Nmap scan report for ${host}$" \
                        | grep "MAC Address" || true)
            if [[ -n "$mac_line" ]]; then
                mac=$(echo "$mac_line" | awk '{print $3}')
                vendor=$(echo "$mac_line" | sed 's/.*(\(.*\))/\1/')
            else
                mac="N/A (machine locale ou accès limité)"
                vendor=""
            fi

            # Résolution du device name
            local device_name
            device_name=$(resolve_device_name "$ip")

            count=$(( count + 1 ))
            echo -e "  ${BOLD}${GREEN}▸ Appareil #${count}${NC}"
            echo -e "    IP          : ${ORANGE}${ip}${NC}"
            [[ -n "$hostname" ]] && \
                echo -e "    Hostname    : ${CYAN}${hostname}${NC}"
            [[ -n "$device_name" ]] && \
                echo -e "    Device name : ${YELLOW}${device_name}${NC}"
            echo -e "    MAC         : ${mac}"
            [[ -n "$vendor" ]] && \
                echo -e "    Fabricant   : ${vendor}"
            echo
        fi
    done <<< "$raw"

    echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
    echo -e "  ${BOLD}${GREEN}${count} appareil(s) détecté(s)${NC}"
    echo -e "${BOLD}${CYAN}══════════════════════════════════════════${NC}"
    echo
}

# ── Optionnel : scan de ports sur un appareil ────────────────
scan_ports() {
    local ip="$1"
    echo
    echo -e "${BOLD}${CYAN}── Scan des ports ouverts sur ${ip} ─────────${NC}"
    sudo nmap -T4 --open --top-ports 100 "$ip" 2>/dev/null \
        | grep -E "^[0-9]+/(tcp|udp)|Nmap scan" \
        | sed "s/^/  /"
    echo
}

# ── Point d'entrée ───────────────────────────────────────────
main() {
    check_deps

    local cidr="${1:-}"
    local port_ip=""

    while [[ $# -gt 0 ]]; do
        case "$1" in
            --ports)
                port_ip="${2:-}"
                shift 2
                ;;
            *)
                cidr="$1"
                shift
                ;;
        esac
    done

    [[ -z "$cidr" ]] && cidr=$(detect_network)

    scan_network "$cidr"

    if [[ -n "$port_ip" ]]; then
        scan_ports "$port_ip"
    fi
}

main "$@"