InfraGuard

Connexions IP

Vue par hôte des IP distantes de chaque serveur sous forme de points d’intensité par port, avec une fenêtre d’investigation d’IP couvrant la répartition des connexions, l’historique agrégé, la géolocalisation/l’ASN, la réputation et un lien direct de blocage.

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.

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

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

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.

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.

  1. mode sources — la liste des IP sources dans une fenêtre (serveur, port). On y entre depuis le cercle SRC de Connexions de ports.
  2. 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

  1. 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 ».
  2. Restreignez l’affichage aux serveurs qui vous intéressent à l’aide des pastilles de serveur (tous par défaut).
  3. 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.
  4. Cliquez sur la ligne de l’IP suspecte pour ouvrir la fenêtre d’investigation.
  5. 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.
  6. 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 _1day par classe C. La fenêtre affiche alors une étiquette de portée CIDR telle que 211.224.128.0/24 afin de rendre la portée explicite. Les granularités 5min et 1hour utilisent l’IP individuelle telle quelle.

Liens directs

/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

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

IP 연결 — 서버별 원격 peer
IP 연결 — 서버별 원격 peer