免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 独孤九贱
打印 上一主题 下一主题

Netfliter状态跟踪之动态协议的实现浅析(tftp实现) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-10-16 19:27 |只看该作者
原帖由 独孤九贱 于 2006-10-16 18:57 发表


你们说的什么GFW,什么Reset?听不懂,哪位能否详细讲讲?

他们说的可能是这个
http://seblog.kilu2.de/2006/05/gfw.html
但无论是内容过滤屏蔽,还是共享探测禁止,都会发送 RST 干扰包

论坛徽章:
0
12 [报告]
发表于 2006-10-16 22:12 |只看该作者
单纯过滤rst当然不行,但由于FW发过来的RST包的ipttl是按照标准Unix的64递减,和通常服务器的ttl在绝大多数情况下是不同的,因此只要在conntrack中加上ttl持续性检测机制,也就是说同一个连接,对端服务器发送的所有包的ttl应该都是相同的,有不同的就认为是GFW的RST,这样就能在很大程度避免GFW的RST干扰。不过这么做是违反TCP/IP协议栈约束的,因为从IP网络的设计上,两个ip之间的通讯所有包并不一定是走同样的路由的。不过为了达到我们的目的,只能这么做了,实际情况99.9%的连接其所有包都只走一条路径,就是说对端过来的IP包的TTL是稳定的。

另外,我有这个想法是因为看了这篇文章:
http://www.cnbeta.com/modules.ph ... ticle&sid=16491

[ 本帖最后由 colddawn 于 2006-10-16 22:21 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2006-10-17 08:59 |只看该作者
原帖由 platinum 于 2006-10-16 19:27 发表

他们说的可能是这个
http://seblog.kilu2.de/2006/05/gfw.html
但无论是内容过滤屏蔽,还是共享探测禁止,都会发送 RST 干扰包


我只找到这个:
http://baike.baidu.com/view/6754.htm

原来就是它啊!!咬牙切齿中!

[ 本帖最后由 独孤九贱 于 2006-10-17 09:00 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2006-10-17 17:25 |只看该作者
master_conntrack
      |
      |
      expect1 <---- child_conntrack1
      |
      |
      expect2 <---- child_conntrack2


像这种情况(即存在子连接的子连接的情况,
如ip_conntrack_helper_pptp.c中expectfn = pptp_expectfn,
  ip_conntrack_helper_h323.c中exp->expectfn = ip_conntrack_h245_expect)的情况LZ好象讲的不深入。。。
存在子连接的子连接的情况(exp->expectfn !=NULL)应该不止一层help(看看ip_conntrack_helper_pptp.c就会发现help有h245_help、q931_help、ras_help等),每多一层子连接( child_conntrack)应该多一层help。

而ip_conntrack_tftp.c和ip_conntrack_ftp.c相对来说是相当简单的了(因为此时exp->expectfn = NULL,只有1个子连接)。

希望能够对存在子连接的子连接的情况(exp->expectfn !=NULL)作一个更深入的剖析。
向LZ鞠躬了!!!

论坛徽章:
0
15 [报告]
发表于 2006-10-17 17:32 |只看该作者
Linux netfilter Hacking HOWTO中有:

连接跟踪帮助模块

描述

连接跟踪模块的任务是指出哪一个信息包属于一个已经建立的连接。模块这样做有下面的含义:
· 告诉netfilter我们的模块对哪一个信息包感兴趣(大多数的帮助操作一个特殊的端口)。
· 用netfilter注册一个函数。这个函数被每一个符合上面的标准的信息包调用。
· 一个“ip_conntrack_expect_related()”函数,它能从那里被调用来告诉netfilter去期待一个关联连接。

如果这里有一些附加的工作在预期的连接的第一个信息包到达的时候被完成,模块可以注册一个在这个时候被调用的回调函数。
可用的结构和函数
你的内核模块的初始函数用一个指向“struct ip_conntrack_helper”的指针调用“ip_conntrack_helper_register()”。这个结构有下面的成员:
list
这是链表的报头。Netfilter在内部掌管这个列表只要用“{NULL,NULL}”初始化。
name
这是一个指向字符串常量的指针,该常量是协议名称。(“ftp”,“irc”,…)。
flags
一组有下面一个或多个标志的标志:
· IP_CT_HELPER_F_REUSE_EXPECT重新使用期待值,如果限制(查看下面的“max_expected”)到达。
me
一个指向帮助的模块结构的指针。用“THIS_MODULE”宏初始化它。
max_expected
未认可的(突出的)预期值的最大数值。
timeout
对于每一个未认可的预期值的timeout(很短时间内)。在预期被“ip_conntrack_expect_related()”函数产生片刻之后,一个预期是被注销的“timeout”。
tuple
这是一个“struct ip_conntrack_tuple”,它指出我们的conntrack帮助模块感兴趣的信息包。
mask
又一个“struct ip_conntrack_tuple”,这个掩码指定哪一个数组的比特位是有效的。
help

netfilter应该为每一个信息包匹配tuple+mask调用的函数。

一个conntrack帮助模块的框架例子


#define FOO_PORT 111

static int foo_expectfn(struct ip_conntrack *new)
{
/* called when the first packet of an expected
connection arrives */

return 0;
}

static int foo_help(const struct iphdr *iph, size_t len,
struct ip_conntrack *ct,
enum ip_conntrack_info ctinfo)
{
/* analyze the data passed on this connection and
decide how related packets will look like */

/* update per master-connection private data
(session state, ...) */
ct->help.ct_foo_info = ...

if (there_will_be_new_packets_related_to_this_connection)
{
struct ip_conntrack_expect exp;

memset(&exp, 0, sizeof(exp));
exp.t = tuple_specifying_related_packets;
exp.mask = mask_for_above_tuple;
exp.expectfn = foo_expectfn;
exp.seq = tcp_sequence_number_of_expectation_cause;

/* per slave-connection private data */
exp.help.exp_foo_info = ...

ip_conntrack_expect_related(ct, &exp);
}
return NF_ACCEPT;
}

static struct ip_conntrack_helper foo;

static int __init init(void)
{
memset(&foo, 0, sizeof(struct ip_conntrack_helper);

foo.name = "foo";
foo.flags = IP_CT_HELPER_F_REUSE_EXPECT;
foo.me = THIS_MODULE;
foo.max_expected = 1; /* one expectation at a time */
foo.timeout = 0; /* expectation never expires */

/* we are interested in all TCP packets with destport 111 */
foo.tuple.dst.protonum = IPPROTO_TCP;
foo.tuple.dst.u.tcp.port = htons(FOO_PORT);
foo.mask.dst.protonum = 0xFFFF;
foo.mask.dst.u.tcp.port = 0xFFFF;
foo.help = foo_help;

return ip_conntrack_helper_register(&foo);
}

static void __exit fini(void)
{
ip_conntrack_helper_unregister(&foo);
}



其中conntrack帮助模块的框架例子对我们的参考意义实在太大了
向所有伟大的人致敬!!!

论坛徽章:
0
16 [报告]
发表于 2006-10-19 13:50 |只看该作者

update_nl_seq find_nl_seq作用是什么

update_nl_seq    find_nl_seq作用是什么
quickquick 该用户已被删除
17 [报告]
发表于 2007-09-27 23:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
18 [报告]
发表于 2008-01-18 15:11 |只看该作者
又拜读了你的一篇大作,很不错,继续关注你的文章!!!!!!!!!

论坛徽章:
0
19 [报告]
发表于 2011-04-13 15:17 |只看该作者
很好很强大,谢谢

论坛徽章:
0
20 [报告]
发表于 2011-05-15 23:02 |只看该作者
回复 1# 独孤九贱


    楼主,小弟最近在做一个实验,要实现在局域网但是IP地址不在同一网段内的两台机器正常通信,可否指点下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP