La creación de un proxy inverso utilizando Jpcap
-
20-09-2019 - |
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.
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:
Por lo tanto, no veo cómo se puede construir un proxy inverso "sobre el alambre". ¿No hay que hacer lo siguiente:
-
Observar una petición HTTP entrante juntando paquetes en tiempo real y soltándolos de ser recibido por el huésped deseado.
-
Hacer la petición HTTP alternativo basado en cualesquiera reglas de proxy que esté implementando.
-
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".