Question

Je dois créer un programme qui reçoit une requête HTTP et transmet ces demandes aux serveurs Web.

Schéma http://img269.imageshack.us/img269/1862/h98trsly. jpg

Je l'ai fait avec succès en utilisant uniquement ce Java Sockets mais le client avait besoin du programme à mettre en œuvre Jpcap. Je voudrais savoir si cela est possible et que la littérature que je devrais lire pour ce projet.

est ce que j'ai maintenant en assemblant des pièces du tutoriel Jpcap:

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);
    }
}

Toute aide serait grandement appréciée. Merci.

Était-ce utile?

La solution

Pourquoi? Quelles sont ses raisons? Veut-il vraiment payer dix fois le coût pour la même chose que vous avez déjà fait?

Vous n'avez pas besoin Jpcap pour mettre en œuvre les proxies HTTP. Il peut être tout à fait dans java.net ou java.nio.

Autres conseils

Je ne pense pas que vous pouvez y arriver, au moins sur une boîte de Windows. Jpcap est juste un wrapper pour Winpcap, et ce mécanisme sous-jacent ne peut pas laisser tomber les paquets observés:

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

Alors, je ne vois pas comment vous pouvez construire un proxy inverse « sur le fil. » Auriez-vous de ne pas faire ce qui suit:

  1. Observez une requête HTTP entrant en compilant des paquets en temps réel et en les déposant d'être reçu par l'hôte prévu.

  2. Faire la requête HTTP alternative basée sur toutes les règles proxy que vous utiliserez.

  3. Saisir la réponse de votre demande et pousser les paquets sur le fil qui fausse une réponse de l'hôte d'origine?

Puisque vous ne pouvez pas laisser tomber les paquets entrants, ne sera pas la tentative d'hôte destiné à traiter la requête et jeter des paquets de son propre sur le fil en réponse? Il y a probablement encore plus que je ne sais pas que je ne suis pas expert en réseau. Cette question m'a fait curieux de savoir ce qui serait possible en utilisant une telle « shim ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top