Pregunta

Es necesario crear un programa que recibe la solicitud HTTP y envía las solicitudes a los servidores web.

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

he hecho con éxito este utilizando sólo Java sockets pero el cliente es necesario que el programa sea implementado en Jpcap. Me gustaría saber si esto es posible y lo que la literatura debería estar leyendo para este proyecto.

Esto es lo que tengo ahora uniendo piezas de la 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);
    }
}

Cualquier ayuda sería muy apreciada. Gracias.

¿Fue útil?

Solución

¿Por qué? ¿Cuáles son sus razones? ¿De verdad quiere pagar diez veces el costo por la misma cosa que ya has hecho?

No es necesario Jpcap para implementar servidores proxy HTTP. Se puede hacer enteramente dentro de java.net o java.nio.

Otros consejos

No creo que usted puede hacer que esto suceda, al menos en una máquina Windows. Jpcap es sólo una envoltura para Winpcap, y este mecanismo subyacente no puede descartar los paquetes observados:

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

Por lo tanto, no veo cómo se puede construir un proxy inverso "sobre el alambre". ¿No hay que hacer lo siguiente:

  1. Observar una petición HTTP entrante juntando paquetes en tiempo real y soltándolos de ser recibido por el huésped deseado.

  2. Hacer la petición HTTP alternativo basado en cualesquiera reglas de proxy que esté implementando.

  3. Coge la respuesta de su solicitud y expulsar los paquetes en el cable que fingir una respuesta del host original?

Como no se puede dejar caer los paquetes de entrada, no lo hará el intento huésped destinado a gestionar la solicitud y lanzar paquetes de su propio sobre el alambre en respuesta? Hay probablemente aún más que yo no sé nada de lo que no soy experto en redes. Esta pregunta me hizo curioso acerca de lo que sería posible utilizando tal "cuña".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top