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