java - 在Android/Linux上设置透明的TCP代理问题

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

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

这似乎在重定向流量方面起作用,但是当代理运行时,它似乎会不断创建新线程(连接),直到它耗尽内存。使用日志记录,输出类似于以下内容。其中...表示在报错前多次循环以上输出日志。

Working threads running

New incoming connection

Server socket and client socket created

Working threads created

Peers defined

BrowserSide-->611

Working threads running

...

/127.0.0.1:8080 <-> /[any ip]:80:Too many open files

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

预先感谢您花时间查看此问题。

最佳答案

您很有可能在代码中启动连接到正在重定向的同一端口的连接。

考虑:

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 [...]'

关于java - 在Android/Linux上设置透明的TCP代理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391821/

相关文章:

java - EditText 在其他方法上变为 null

java - Spring RestTemplate - 异步与同步 restTemplate

java - 排序时遇到问题

android - 将重力传感器、加速度计或陀螺仪事件注入(inject)正在运行的应用程序

java - java中切换到POST方法不起作用

java - 无法通过广播地址接收 UDP 数据包,ArtNet

java - Java 线程 ID 应该总是从 0 开始吗​​?

java - 如何修复此错误 : java. lang.NoSuchMethodError: 'java.lang.AutoCloseable org.mockito.MockitoAnnotations.openMocks(java.lang.Object)'

python - 如何正确设置 cron?

Python操作系统输出