2011-12-05 59 views
4

我想爲我的論文在Android上設置一個透明的TCP代理,但我遇到了一些問題。我正在使用我在本網站上找到的軟件 - http://en.dfr.ch/free-software/java-tcp-proxy - 源代碼可以免費使用。在Android/Linux上設置透明TCP代理時遇到問題

我已經提取了源代碼並從中創建了一個Android應用程序。代碼的主要部分在下面的循環中。

while(!interrupted()) { 
    Socket serverSocket=srvSock.accept(); 
    Log.e(TAG, "New incoming connection"); 
    try { 
     serverSocket.setSoLinger(true,lingerTime); 
     Socket clientSocket=new Socket(dstAddr,dstPort); 
     clientSocket.setSoLinger(true,lingerTime); 
     Log.e(TAG, "Server socket and client socket created"); 
     StreamCopyThread sToC=new StreamCopyThread(serverSocket,clientSocket, "BrowserSide"); 
     StreamCopyThread cToS=new StreamCopyThread(clientSocket,serverSocket, "ServerSide"); 
     Log.e(TAG, "Working threads created"); 
     sToC.setPeer(cToS); 
     cToS.setPeer(sToC); 
     Log.e(TAG, "Peers defined"); 
     synchronized(lock) { 
      connections.addElement(cToS); 
      connections.addElement(sToC); 
      sToC.start(); 
      cToS.start(); 
      Log.e(TAG, "Working threads running"); 
     } 
    } catch(Exception xc) { 
     Log.e(TAG, header+":"+xc.getMessage()); 
     // xc.printStackTrace(); 
    } 
} 
srvSock.close(); 

流量從IP重定向到代理處理它的本地主機。要做到重定向,我已經使用了下面的防火牆規則:

iptables -t nat -A OUTPUT -p tcp --dport 80 -d [any ip] -j REDIRECT --to-port 8080 

這似乎在重定向交通工作,但代理運行時,它似乎直到用完,不斷創造新的線程(連接)的記憶。通過日誌記錄,輸出與下面類似。其中......代表錯誤之前的上述輸出日誌的多個循環。

工作線程運行

新傳入的連接

服務器套接字和客戶端套接字創建

工作線程創建

同行定義

BrowserSide - > 611

運行

工作線程...

/127.0.0.1:8080 < - >/[任何IP]:80:打開的文件太多

我,爲什麼真糊塗它工作不正常。當我在計算機上的Ubuntu中嘗試它時出現相同的錯誤,但在Windows中它工作得很好。我想這可能是iptables或Linux中的一些基於jvm/socket的問題。我目前正在運行iptables版本1.4.4。

非常感謝您花時間看看這個問題。

+0

周圍不要惹SO_LINGER。這是毫無意義的,特別是在Java中,因爲如果關閉超時,您不會收到錯誤。 'serverSocket'對於一個接受的套接字來說是一個糟糕的名字,尤其是當它從一個類名爲ServerSocket的對象接受時。 – EJP

回答

1

你比可能會引發在代碼正在被重定向的同一端口的連接更多。

考慮:

iptables -t nat -I OUTPUT -p tcp --dport 80 -d [any ip] -m owner \! --gid-owner proxyrunner -j REDIRECT --to-port 8080 

這樣就可以排除運行爲組proxyrunner程序,確保相應的執行代理:

sg proxyrunner 'java [...]'