Socket capture uniquement les paquets sortants, pas ceux entrants

J’ai basé un renifleur de paquets sur cet exemple de projet (fréquemment cité) . Après avoir implémenté les paquets HTTP, j’ai remarqué que les seuls paquets HTTP que je récupère sont des demandes. Je ne reçois aucune réponse.

J’ai consulté de nombreuses sources différentes, mais comme le code utilisé est très souvent le même, je suis enclin à penser qu’il pourrait être local pour moi.

Lorsque je consulte mes journaux, je constate que chaque paquet a son adresse IP locale en tant que SourceIP , aussi bien pour les paquets HTTP que pour les paquets qui arrivent sur d’autres ports.

J’ai fourni un exemple de travail ici que vous pouvez copier-coller dans LINQPad et qui devrait illustrer le problème (ajoutez les System.Net et System.Net.Socket ). N’oubliez pas d’exécuter LINQPad en tant qu’administrateur pour avoir access au socket.

Cela se traduit par des centaines / milliers d’entrées dans la plage 192.168.0 avec un total de 3 exceptions d’adresses IP faisant référence à mon fournisseur d’hébergement (vérifié à l’aide de nslookup ).

 private readonly byte[] _data = new byte[4096]; private Socket _mainSocket; public void Capture() { _mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); _mainSocket.Bind(new IPEndPoint(GetLocalIP(), 0)); var byTrue = new byte[] {1, 0, 0, 0}; var byOut = new byte[] {1, 0, 0, 0}; _mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut); _mainSocket.EnableBroadcast = true; _mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null); } private void OnReceive(IAsyncResult ar) { SocketError error; var received = _mainSocket.EndReceive(ar, out error); Parse(_data, received); _mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null); } private void Parse(byte[] data, int size) { var packet = new IPHeader(data, size); Console.WriteLine (packet.SourceIP.ToSsortingng()); } 
  • Windows 8.1
  • Killer e2200 Gigabit Ethernet Controller (NDIS 6.30) – Dernière version du pilote
    • J’ai installé une carte réseau autonome hier, cela n’a rien changé.

La description d’un article qui se rapproche le plus de mon problème a pour solution le code de travail que j’ai déjà.

Pourquoi suis-je seulement capable de tracer les paquets sortants?

    Avez-vous essayé de regarder dans votre pare-feu OS / Standalone / Router? Il est souvent négligé, mais les pare-feu ont des règles différentes pour les connexions entrantes et sortantes, ce qui peut être la cause de vos problèmes.

    Vérifiez l’adresse renvoyée par votre GetLocalIP (). Vous pouvez recevoir une adresse IP de bouclage, auquel cas vous ne pouvez pas capturer les paquets entrant. Un problème similaire est traité ici .

    Comme @Saibal et @Saverio l’ont mentionné: le problème est le pare-feu. En tant que solution temporaire pour le moment, je désactive le pare-feu au démarrage de l’injecteur de paquets et le réactiver lorsqu’il s’arrête (sans prendre une sortie inattendue dans le compte).

    Si vous vous retrouvez ici avec le même problème, alors votre premier résultat pour “Désactiver le pare-feu C #” pourrait être cet article de blog . Cela n’a pas fonctionné dans mon cas et à la place jeté une NotImplementedException . J’imagine que cela ne concerne probablement que Windows XP, comme l’indique ce document MSDN .

    Heureusement, il existe des alternatives pour Vista et les versions ultérieures (testé uniquement sous Windows 8.1, mais c’est soi-disant le successeur qui le mentionne).

    Mon code pour désactiver / activer le pare-feu:

     private static readonly Type policyType = Type.GetTypeFromProgID("HNetCfg.FwPolicy2"); private static readonly INetFwPolicy2 firewall = (INetFwPolicy2) Activator.CreateInstance(policyType); private void DisableFirewall() { var firewallEnabled = firewall.get_FirewallEnabled( NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE); if (firewallEnabled) { firewall.set_FirewallEnabled( NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE, false); } } 

    Une autre façon d’écrire ceci est

     firewall.FirewallEnabled[NET_FW_PROFILE_TYPE2_.NET_FW_PROFILE2_PRIVATE] = false; 

    Malheureusement, MSDN n’offre que des exemples de code en C / C ++, mais vous pouvez toujours en extraire l’essentiel.

    N’oubliez pas que vous devez append la bibliothèque Interop.NetFwTypeLib à votre projet. Vous pouvez le trouver à l’ emplacement suivant: C: \ Windows \ SysWOW64 \ FirewallAPI.dll ou son équivalent 32 bits.

    Ceci est cependant très rudimentaire. Dans une étape ultérieure (ce message sera mis à jour à chaque fois que je le ferai), j’examinerai simplement l’ajout du programme à la liste des exceptions du pare-feu, mais pour l’instant, cela devra suffire.