ポート フォワーディングを行う単純な C# アプリを作成しようとしていますが、IP_HDRINCL ソケット オプションを使用して受信側を偽装して、接続が実際にソースに接続されていると考える方法を知る必要があります。どんな例でも大歓迎です。
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 );
唯一の問題は、このような raw ソケットからデータを正常に受信できたが (IP ヘッダーを含む)、送信できなかったことです。
新しいバージョンの Windows では、マルウェアが raw ソケットを悪用するため、raw ソケットの使用が制限されています。
MSDNから引用
Windows 7、Windows Vista、および Service Pack 2 (SP2) を適用した Windows XP では、Raw ソケット経由でトラフィックを送信する機能がいくつかの方法で制限されています。
- TCP データは raw ソケット経由で送信できません。
- 無効な送信元アドレスを持つ UDP データグラムは、raw ソケット経由で送信できません。発信 UDP データグラムの IP ソース アドレスは、ネットワーク インターフェイスに存在する必要があります。存在しない場合、データグラムはドロップされます。この変更は、悪意のあるコードが分散サービス拒否攻撃を作成する機能を制限し、スプーフィングされたパケット (偽造された送信元 IP アドレスを持つ TCP/IP パケット) を送信する機能を制限するために行われました。
- IPPROTO_TCP プロトコルの raw ソケットを使用した bind 関数の呼び出しは許可されていません。 注 raw ソケットを使用したバインド機能は、他のプロトコル (IPPROTO_IP、IPPROTO_UDP、または IPPROTO_SCTP など) で使用できます。
上記の制限は、Windows Server 2008 R2、Windows Server 2008、Windows Server 2003、または Windows XP SP2 より前のバージョンのオペレーティング システムには適用されません。
このWebサイトを見つけましたが、コードがどの程度うまく機能するかわかりません:http ://www.winsocketdotnetworkprogramming.com/clientserversocketnetworkcommunication8h.html
IP_HDRINCL
.NET の Socket タイプは RAW をサポートしており、.NETSocketOptionName.HeaderIncluded
で使用できますSocket.SetSocketOption
。
Reflector を使用して、.NET 実装が列挙値と一致しているかどうかを再確認することをお勧めします。