DNS 要求をインターセプトし、ドメインが許可されている場合にのみ応答を返すソケット API を使用して、C でコンテンツ フィルターを作成しています。これを説明する擬似コードは次のとおりです。
- すべての DNS クエリを、UDP ポート X でリッスンしているコンテンツ フィルタ プログラムにリダイレクトします。
- コンテンツ フィルタ プログラムは、照会されているドメインを抽出し、それが許可されているかどうかを判断します。
- 許可されている場合、コンテンツ フィルタ プログラムは、元の送信元と IP+ ポートを維持しながら、元の DNS 要求パケットを元の宛先 DNS サーバーに転送し、DNS サーバーが応答をクライアントに直接送信できるようにします。
- ドメインが許可されていない場合、返信は送信されません。
現在、プログラムは UDP ポート X でリッスンしていますが、問題は IP ヘッダーにアクセスできないため、元のヘッダーを維持しながら DNS 要求を元のサーバーに単純に転送できないことです。
使用してみsocket(AF_INET, SOCK_RAW, IPPROTO_UDP)
ましたが、ポート X でバインドされず (当然のことです)、トラフィックを受信しません。
着信パケットの IP ヘッダーにアクセスしながら、UDP ポート X をリッスンする最善の方法は何ですか?