« Tu peux me donner ton IP publique, que je l'ajoute au pare-feu ? »
Si vous travaillez pour des clients, vous avez forcément entendu cette phrase. Et vous avez forcément ouvert un navigateur, tapé « what is my ip », fermé trois bandeaux de cookies et copié l'adresse au milieu des publicités.
Moi, je l'entends souvent. Et j'ai un problème de plus : selon le client, je suis connecté à un VPN différent. Celui-ci passe tout le trafic dans le tunnel, celui-là seulement une partie, un troisième se coupe tout seul après une mise en veille. Résultat, la question n'est pas seulement « quelle est mon IP ? », mais aussi « depuis quelle IP je sors, là, maintenant ? ».
J'avais déjà une petite appli pour ça sur le Microsoft Store, My Public IP Address. Elle avait vieilli. Je l'ai réécrite entièrement, un peu pour le besoin, beaucoup pour le plaisir. Elle est gratuite sur le Store et le code est sur GitHub.
TL;DR
- L'IP publique est à côté de l'horloge : on survole l'icône, on la voit ; on clique, on la copie.
- Une notification arrive dès qu'elle change : VPN qui se coupe, changement de réseau, nouvelle adresse de la box.
- Un historique des dernières adresses, pour savoir quand ça a bougé.
- WinUI 3 et .NET 10, toute la logique dans une bibliothèque sans dépendance à Windows, donc testée.
- Pas de compte, pas de pub, pas de suivi : l'historique reste sur le PC.
Ce que fait l'appli
Rien de compliqué, et c'est voulu. Elle vit dans la zone de notification, à côté de l'horloge.
On survole l'icône : l'info-bulle donne l'IPv4 et l'IPv6.

On clique dessus : un petit panneau au style de Windows 11 s'ouvre au-dessus de l'horloge, avec l'IP publique, l'adresse sur le réseau local, un bouton pour copier chacune, et les adresses récentes.

Les captures utilisent des adresses réservées à la documentation, pas les miennes.
Et surtout, quand l'adresse change, Windows me prévient, avec l'ancienne et la nouvelle :

C'est cette notification qui change tout avec plusieurs VPN. Le tunnel tombe sans prévenir ? Je le sais tout de suite, avant de passer dix minutes à me demander pourquoi le serveur du client ne répond plus.
Le clic droit donne le reste : copier, actualiser, lancer au démarrage, couper les notifications, quitter.

Quelques détails qui m'ont occupé
Afficher une IP, c'est trois lignes de code. La rendre fiable, c'est autre chose. Voici ce que j'ai appris en route.
Ne jamais afficher une erreur comme une adresse
L'appli interroge des services publics qui répondent juste l'IP en texte brut : ipify, icanhazip, et checkip.amazonaws.com en secours. Si l'un tombe, on passe au suivant.
Le piège, c'est la lecture de la réponse. IPAddress.TryParse est très tolérant : il accepte "1" ou "10.1", qu'il transforme en adresses valides. Une page d'erreur un peu bizarre, et je copiais une fausse IP pour la donner à un client. Donc la lecture est stricte :
internal static bool TryParse(string text, AddressFamily family, out IPAddress? address)
{
address = null;
string candidate = text.Trim();
if (family == AddressFamily.InterNetwork && candidate.Count(c => c == '.') != 3)
{
return false;
}
if (!IPAddress.TryParse(candidate, out IPAddress? parsed) || parsed.AddressFamily != family)
{
return false;
}
address = parsed;
return true;
}
Suivre les changements de réseau
Quand on active un VPN, Windows signale un changement de réseau... puis un autre, puis encore un autre, le temps que les cartes réseau se stabilisent. L'appli attend deux secondes que tout se calme avant de redemander l'adresse. En plus de ça, elle vérifie toutes les 15 minutes, et réessaie de plus en plus lentement en cas d'échec (3 s, 5 s, 10 s, 30 s, puis une minute).
Autre détail : le HttpClient garde ses connexions ouvertes. Après un changement de VPN, il pouvait réutiliser une connexion de l'ancien réseau. Des durées de vie courtes règlent ça :
var handler = new SocketsHttpHandler
{
ConnectTimeout = TimeSpan.FromSeconds(4),
// Short lifetimes so that a network switch (VPN, Wi-Fi...) never reuses a stale connection
PooledConnectionLifetime = TimeSpan.FromMinutes(1),
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(20),
};
L'IPv6 change tout le temps, sans que ce soit un changement
Premiers essais avec l'IPv6 : une notification par jour, sans raison. Windows utilise les « extensions de confidentialité » : la deuxième moitié de l'adresse IPv6 change régulièrement, pour qu'on ne puisse pas vous suivre. Le réseau, lui, ne change pas.
Donc pour l'IPv6, je ne compare que le préfixe /64, la partie qui identifie le réseau :
internal static bool IsSameConnection(IpHistoryEntry a, IpHistoryEntry b) =>
a.IPv4 == b.IPv4 && IPv6Prefix(a.IPv6) == IPv6Prefix(b.IPv6);
Et pas de notification au premier résultat de la session non plus : si la box a changé d'adresse pendant la nuit, je n'ai pas besoin qu'on me le dise à chaque ouverture de session.
L'icône qui disparaissait après une mise à jour
Celle-là, je ne l'avais pas vue venir. Windows associe l'identifiant (un GUID) d'une icône de la zone de notification au chemin de l'exécutable. Or une appli du Store est installée dans un dossier qui contient son numéro de version. Mise à jour, nouveau chemin, GUID refusé... et plus d'icône.
La solution tient en deux lignes : calculer le GUID à partir du chemin.
string path = (Environment.ProcessPath ?? "MyPublicIp").ToUpperInvariant();
return new Guid(MD5.HashData(Encoding.UTF8.GetBytes(path)));
Sous le capot
- WinUI 3 et .NET 10, empaqueté en MSIX pour le Store (x86, x64 et ARM64).
- Toute la logique (recherche de l'IP, rafraîchissement, historique, détection des changements, placement du panneau) est dans
MyPublicIp.Core, une bibliothèque sans aucune dépendance à Windows. L'appli WinUI n'est qu'une fine couche autour. - Conséquence directe : tout est testé avec xUnit. Le temps est injecté avec
TimeProvider, donc les tests de rafraîchissement avancent une fausse horloge au lieu d'attendre. - MVVM avec CommunityToolkit.Mvvm : le panneau et le menu partagent le même view model.
- Runtime .NET embarqué et entièrement « trimmé » : environ 8 Mo par architecture au lieu de 60.
- Lancement au démarrage via la tâche de démarrage MSIX, désactivable depuis l'appli ou depuis les paramètres de Windows.
Côté vie privée, c'est simple : l'appli envoie une requête HTTPS à un service « quelle est mon IP », et c'est tout. Pas de compte, pas de statistiques, pas de pub. L'historique (20 adresses maximum) reste sur le PC.
Ce que je retiens
- Les petits outils sont les meilleurs terrains de jeu. Le besoin est clair, le périmètre tient dans la tête, et on peut soigner chaque détail.
- Une appli fiable, c'est surtout la gestion des cas tordus. Les services qui tombent, les réseaux qui changent en rafale, l'IPv6 qui bouge toute seule.
- Séparer la logique de l'interface paie toujours. Avec un Core sans Windows, j'ai pu tout tester sans jamais lancer l'appli.
Si vous jonglez vous aussi entre plusieurs VPN, ou si on vous demande souvent votre IP, l'appli est sur le Microsoft Store. Le code est sur GitHub, sous licence MIT. Les idées et les retours sont les bienvenus dans les issues.

Commentaires (0)
Aucun commentaire pour le moment. Soyez le premier à commenter !
Laisser un commentaire