C#Raw套接字端口转发

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

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头)接收数据,但不能发送它。

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

引用自MSDN

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

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

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

IP_HDRINCL

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

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

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