Windows将数据包转发到c#应用程序

时间:2013-09-19 17:16:07

标签: c# windows port forward pcap.net

有没有办法将tcp数据包转发到windows(10)上的c#应用程序,让TcpListener / HttpListener处理请求?在linux中,我可以通过设置iptables( iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 7000 )来实现。

例如,在我的c#应用程序中,我可以在特定端口上侦听传入连接(使用TcpListener或套接字侦听器),比方说7000.我可以以某种方式配置窗口以将所有tcp流量转发到127.0.0.1:7000吗?请记住,数据包的目标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
 }

1 个答案:

答案 0 :(得分:4)

使用

  

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

会将所有请求重定向到系统注册的IP地址。

防火墙会丢弃与内部IP地址列表不匹配的数据包,捕获此类流量的唯一方法是将网卡设置为混杂模式,以便通过wireshark等工具捕获所有流量。

我的想法:

  1. 将所有流量转储到文件(wireshark)并将其拖尾以发送给其他主机进行处理。

  2. 使用port mirroring设置开关,并拥有专门用于流量分析的主机。

  3. 欢迎任何评论!

    在计算机网络领域,混杂模式是指以太网硬件的特殊模式,特别是网络接口卡(NIC),它允许NIC接收网络上的所有流量,即使它不是针对此NIC。