test01wrk / cmwrap

Automatically exported from code.google.com/p/cmwrap
0 stars 0 forks source link

在不支持 netfilter log 的系统中无法穿越 #72

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?
1. 测试一切正常
2.
3.

What is the expected output? What do you see instead?

结果无法穿越,调查发现是内核中的 netfilter 不支持 log。

来源:

http://www.hiapk.com/bbs/viewthread.php?tid=471067&highlight=cmwrap

这位楼主已经实现了用另的方法来替代 netfilter 
log,期待他分享实现方法。

Original issue reported on code.google.com by gnom...@gmail.com on 6 Sep 2010 at 1:05

GoogleCodeExporter commented 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

GoogleCodeExporter commented 8 years ago
多谢,求补丁,或者愿意直接提交到svn里的话,请 biAji 
给权限做个分支提交。

哈希表部分等 biAji 来解答

Original comment by gnom...@gmail.com on 8 Sep 2010 at 4:31

GoogleCodeExporter commented 8 years ago
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

GoogleCodeExporter commented 8 years ago
关于hashtable的部分,我记得我在匹配完成后会将符合的移除��
�。

我也在犹豫,/proc/net/ip_conntrack有没有办法每次不全取的  
每个连接都cat一次,感觉怪怪的~

Original comment by biaji...@gmail.com on 9 Sep 2010 at 3:56

GoogleCodeExporter commented 8 years ago
需要root才能读,su 后如果直接可读的话,就能用 FileChannel 
mmap 更好。不清楚 su 应程序是个啥权限。dmesg 跟 cat 
没多大差异。

Original comment by gnom...@gmail.com on 9 Sep 2010 at 4:14

GoogleCodeExporter commented 8 years ago

我在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

GoogleCodeExporter commented 8 years ago
意思就是~~  祈祷吧!!

Original comment by biaji...@gmail.com on 17 Sep 2010 at 9:16

GoogleCodeExporter commented 8 years ago
Issue 75 has been merged into this issue.

Original comment by biaji...@gmail.com on 17 Sep 2010 at 9:18