无法在Android / Linux上设置透明TCP代理

时间:2011-12-05 21:01:25

标签: java android linux proxy iptables

我正在尝试在Android上为我的论文设置一个透明的TCP代理,但是我遇到了一些问题。我正在使用我在本网站上找到的软件 - http://en.dfr.ch/free-software/java-tcp-proxy - 来源免费提供。

我已经提取了源代码并从中创建了一个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重定向到代理处理它的localhost。要进行重定向,我使用了以下iptables规则:

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

这似乎可以用于重定向流量,但是当代理运行时,它似乎会不断创建新线程(连接),直到内存不足为止。使用日志记录,输出类似于下面。 where ...表示在错误之前记录上述输出的几个循环。

  

正在运行的工作线程

     

新的传入连接

     

创建了服务器套接字和客户端套接字

     

创建工作线程

     

同行定义

     

BrowserSide - > 611

     

正在运行的工作线程

     

...

     

/127.0.0.1:8080< - > / [any ip]:80:打开文件太多

我真的很困惑为什么它不能正常工作。当我在计算机上的Ubuntu中尝试它时出现相同的错误,但它在Windows中完全正常。我认为这可能是iptables或Linux中一些基于jvm / socket的问题。我目前正在运行iptables版本1.4.4。

提前感谢您花时间看看这个问题。

2 个答案:

答案 0 :(得分: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 [...]'

答案 1 :(得分:-1)

您是否尝试使用相同配置运行其他Java代理,例如Little代理?

http://dev.littleshoot.org/littleproxy/

其他开源代理:http://proxies.xhaus.com/java/

相关问题