Vue d’ensemble — à quoi sert cet écran
Connexions IP est le deuxième écran d’Infrastructure ▸ Connectivité et trafic (la host view). Là où Connexions de ports s’articule autour de « port → serveur », cet écran s’articule autour de « serveur (hôte) → IP distante ». Chaque carte de serveur énumère les IP distantes actuellement connectées à ce serveur, classées par intensité de connexion, et affiche pour chaque IP un point d’intensité de sessions par port supervisé. L’objectif est de voir d’un coup d’œil quelle IP frappe quel serveur, sur quel port et avec quelle force.
Un clic sur une IP distante ouvre la fenêtre d’investigation d’IP partagée, où vous pouvez examiner la répartition des connexions de cette IP (quel serveur / port / état TCP / nombre de sessions), une courbe miniature de l’historique agrégé des connexions, l’enrichissement géo/ASN/FAI, un lien de réputation externe et un lien direct de blocage vers la Liste de blocage, le tout au même endroit.
- Routes :
/infra/traffic/ips(page) ·/infra/traffic/ips/live(JSON d’interrogation) ·/infra/traffic/ip-detail(JSON d’investigation) - Contrôleur :
App\Http\Controllers\Infra\TrafficController@ips - Constructeur :
App\Services\Traffic\SessionQueryService::ipsData()+ipDetail() - Requêtes source :
App\Repositories\TrafficRepository(connexion héritéelegacy_glory, en lecture seule) - Tables source :
traffic_session_ct(plus les agrégatstraffic_session_ct_5min/_1hour/_1dayet l’enrichissementip_info_loop)
Toutes les données sont lues en lecture seule depuis la base de trafic héritée (
legacy_glory). Cet écran n’écrit jamais rien : les actions d’écriture telles que le blocage sont transmises via un lien direct de la fenêtre vers l’écran Liste de blocage, où l’écriture a lieu.
Quand l’utiliser
- Détecter un serveur qui attire un nombre anormal d’IP distantes (balayages, botnets, déferlantes de robots d’indexation).
- Repérer des schémas de propagation latérale où une même IP frappe plusieurs serveurs ou ports à la fois.
- Retracer sous l’angle du trafic une IP remontée par une alerte IDS ou pare-feu (quel serveur, quel port et quel état ont réellement eu des sessions).
- Vérifier le volume de connexions, l’historique, la géolocalisation et la réputation d’une IP avant de décider de la bloquer.
- Approfondir l’analyse d’une IP source arrivant depuis le cercle SRC de Connexions de ports.
Disposition
Bandeau · minuteur
En haut à droite se trouvent le sélecteur de minuteur (1 min / 5 min / 1 heure) qui définit la fenêtre d’affichage, l’horodatage du dernier instantané et un bouton d’actualisation manuelle. Le minuteur correspond à la durée de la fenêtre de requête ancrée sur le dernier instantané.
| minuteur | Fenêtre de requête |
|---|---|
1 (par défaut) |
La seule minute du dernier instantané |
5 |
Les 5 dernières minutes à partir du dernier instantané |
60 |
Les 60 dernières minutes à partir du dernier instantané |
Le minuteur choisi est conservé dans localStorage['infr:timer:traffic-ips'] d’une visite à l’autre. Seules les valeurs 1/5/60 sont autorisées ; toute autre valeur est ramenée à 1.
Légende d’intensité + pastilles de serveur
- Légende d’intensité : la couleur du point encode la tranche de nombre de sessions par port —
1–9(good) ·10–49(warn) ·50+(crit). - Pastilles de serveur : un filtre déterminant quels serveurs (hôtes) sont affichés. Par défaut, tous sont sélectionnés et le filtre par pastilles ne vaut que pour la session en cours (il n’est pas conservé dans localStorage) : une nouvelle visite revient donc à la sélection complète. La pastille
[All]bascule entre tout sélectionner et tout effacer.
Cartes de serveur (hôte)
Une carte par serveur sélectionné. L’en-tête affiche le nom d’hôte et le nombre d’IP distantes ; le corps est un tableau.
- Ligne (IP distante) = une IP distante. Colonnes :
Remote IP·Total(nombre total de sessions) · puis un point d’intensité par port supervisé (les 8 premiers ports supervisés). - Les IP distantes sont triées par nombre total de connexions (sessions), du plus élevé au plus faible, et jusqu’à 100 d’entre elles sont affichées par serveur.
- Les points d’intensité encodent par la couleur le nombre de sessions que cette IP détient sur chaque port (voir le tableau).
- Un clic sur une ligne ouvre la fenêtre d’investigation pour cette IP.
Les cartes se réordonnent par glisser-déposer à l’aide de la poignée (l’ordre est conservé dans infr:order:traffic-ips), sont réagencées par une disposition en maçonnerie sur plusieurs rangées et paginées par 20.
Couleurs du point d’intensité par port
| Sessions | Jeton | Couleur | Signification |
|---|---|---|---|
0 |
none | pâle | Non connectée sur ce port |
1–9 |
good | vert | Intensité faible |
10–49 |
warn | ambre | Intensité moyenne |
50+ |
crit | rouge | Intensité élevée |
Fenêtre d’investigation d’IP
Elle est pilotée par le mixin partagé mixins/ip_detail.js et la vue partielle infra/partials/ip-detail-modal.blade.php. Elle possède deux modes.
- mode sources — la liste des IP sources dans une fenêtre (serveur, port). On y entre depuis le cercle SRC de Connexions de ports.
- mode investigate (l’entrée par défaut de cet écran) — une analyse approfondie d’une seule IP. On y entre en cliquant sur la ligne d’une IP distante.
Ce que montre le mode investigate :
| Zone | Contenu | Source |
|---|---|---|
| KPI de synthèse | Total des sessions · nombre de serveurs · nombre de ports · première/dernière observation | ipSeenSpan() (MIN/MAX(created_at) sur toute la rétention) |
| Géo | Pays · ville · ASN · FAI | ip_info_loop (ipEnrichment()) |
| Historique des connexions | courbe miniature par granularité (5min / 1hour / 1day) | tables d’agrégats (ipHistory()) |
| Répartition des connexions | Sessions par serveur × port × état TCP · ports distants · première/dernière | traffic_session_ct (ipBreakdown()) |
Actions du pied de la fenêtre (investigate) : Copier l’IP · Voir l’IP (réinvestiguer sur cette page via ?src_ip=) · Réputation ↗ (AbuseIPDB externe, nouvel onglet) · Bloquer l’IP (lien direct vers la Liste de blocage via ?add=).
Le bouton Réputation ↗ de la fenêtre est un simple lien qui ouvre le site externe
abuseipdb.com/check/…dans un nouvel onglet. La fenêtre de réputation intégrée qui affiche une jauge de confiance et l’historique des signalements au sein de la console est une fonction des écrans de Sécurité — voir Réputation IP.
Comment l’utiliser
Déroulé de base
- Définissez la fenêtre (1/5/60 min) avec le minuteur. Plus elle est courte, plus on se rapproche de « connecté en ce moment même ».
- Restreignez l’affichage aux serveurs qui vous intéressent à l’aide des pastilles de serveur (tous par défaut).
- Sur une carte de serveur, cherchez les IP distantes portant un point d’intensité rouge (50 sessions ou plus) ou celles qui s’étendent sur plusieurs ports.
- Cliquez sur la ligne de l’IP suspecte pour ouvrir la fenêtre d’investigation.
- Dans la fenêtre, servez-vous de la répartition des connexions pour voir quel serveur, port et état ont été touchés, de l’historique pour jauger la persistance (ponctuelle ou récurrente) et de la géolocalisation/l’ASN pour l’origine.
- Si nécessaire, consultez l’historique des signalements externes via Réputation ↗ puis, si l’IP est malveillante, transmettez-la à la Liste de blocage avec Bloquer l’IP.
Changer la granularité de l’historique
Changer de granularité dans la section historique de la fenêtre change la table d’agrégats utilisée. La granularité par défaut est horaire (1hour) — le meilleur compromis entre densité et rapidité.
5min → traffic_session_ct_5min · IP individuelle · fenêtre de −6h depuis le dernier instantané
1hour → traffic_session_ct_1hour · IP individuelle · fenêtre de −3d depuis le dernier instantané (par défaut)
1day → traffic_session_ct_1day · bloc /24 · fenêtre de −120d depuis le dernier instantané
L’historique quotidien (
1day) est agrégé par bloc /24 de l’IP (les 3 premiers octets, 256 IP), et non par IP individuelle — parce que le collecteur d’agrégats stocke_1daypar classe C. La fenêtre affiche alors une étiquette de portée CIDR telle que211.224.128.0/24afin de rendre la portée explicite. Les granularités 5min et 1hour utilisent l’IP individuelle telle quelle.
Liens directs
?src_ip=203.0.113.10— au chargement de la page, ouvre automatiquement la fenêtre d’investigation pour cette IP (utilisé lorsqu’on arrive d’un autre écran ou d’une alerte).?alias=…/?servers=…/?server=…— applique par avance le filtre des pastilles de serveur (séparés par des virgules ou des espaces, correspondance insensible à la casse). Ne vaut que pour cette visite ; non conservé.
/infra/traffic/ips?src_ip=203.0.113.10
/infra/traffic/ips?servers=glory,blue
Interrogation périodique
La page interroge /infra/traffic/ips/live toutes les 30 secondes pour se rafraîchir automatiquement (ce n’est pas Reverb : le collecteur écrit dans la base en dehors de Laravel, l’interrogation périodique est donc le choix raisonnable). Lors du rafraîchissement, si tous les serveurs étaient sélectionnés, ceux qui viennent d’apparaître sont automatiquement inclus et ceux qui ont disparu sont retirés de la sélection.
Sources de données
Ancrage de la fenêtre
La fenêtre d’affichage est ancrée sur le dernier instantané des données (MAX(snapshot_ts)), et non sur le now() de l’application. L’horloge de stockage du collecteur peut dériver jusqu’à environ 9 heures en retard sur celle de l’application : une fenêtre fondée sur now() tomberait donc hors des données et l’écran s’afficherait vide.
Requête de la vue par hôte (ipPeers)
-- TrafficRepository::ipPeers (paramètres liés)
SELECT server_name, remote_ip, local_port, SUM(session_count) AS total_sessions
FROM traffic_session_ct
WHERE snapshot_ts BETWEEN :min AND :max
AND local_port IN (:ports) -- OpsPolicy::monitoredPorts()
GROUP BY server_name, remote_ip, local_port;
Les monitored ports ne sont pas codés en dur : ils proviennent de infra_monitored_ports (CSV) dans la Politique d’exploitation. Le résultat de ipsData() est mis en cache pendant 20 secondes (clé infr:traffic:ips:v1:{timer}:{ports}).
Requêtes de la fenêtre d’investigation
| Méthode | Table | Rôle |
|---|---|---|
ipSeenSpan() |
traffic_session_ct |
MIN/MAX(created_at) = plage d’observation réelle (rétention d’environ 8 h), MAX(snapshot_ts) = le dernier lot propre à cette IP (ancre de la répartition) |
ipBreakdown() |
traffic_session_ct |
Sommes de sessions par serveur×port×état · ports distants · première/dernière (LIMIT 200) |
ipHistory() |
3 agrégats | Historique des sessions par granularité (LIMIT 400) |
ipEnrichment() |
ip_info_loop |
Pays · ville · ASN · FAI (renvoie null sans erreur en cas d’absence) |
La répartition des connexions est ancrée sur le dernier lot d’instantané propre à l’IP, et non sur la dernière fenêtre globale. C’est délibéré, afin qu’une IP qui n’est pas connectée en ce moment mais qui nous a frappés par le passé affiche tout de même sa distribution, reconstituée à partir de son dernier moment observé.
Mise en garde sur les index des agrégats (critique pour les performances)
ipHistory() spécifie toujours direction IN ('inbound','outbound').
-- _1day utilise l’index composite t_ip(direction, remote_ip).
-- Sans direction explicite, seule la plage created_at est parcourue → plus de 12 s.
-- Avec elle, l’index est mobilisé → environ 20 ms (mesuré le 2026-08-06).
SELECT created_at, SUM(session_count) AS sessions
FROM traffic_session_ct_1day
WHERE direction IN ('inbound','outbound')
AND remote_ip = :cclass_key -- le niveau quotidien utilise la clé /24 des 3 premiers octets
AND created_at >= :since
GROUP BY created_at
ORDER BY created_at
LIMIT 400;
Les agrégats sont énormes (_5min ≈ 209M · _1hour ≈ 112M · _1day ≈ 24M) : une fenêtre created_at >= resserrée assortie d’un LIMIT est donc obligatoire. Les résultats de la fenêtre sont protégés par des caches : investigate 25 s, sources 20 s.
Accès
- Cet écran appartient au domaine de rôle Infrastructure (
user_levelminimum 1) — il est en lecture seule, si bien que tout utilisateur connecté (demo=1) peut le consulter. - La page,
/liveet/ip-detailrelèvent tous deinfr.auth(connexion), sans barrière de niveau supplémentaire. - Aucune écriture n’a lieu ici. Le bouton Bloquer l’IP de la fenêtre est un lien direct vers l’écran Liste de blocage ; le blocage effectif (une écriture dans
blacklist_info) y est réalisé avecuser_level≥ 2 et un journal d’audit.
Dépannage et FAQ
Les cartes sont vides et seul « aucune IP distante dans cette fenêtre » s’affiche.
Cela signifie que le dernier instantané ne comporte aucune connexion sur les ports supervisés. (1) Élargissez le minuteur à 5 ou 60, (2) vérifiez que les ports de service réels sont enregistrés dans infra_monitored_ports de la Politique d’exploitation et (3) contrôlez que les instantanés récents arrivent bien dans traffic_session_ct (collecteur check_ct.js).
Tout est vide et il n’y a aucun horodatage d’instantané.
Il est probable que la connexion legacy_glory ou la table traffic_session_ct elle-même soit vide. Vérifiez les identifiants de la base legacy_glory dans .env ainsi que le fonctionnement du collecteur de trafic. En cas d’échec de la requête, la réponse porte error:true.
Seul l’historique quotidien affiche « aucun historique d’agrégat quotidien pour ce bloc /24 ». L’agrégation quotidienne peut accuser un jour de retard et elle est indexée par bloc /24. Consultez d’abord les granularités 5min et horaire. Si le bloc n’a pas encore d’agrégat, c’est le comportement attendu.
J’ai cliqué sur une IP mais la répartition des connexions est vide. Cette IP n’a pas de sessions dans l’instantané récent, mais elle possède des observations passées. Utilisez la première/dernière observation du KPI de synthèse et l’historique des connexions pour confirmer l’activité passée (la répartition est reconstituée à partir du dernier lot d’instantané de l’IP).
Le bouton « Réputation ↗ » de la fenêtre ouvre un nouvel onglet au lieu d’un affichage intégré. C’est voulu. Cette fenêtre de trafic utilise un lien externe vers AbuseIPDB. Pour voir la jauge de confiance et l’historique des signalements au sein de la console, utilisez la fenêtre de réputation intégrée des écrans de Sécurité.
Qu’est-ce qui détermine la couleur des points d’intensité ? La tranche de nombre de sessions par port — 1–9 vert · 10–49 ambre · 50+ rouge · 0 donne un point pâle. Seuls les 8 premiers ports supervisés apparaissent en colonnes.
Voir aussi
- Connexions de ports — le PORT OVERVIEW port → serveur (barres d’état, cercle SRC)
- Trafic (E/S réseau) — octets entrants/sortants et débit de paquets par serveur
- Liste de blocage et réputation — la destination du lien direct « Bloquer l’IP » de la fenêtre (écriture + audit)
- Réputation IP — la fenêtre à jauge de confiance AbuseIPDB intégrée à la console
- Politique d’exploitation — configurer les ports supervisés (
infra_monitored_ports) - Alertes — envoyer un SMS ou un e-mail aux responsables en cas de dépassement de seuil
