C#Raw套接字端口转发

时间:2009-02-20 01:22:52

标签: c# networking sockets portforwarding

我正在尝试创建一个简单的C#应用​​程序来执行端口转发,并且需要知道如何使用IP_HDRINCL套接字选项来尝试伪造接收端以认为连接确实是源。任何例子都将不胜感激。

4 个答案:

答案 0 :(得分: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 );

唯一的问题是我能够从这样的原始套接字(包括IP头)成功接收数据,但不能发送它。

答案 1 :(得分:3)

较新版本的Windows限制了原始套接字的使用,因为恶意软件严重滥用它们。

引自MSDN

  

在Windows 7上,   Windows Vista和Windows XP   Service Pack 2(SP2),能力   通过原始套接字发送流量已经   受到多种限制:

     
      
  • 无法通过原始套接字发送TCP数据。
  •   
  • 无法通过原始套接字发送具有无效源地址的UDP数据报。任何传出UDP数据报的IP源地址必须存在于网络接口上,否则数据报将被丢弃。此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送欺骗数据包(具有伪造源IP地址的TCP / IP数据包)的能力。
  •   
  • 不允许使用IPPROTO_TCP协议的原始套接字调用绑定函数。   注意其他协议允许使用带有原始套接字的绑定功能(例如,IPPROTO_IP,IPPROTO_UDP或IPPROTO_SCTP。
  •   
     

以上限制不适用于Windows Server 2008 R2,Windows Server 2008,Windows Server 2003或Windows XP SP2之前的操作系统版本。

答案 2 :(得分:0)

  

IP_HDRINCL

.NET的Socket类型支持RAW,并且SocketOptionName.HeaderIncluded可用于Socket.SetSocketOption

您可能希望使用Reflector来仔细检查.NET实现是否与枚举值保持一致。

答案 3 :(得分:0)

我找到了这个网站,但不确定代码的工作情况:http://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8h.html