Frage

Ich brauche ein Programm zu erstellen, die HTTP-Anforderung empfängt und weiterleitet diese Anfragen an den Web-Server.

Diagramm http://img269.imageshack.us/img269/1862/h98trsly. jpg

Ich habe erfolgreich diese nur mit Java Sockets gemacht, aber der Client benötigt, um das Programm in Jpcap umgesetzt werden. Ich würde gerne wissen, ob dies möglich ist und was Literatur sollte ich für dieses Projekt lesen.

Das ist, was ich habe jetzt durch Zusammennähen Stücke aus dem Jpcap Tutorial:

import java.net.InetAddress;
import java.io.*;
import jpcap.*;
import jpcap.packet.*;


public class Router {
    public static void main(String args[]) {
        //Obtain the list of network interfaces
        NetworkInterface[] devices = JpcapCaptor.getDeviceList();

        //for each network interface
        for (int i = 0; i < devices.length; i++) {
            //print out its name and description
            System.out.println(i+": "+devices[i].name + "(" + devices[i].description+")");

            //print out its datalink name and description
            System.out.println(" datalink: "+devices[i].datalink_name + "(" + devices[i].datalink_description+")");

            //print out its MAC address
            System.out.print(" MAC address:");
            for (byte b : devices[i].mac_address)
                System.out.print(Integer.toHexString(b&0xff) + ":");
            System.out.println();

            //print out its IP address, subnet mask and broadcast address
            for (NetworkInterfaceAddress a : devices[i].addresses)
                System.out.println(" address:"+a.address + " " + a.subnet + " "+ a.broadcast);
        }

        int index = 1;  // set index of the interface that you want to open.

        //Open an interface with openDevice(NetworkInterface intrface, int snaplen, boolean promics, int to_ms)
        JpcapCaptor captor = null;
        try {
            captor = JpcapCaptor.openDevice(devices[index], 65535, false, 20);
            captor.setFilter("port 80 and host 192.168.56.1", true);
        } catch(java.io.IOException e) {
            System.err.println(e);
        }

        //call processPacket() to let Jpcap call PacketPrinter.receivePacket() for every packet capture.
        captor.loopPacket(-1,new PacketPrinter());

        captor.close();
    }
}

class PacketPrinter implements PacketReceiver {
    //this method is called every time Jpcap captures a packet
    public void receivePacket(Packet p) {
        JpcapSender sender = null;
        try {
            NetworkInterface[] devices = JpcapCaptor.getDeviceList();
            sender = JpcapSender.openDevice(devices[1]);
        } catch(IOException e) {
            System.err.println(e);
        }


        IPPacket packet = (IPPacket)p;

        try {
            // IP Address of machine sending HTTP requests (the client)
            // It's still on the same LAN as the servers for testing purposes.
            packet.dst_ip = InetAddress.getByName("192.168.56.2");
        } catch(java.net.UnknownHostException e) {
            System.err.println(e);
        }

        //create an Ethernet packet (frame)
        EthernetPacket ether=new EthernetPacket();
        //set frame type as IP
        ether.frametype=EthernetPacket.ETHERTYPE_IP;
        //set source and destination MAC addresses

        // MAC Address of machine running reverse proxy server
        ether.src_mac = new MacAddress("08:00:27:00:9C:80").getAddress();
        // MAC Address of machine running web server
        ether.dst_mac = new MacAddress("08:00:27:C7:D2:4C").getAddress();

        //set the datalink frame of the packet as ether
        packet.datalink=ether;

        //send the packet
        sender.sendPacket(packet);

        sender.close();

        //just print out a captured packet
        System.out.println(packet);
    }
}

Jede Hilfe wäre sehr geschätzt. Danke.

War es hilfreich?

Lösung

Warum? Was sind seine Gründe? Hat er wirklich haben Sie zehn Mal die Kosten für die gleiche Sache zu bezahlen bereits getan?

Sie müssen Jpcap nicht HTTP-Proxies implementieren. Es kann vollständig in java.net oder java.nio erfolgen.

Andere Tipps

Ich glaube nicht, Sie können damit dies geschieht, zumindest auf einem Windows-. Jpcap ist nur ein Wrapper für Winpcap, und dieser zugrunde liegenden Mechanismus kann beobachteten Pakete nicht löschen:

http://www.mirrorservice.org/sites/ftp.wiretapped.net/pub/security/packet-capture/winpcap/misc/faq.htm#Q-17

Also, ich sehe nicht, wie man ein Reverse-Proxy aufbauen kann „auf dem Draht.“ Würden Sie nicht haben folgendes zu tun:

  1. Beachten Sie eine eingehende HTTP-Anforderung von zusammen Pakete in Echtzeit Ansetzen und Ablegen von durch den beabsichtigten Host empfangen wird.

  2. Machen Sie die alternative HTTP-Anforderung aus welchen Proxy-Regeln, die Sie umsetzen.

  3. Besorgen Sie sich die Antwort von Ihrem Wunsch und Push-out-Pakete auf dem Kabel, das gefälschte eine Antwort von dem ursprünglichen Host?

Da Sie nicht die eingehenden Pakete fallen kann, wird nicht der richtige Host-Versuch, die Anforderung zu verarbeiten und werfen Pakete eigene auf den Draht in Reaktion? Wahrscheinlich gibt es noch mehr, dass ich weiß nicht, über wie ich bin kein Netzwerkexperte. Diese Frage hat mich einfach zu neugierig, was möglich wäre, unter Verwendung eines solchen „Scheibe“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top