2011-12-05 14 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のルールを使用している:これは、トラフィックをリダイレクトで動作するようです

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

を、しかし、プロキシが実行されている場合、それがなくなるまで継続的に新しいスレッド(接続)を作成しているようですメモリの。ロギングでは、出力は以下のようになります。ここで、...はエラーの前に出力ログのいくつかのループを表します。 > 611

-

の作業スレッドで実行

新しい着信接続

サーバソケットとクライアントソケットを作成

の作業スレッドが

ピアが

BrowserSideを定義し

を作成しました012

...

/127.0.0.1:8080 <実行しの

の作業スレッド - >/[任意のIP]:80:開いているファイルが多すぎます

私は理由として、本当に混乱していますそれは正しく動作していません。 Ubuntuでコンピュータで試してみると同じエラーが表示されますが、Windowsでは問題なく動作します。 Linuxでiptablesやjvm/socketに基づく問題があるかもしれないと思っています。私は現在、iptablesバージョン1.4.4を実行しています。

この問題を見るために時間をとっていただきありがとうございます。

+0

はSO_LINGERと周りの混乱をしないでください。それは無意味です、特にJavaの場合は、クローズがタイムアウトするとエラーにならないためです。 'serverSocket'は、特にクラス名が' ServerSocket'のオブジェクトから受け入れられたときに受け入れられるソケットのひどい名前です。 – EJP

答えて

1

あなたは可能性がリダイレクトされているのと同じポートにあなたのコードで接続を開始する以上です。

を考えてみましょう。これは、グループproxyrunnerとして実行中のプログラムを除外します

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

、それに応じてプロキシを実行してください:

sg proxyrunner 'java [...]' 
関連する問題