Criando um proxy reverso usando o JPCAP
-
20-09-2019 - |
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.
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:
Então, não vejo como você pode construir um proxy reverso "no fio". Você não precisaria fazer o seguinte:
Observe uma solicitação HTTP recebida reunindo pacotes em tempo real e deixando-os receber pelo host pretendido.
Faça a solicitação HTTP alternativa com base em quaisquer regras de procuração que você esteja implementando.
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".