Closed GoogleCodeExporter closed 8 years ago
(rediceli@hiapk)
基本原理是分析 /proc/net/nf_conntrack
(2.6.18或以下可能是/proc/net/ip_conntrack),内容类似下面的行:
ipv4 2 tcp 6 428810 ESTABLISHED src=10.199.1.160 dst=127.0.0.1
sport=44793 dport=5228 [UNREPLIED] src=127.0.0.1 dst=10.199.1.160 sport=5228
dport=44793 use=1
每行包含了双向的数据信息,我们关心前一半的信息即可,��
�从日志里提取信息类似,因此代码只需简单调整。不过要注�
��,这些信息还包括cmwrap向代理服务器建立的连接信息,因此
,仅源端口相同不足以说明命中,这个需要调整。还有就是��
�个信息不能清掉,因此每次都要面对全部的信息,好在手机�
��的连接信息不会太多。算法上可以优化,如略过UDP的行,略
过非ESTABLISHED的行,只检查前半行等等。
另外,提一个意见,就是缓存的使用。几个对象里都有Hash表�
��缓存信息,例如源端口与目的地址和端口的映射表,这个表
有几个问题:
1.
一个连接断掉后,其它应用使用了相同的源端口,缓存命中��
�但实际不可用。
2.
这个缓存在没有停下服务前会一直增长,占用宝贵的内存。
Original comment by redice...@gmail.com
on 8 Sep 2010 at 4:15
多谢,求补丁,或者愿意直接提交到svn里的话,请 biAji
给权限做个分支提交。
哈希表部分等 biAji 来解答
Original comment by gnom...@gmail.com
on 8 Sep 2010 at 4:31
rediceli兄台已经给了patch了:
//========================
rediceli
基本原理是分析 /proc/net/nf_conntrack
(2.6.18或以下可能是/proc/net/ip_conntrack),因为信息和dmesg中获得��
�信息相似,所以小改一下就可以用了.
算法还需要优化,只处理 established
的连接.因为每行信息都包含正向和反向转换信息,所以不论是
dst还是dport,都只分析第一个。例如下面是nf_conntrack的一行:
ipv4 2 tcp 6 428810 ESTABLISHED src=10.199.1.160 dst=127.0.0.1
sport=44793 dport=5228 [UNREPLIED] src=127.0.0.1 dst=10.199.1.160 sport=5228
dport=44793 use=1
仅供参考,在我手机上能用,还在测试,有时候进增强模式��
�cmwrap会FC。
Index: src/net/biaji/android/cmwrap/services/NormalTcpServer.java
===================================================================
--- src/net/biaji/android/cmwrap/services/NormalTcpServer.java (revision
363)
+++ src/net/biaji/android/cmwrap/services/NormalTcpServer.java (working
copy)
@@ -174,7 +174,7 @@
return result;
}
- final String command = "dmesg -c"; // 副作用未知
+ final String command = "cat /proc/net/nf_conntrack"; //
副作用未知
DataOutputStream os = null;
InputStream out = null;
@@ -204,24 +204,26 @@
boolean match = false;
- if (line.contains("CMWRAP")) {
+ //if (line.contains("CMWRAP")) {
+ if (true) {
String addr = "", destPort = "";
String[] parmArr = line.split(" ");
for (String parm : parmArr) {
String trimParm = parm.trim();
- if
(trimParm.startsWith("DST")) {
+ if (addr=="" &&
trimParm.startsWith("dst")) {
addr = getValue(trimParm);
}
- if
(trimParm.startsWith("SPT")) {
+ if
(trimParm.startsWith("sport")) {
if (sourcePort.equals(getValue(trimParm)))
match = true;
+ else
+ break;
}
- if
(trimParm.startsWith("DPT")) {
+ if (destPort=="" &&
trimParm.startsWith("dport")) {
destPort = getValue(trimParm);
}
-
}
if (match)
@@ -260,5 +262,4 @@
public String[] getRules() {
return iptablesRules;
}
-
}
Original comment by biaji...@gmail.com
on 9 Sep 2010 at 2:21
关于hashtable的部分,我记得我在匹配完成后会将符合的移除��
�。
我也在犹豫,/proc/net/ip_conntrack有没有办法每次不全取的
每个连接都cat一次,感觉怪怪的~
Original comment by biaji...@gmail.com
on 9 Sep 2010 at 3:56
需要root才能读,su 后如果直接可读的话,就能用 FileChannel
mmap 更好。不清楚 su 应程序是个啥权限。dmesg 跟 cat
没多大差异。
Original comment by gnom...@gmail.com
on 9 Sep 2010 at 4:14
我在3M求助:i need the netfilter very much ,could u give me a new 2.1
rom with netfilter???TX
对方回答:cannot implement netfilter until we receive the kernel source
from mototrola.
Original comment by roseff....@gmail.com
on 14 Sep 2010 at 11:13
意思就是~~ 祈祷吧!!
Original comment by biaji...@gmail.com
on 17 Sep 2010 at 9:16
Issue 75 has been merged into this issue.
Original comment by biaji...@gmail.com
on 17 Sep 2010 at 9:18
Original issue reported on code.google.com by
gnom...@gmail.com
on 6 Sep 2010 at 1:05