2010-02-14 47 views
3

我需要創建一個程序來接收HTTP請求並將這些請求轉發給Web服務器。使用Jpcap創建反向代理

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

我已經成功地使這個只使用Java的套接字,但客戶需要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跟蹤,收集這些數據包,向正確的位置發出請求,然後將該響應重定向回客戶端,就好像它是響應一樣從它自己的要求?要麼我真的不理解數據包捕獲,要麼這是一項艱鉅的任務。在他們的路由器上思科的Layer7東西領域不是這種事情嗎? – ShabbyDoo 2010-03-22 00:53:30

+0

是的,這是正確的ShabbyDoo。 – 2010-03-22 16:38:50

回答

1

爲什麼?他的原因是什麼?他是否真的想爲你已經完成的同樣事情付出十倍的成本?

您不需要Jpcap來實現HTTP代理。它可以完全在java.net或java.nio中完成。

+0

因爲他們在論文中寫道他們會使用Jpcap。 :)) – 2010-02-15 14:18:57

+0

@EJB。同意並想知道寫這樣一個東西的好處是否會給予所有開源的東西。這可能是一項家庭作業嗎? 「客戶」是一些不想做自己的項目的學生嗎? – ShabbyDoo 2010-03-22 00:52:52

+0

對不起。我忘了檢查這個答案。我完成了這個項目,並使用套接字編程。方法更容易,我沒有看到在這種情況下「生」的好處。 – 2010-03-22 16:40:41

1

我不認爲你可以做到這一點,至少在Windows的盒子。 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交換。使用來自「實驗」的數據,我嘗試使用JPCap而不是nginx來實現,但卻一直停留在客戶端計算機如何自動選擇其他計算機可以連接的可用端口。我敢肯定,如果我繼續進行JPCap路線,那不僅僅是我會遇到的問題。 – 2010-03-22 16:46:28

+0

另外,IIRC,nginx沒有丟棄來自客戶端計算機的任何數據包。但我可能是錯的。 – 2010-03-22 16:47:46

+0

反向代理不必丟棄數據包。你說的是防火牆。不是一回事。客戶端將反向代理視爲實際的服務器。他沒有提到任何關於'在電線上'的事情。 – EJP 2012-05-29 23:16:53