Erstellen eines Reverse-Proxy mit Jpcap
-
20-09-2019 - |
Frage
Ich brauche ein Programm zu erstellen, die HTTP-Anforderung empfängt und weiterleitet diese Anfragen an den Web-Server.
Diagramm http://img269.imageshack.us/img269/1862/h98trsly. jpg
Ich habe erfolgreich diese nur mit Java Sockets gemacht, aber der Client benötigt, um das Programm in Jpcap umgesetzt werden. Ich würde gerne wissen, ob dies möglich ist und was Literatur sollte ich für dieses Projekt lesen.
Das ist, was ich habe jetzt durch Zusammennähen Stücke aus dem 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);
}
}
Jede Hilfe wäre sehr geschätzt. Danke.
Lösung
Warum? Was sind seine Gründe? Hat er wirklich haben Sie zehn Mal die Kosten für die gleiche Sache zu bezahlen bereits getan?
Sie müssen Jpcap nicht HTTP-Proxies implementieren. Es kann vollständig in java.net oder java.nio erfolgen.
Andere Tipps
Ich glaube nicht, Sie können damit dies geschieht, zumindest auf einem Windows-. Jpcap ist nur ein Wrapper für Winpcap, und dieser zugrunde liegenden Mechanismus kann beobachteten Pakete nicht löschen:
Also, ich sehe nicht, wie man ein Reverse-Proxy aufbauen kann „auf dem Draht.“ Würden Sie nicht haben folgendes zu tun:
-
Beachten Sie eine eingehende HTTP-Anforderung von zusammen Pakete in Echtzeit Ansetzen und Ablegen von durch den beabsichtigten Host empfangen wird.
-
Machen Sie die alternative HTTP-Anforderung aus welchen Proxy-Regeln, die Sie umsetzen.
-
Besorgen Sie sich die Antwort von Ihrem Wunsch und Push-out-Pakete auf dem Kabel, das gefälschte eine Antwort von dem ursprünglichen Host?
Da Sie nicht die eingehenden Pakete fallen kann, wird nicht der richtige Host-Versuch, die Anforderung zu verarbeiten und werfen Pakete eigene auf den Draht in Reaktion? Wahrscheinlich gibt es noch mehr, dass ich weiß nicht, über wie ich bin kein Netzwerkexperte. Diese Frage hat mich einfach zu neugierig, was möglich wäre, unter Verwendung eines solchen „Scheibe“.