Pergunta

Preciso criar um programa que receba a solicitação HTTP e encaminhe essas solicitações para os servidores da Web.

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

Eu fiz isso com sucesso usando apenas soquetes Java, mas o cliente precisava que o programa fosse implementado no JPCAP. Eu gostaria de saber se isso é possível e que literatura eu deveria estar lendo para este projeto.

É isso que tenho agora, costurando peças do tutorial do 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);
    }
}

Qualquer ajuda seria muito apreciada. Obrigada.

Foi útil?

Solução

Por quê? Quais são as suas razões? Ele realmente quer pagar dez vezes o custo pela mesma coisa que você já fez?

Você não precisa do JPCAP para implementar proxies HTTP. Isso pode ser feito inteiramente dentro de java.net ou java.nio.

Outras dicas

Eu não acho que você possa fazer isso acontecer, pelo menos em uma caixa do Windows. O JPCAP é apenas um invólucro para o WinPCap, e esse mecanismo subjacente não pode soltar pacotes observados:

http://www.mirrorrorService.org/sites/ftp.wiretapp.net/pub/security/packet-capture/winpcap/misc/faq.htm#q-17

Então, não vejo como você pode construir um proxy reverso "no fio". Você não precisaria fazer o seguinte:

  1. Observe uma solicitação HTTP recebida reunindo pacotes em tempo real e deixando-os receber pelo host pretendido.

  2. Faça a solicitação HTTP alternativa com base em quaisquer regras de procuração que você esteja implementando.

  3. Pegue a resposta da sua solicitação e empurre os pacotes no fio que falsificam uma resposta do host original?

Como você não pode soltar os pacotes de entrada, o host pretendido não tentará lidar com a solicitação e jogar pacotes próprios no fio em resposta? Provavelmente há ainda mais que eu não conheço, pois não sou especialista em rede. Essa pergunta me deixou curiosa sobre o que seria possível usar esse "calço".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top