【问题标题】:Trouble setting up a Transparent TCP Proxy on Android/Linux在 Android/Linux 上设置透明 TCP 代理时遇到问题
【发布时间】:2012-01-13 13:51:35
【问题描述】:

我正在尝试在 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

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

正在运行的工作线程

新的传入连接

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

创建的工作线程

定义的同行

BrowserSide-->611

正在运行的工作线程

...

/127.0.0.1:8080 /[any ip]:80:打开的文件太多

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

提前感谢您抽出宝贵时间查看此问题。

【问题讨论】:

  • 不要乱搞 SO_LINGER。这是毫无意义的,尤其是在 Java 中,因为如果关闭超时,您不会收到错误消息。 serverSocket 对于已接受的套接字来说是一个糟糕的名称,尤其是当它从类名为 ServerSocket 的对象中接受时。

标签: java android linux proxy iptables


【解决方案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 [...]'

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 甚至不尝试回答实际问题。
    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多