在Android/Linux上设置透明TCP代理遇到问题

4
我正在为我的论文尝试在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重定向到本地主机,代理处理它。为了进行重定向,我使用了以下iptables规则:

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

这似乎可以重定向流量,然而当代理在运行时,它似乎会不断地创建新线程(连接),直到内存耗尽。通过日志,输出与下面类似。其中“...”表示错误之前的多个循环。
引用: - 工作线程正在运行 - 新连接到来 - 创建服务器套接字和客户端套接字 - 创建工作线程 - 定义对等体 - 浏览器端 - > 611 - 工作线程正在运行 - ... - /127.0.0.1:8080 <-> /[any ip]:80:Too many open files
我真的很困惑为什么它不能正常工作。当我在计算机上的Ubuntu上尝试时,出现了相同的错误,但在Windows上完美地工作。我认为这可能是Linux中iptables或某些基于jvm/socket的问题。我目前运行的是iptables版本1.4.4。
感谢您花时间查看这个问题。

不要随意使用SO_LINGER。这是毫无意义的,特别是在Java中,因为如果关闭超时,你不会收到错误。serverSocket是一个可接受的套接字的糟糕名称,特别是当它从一个类名为ServerSocket的对象中被接受时。 - user207421
2个回答

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

甚至没有尝试回答实际问题。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接