2009-02-20 6 views
3

J'essaie de créer une application C# simple qui fait la redirection de port, et besoin de savoir comment utiliser l'option de socket IP_HDRINCL pour essayer de truquer l'extrémité de réception à penser que la connexion est vraiment à la source . Tous les exemples seraient grandement appréciés.C# Raw Sockets Port Forwarding

Répondre

4
sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
sock.Bind(new IPEndPoint(IPAddress.Parse("10.25.2.148"), 0)); 
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1); 
byte[] trueBytes = new byte[] { 1, 0, 0, 0 }; 
byte[] outBytes = new byte[] { 0, 0, 0, 0 }; 
sock.IOControl(IOControlCode.ReceiveAll, trueBytes, outBytes); 
sock.BeginReceive(data, 0, data.Length, SocketFlags.None, new AsyncCallback(OnReceive), null); 

Le seul problème est que je suis en mesure de recevoir correctement les données d'une socket raw comme celui-ci, (y compris l'en-tête IP), mais pas l'envoyer.

0

IP_HDRINCL

de .NET type Socket prend en charge RAW, et il est SocketOptionName.HeaderIncluded pour une utilisation avec Socket.SetSocketOption.

Vous pouvez utiliser Reflector pour vérifier que l'implémentation .NET s'aligne sur les valeurs enum.

3

versions plus récentes de Windows limitent l'utilisation des sockets raw en raison de programmes malveillants fortement les abus.

Cité du MSDN

Sous Windows 7, Windows Vista et Windows XP avec Service Pack 2 (SP2), la capacité de envoyer du trafic sur des sockets premières a été limitée de plusieurs manières :

  • Les données TCP ne peuvent pas être envoyées sur des sockets raw.
  • Les datagrammes UDP avec une adresse source non valide ne peuvent pas être envoyés via des sockets raw. L'adresse de source IP de tout datagramme UDP sortant doit exister sur une interface réseau ou le datagramme est supprimé. Cette modification a été effectuée pour limiter la capacité du code malveillant à créer des attaques par déni de service distribuées et limiter la possibilité d'envoyer des paquets spoofés (paquets TCP/IP avec une adresse IP source falsifiée).
  • Un appel à la fonction de rattachement avec un socket brut pour le protocole IPPROTO_TCP n'est pas autorisé. Remarque La fonction de liaison avec une prise brute est autorisée pour d'autres protocoles (IPPROTO_IP, IPPROTO_UDP ou IPPROTO_SCTP, par exemple.

Ces restrictions ci-dessus ne sont pas applicables à Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, ou aux versions du système d'exploitation antérieures à Windows XP avec SP2