8

Windows (10) 上の c# アプリケーションに tcp パケットを転送し、TcpListener/HttpListener にリクエストを処理させる方法はありますか? Linuxでは、iptablesをセットアップすることでそれを行うことができます(iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 7000)。

たとえば、私の c# アプリケーションでは、特定のポート (たとえば 7000) で (TcpListener またはソケット リスナーを使用して) 受信接続をリッスンできました。パケットの宛先 IP アドレスは、ネットワーク内のコンピューターのアドレスとは異なることに注意してください (もちろん、宛先ハードウェア アドレスは同じです)。

C# で Pcap .Net を使用して別のアプローチを試みました。パケットをキャプチャして 127.0.0.1 に転送しています。ただし、私のホストはまだパケットをキャプチャしていないようです (ネットワーク内でその IP を持つホストを見つけようとして、パケットをゲートウェイに送信している可能性があります)。私はいつでもネットワークで自分のローカル IP アドレスを使用できますが、それではパケットがゲートウェイに行き、その後再び戻ってくることになります。これは、TcpListener が着信接続を認識することだけが必要なためです。私が使用しているコード:

static void processPacket(Packet packet) {
    EthernetLayer ethernetLayer = (EthernetLayer)packet.Ethernet.ExtractLayer();
    IpV4Layer ipLayer = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer();

    if (ipLayer.Protocol == IpV4Protocol.Tcp) {
        TcpLayer tcpLayer = (TcpLayer)packet.Ethernet.IpV4.Tcp.ExtractLayer();

        if (tcpLayer.DestinationPort == 80) {
           Packet newPacket = BuildTcpPacket(packet, "127.0.0.1"); //copies the packet but changes the ip destination address to 127.0.0.1
                Communicator.SendPacket(newPacket);
                return;
        }
     }
     reroutePacket(packet); //forwards packet to correct destination
 }
4

1 に答える 1

4

使用して

netsh interface portproxy add v4tov4 listenport=9999 listenaddress=0.0.0.0 connectport=80 connectaddress=127.0.0.1

システムに登録された IP アドレスへのすべてのリクエストを localhost にリダイレクトします。

ファイアウォールは、内部 IP アドレス リストに一致しないパケットを破棄します。このようなトラフィックをキャプチャする唯一の方法は、ネットワーク カードをプロミスキャス モードに設定して、wiresharkなどのツールですべてのトラフィックをキャプチャすることです。

私のアイデア:

  1. すべてのトラフィックをファイル (wireshark) にダンプし、テールを付けて処理のために他のホストに送信します。

  2. ポート ミラーリングを使用してスイッチをセットアップし、トラフィック分析専用のホストを用意します。

どんなコメントでも大歓迎です!

コンピュータ ネットワークの領域では、プロミスキャス モードとは、イーサネット ハードウェア、特にネットワーク インターフェイス カード (NIC) の特別なモードを指し、NIC がアドレス指定されていない場合でも、NIC がネットワーク上のすべてのトラフィックを受信できるようにします。

于 2016-06-17T08:59:01.623 に答える