2010-02-14 6 views
3

HTTP 요청을 수신하고 해당 요청을 웹 서버에 전달하는 프로그램을 만들어야합니다.Jpcap을 사용하여 역방향 프록시 생성

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

내가 성공적으로 단지 자바 소켓을 사용하여이를 만든하지만 클라이언트가 Jpcap에서 구현 될 수있는 프로그램이 필요했습니다. 이것이 가능한지, 그리고이 프로젝트를 위해 읽어야 할 문학이 무엇인지 알고 싶습니다.

이것은 내가 함께 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); 
    } 
} 

어떤 도움을 크게 감상 할 수있다. 고맙습니다.

+0

jpcap 제한을 가정하면서 실시간으로 wireshark 스타일의 http 추적을 수행하고 해당 패킷을 snarfing하고 적절한 위치에 요청한 다음 해당 응답을 응답 인 것처럼 클라이언트로 다시 리디렉션하는 방법에 대해 이야기하고 있습니까? 자체 요청에서? 패킷 캡처를 실제로 이해하지 못하거나 어려운 작업입니다. 시스코의 라우터에있는 Layer7 제품의 영역에서 이런 종류의 일이 아닌가? – ShabbyDoo

+0

예, 올바른 ShabbyDoo입니다. –

답변

1

왜? 이유는 무엇입니까? 그는 당신이 이미 한 것과 동일한 비용으로 10 배의 비용을 정말로 내고 싶습니까?

HTTP 프록시를 구현하는 데 Jpcap이 필요하지 않습니다. 전적으로 java.net 또는 java.nio 내에서 수행 할 수 있습니다.

+0

그들이 Jpcap을 사용할 것이라고 자신의 논문에 썼기 때문에. :)) –

+0

@EJB. 동의 할 것이고 그러한 것을 작성함으로써 얻을 수있는 이점은 모든 오픈 소스 자료를 얻을 수 있다는 것입니다. 아마도 숙제가 있습니까? "클라이언트"는 자신의 프로젝트를하고 싶지 않은 학생입니까? – ShabbyDoo

+0

죄송합니다. 나는이 대답을 잊어 버렸다. 이 프로젝트를 마치고 소켓 프로그래밍을 사용했습니다. 길을 쉽게 그리고 나는이 일을 "원시"하는 이점을 보지 못한다. –

1

적어도 윈도우에서이 작업을 수행 할 수 있다고 생각하지 않습니다. Jpcap은은 WinPcap 단지 래퍼이며,이 기본 메커니즘은 관찰 된 패킷 드롭 할 수 없습니다. "와이어에"그래서, 당신이 역방향 프록시를 구축 할 수 표시되지 않습니다

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

  1. 실시간으로 함께 패킷을 조립할 및 의도 된 호스트가 수신되는 것을 놓아 들어오는 HTTP 요청을 준수하십시오 다음을 수행해야하지 않을까요.

  2. 구현중인 프록시 규칙을 기반으로 대체 HTTP 요청을 만듭니다.

  3. 요청에 대한 응답을 받고 원본 호스트의 응답을 가짜 전송하는 패킷을 푸시 아웃 하시겠습니까?

인바운드 패킷을 삭제할 수 없으므로 의도 된 호스트가 요청을 처리하고 응답으로 해당 패킷을 유선에 던지지 않습니까? 네트워킹 전문가가 아니기 때문에 내가 모르는 경우가 많을 것입니다. 이 질문은 단지 그러한 "심"을 사용하여 무엇이 가능할 것인지 궁금하게 생각하게했습니다.

+0

소켓 프로그래밍 경로를 시작하기 전에 JPCap을 사용하여 구현하려고했습니다.내가 한 일은 : 나는 클라이언트 컴퓨터와 웹 서버를 운영하는 다른 컴퓨터와 역방향 프록시 모드에서 nginx의 교환을 냄새 맡았다. "실험"의 데이터를 사용하여 nginx 대신 JPCap을 사용하여 시도했지만 클라이언트 컴퓨터가 다른 컴퓨터가 연결할 수있는 포트에서 자동으로 사용 가능한 포트를 선택하는 방법에 집착했습니다. JPCap 라우트를 계속 진행한다면 그것이 발생할 수있는 문제 만은 아니라고 확신합니다. –

+0

또한 IIRC, nginx는 클라이언트 컴퓨터에서 오는 패킷을 삭제하지 않았습니다. 나는 틀린 것일지도 모른다. –

+0

역방향 프록시는 패킷을 삭제할 필요가 없습니다. 당신은 방화벽에 대해 말하고 있습니다. 같은 것이 아닙니다. 리버스 프록시는 클라이언트가 실제 서버로 인식합니다. 그는 '유선'에 관해서는 아무 말도하지 않았다. – EJP

관련 문제