Netfilter 读书笔记

合集下载

涟漪效应读书笔记读书摘录读书感想

涟漪效应读书笔记读书摘录读书感想

涟漪效应合作,以及付出和获取信任的机制在这一章里,我的目标是解释付出者和获取者的差异如何影响个人和团队的成功。

合作与创造性的角色我们会自然地倾向于将创造性的成功归结于个人,但真正伟大的工作实际上来自合作。

这两者之间的鸿沟并不限于创造力领域。

即使在做那些看上去非常独立,完全依赖于头脑的工作中,其成功也需要别人的帮助,这超过了我们所意识到的程度。

尤其是手术医生和证券投资分析师,高度依赖团队合作。

大多数将独立视为力量的象征,将互相依赖视为弱点的象征。

对于获取者来说,这一点尤其正确,他们认为自己高人一等,与众不同。

他们相信,如果自己过于依赖他人,就有可能被别人超越。

付出者拒绝将互相依赖视为一种弱点。

他们更愿意将互相依赖视为力量的源泉,一种整合众人技能,实现更大目标的手段。

付出者合作时的一个代表性特征:他们承担起那些能让团队获得最大收益的任务,即使这些任务并不一定能给他们自己带来收益,这让他们的团队变得更好。

那些经常为同事贡献出时间和知识的人,自己也能赢得更高的报酬和升迁概率。

当付出者将团队的利益置于自己之上时,他们就传递出了信号,表明自己的首要目标是让团队获益。

结果就是,付出者赢得了同事们的尊重。

如果获取者提议做出改变,同事会怀疑他们的动机,认为他们是在为自己考虑。

但是,如果冒险的想法是由付出者提出的,同事会愿意倾听他们的讲述,并给予他们奖励,因为他们知道付出者确实真诚地希望做出贡献。

每个人都希望能因为自己做的事而得到认可,特别是在团队获得奖励时,团队中每个人都应该得到应有的奖励(物质的或精神的)。

独占功劳会受到同事的一致批判。

责任偏差责任偏差(responsibility bias):夸大我们自己对于他人的贡献。

这是一种获取者特别容易犯的错误,一定程度上是因为我们希望积极地看待和展示自己的渴望。

比如在婚姻关系中,你和你的伴侣都各自评估自己在这段关系中家务劳动的付出比例,大约有75%的伴侣给出的答案之和超过了100%,即大家都认为自己是付出最多的。

成瘾的开关读书摘录读书感想读书笔记

成瘾的开关读书摘录读书感想读书笔记

成瘾的开关1、利用人们的想象,大脑会自动的,强迫性的解读关注到的一切,只要品牌释放的信息能让人们进入自我的思想模式,开始咀嚼思想,就能够制造和开启他的任何需求。

2、在人们的心中,与自我相关的事情,就是重要的事情。

而对事物赋予情感让人们的自我意志有了用力的方向。

自我情感和意志,制造了用力的两端,抗拒(关闭),渴望(开启)。

抗拒和渴望是在同一个框架里面的,都是为了让自我变得更加美好和没有局限,体验到自我良好的感觉。

人们需要制造错觉和幻象来体验到自我感——掌控感、安全感、存在感、价值感、意义等。

如果人们没有自我表达的需求,就不会有所谓的品牌。

3、人们常常是心口不一的,所以要知道人们是否真的对一个品牌上瘾,也要看品牌相关的信息是否很好的激活了人们的自我脑区。

这样,人们对品牌的执迷,更多的是对自我本身的执迷。

我们不能去扫描人们的大脑,那么我们可以尽量的让自己的品牌和产品信息符合自我情感模式,这样就可以很好激活自我脑区。

4、每个人的灵魂深处都有一个不完美的自己,我们的执着追求和不懈努力都是为了逃离那个存在各种局限的自我,也抗拒自己一成不变,乏味的生活。

人们对自身的抗拒是社会性的,人们普遍认为自己的某些存在方式是不完美的。

所以一切的恐惧都和社会性有直接或者间接的关系。

5、区别、分别是制造恐惧的一把刀,正是因为事物就有了区别,才会让人有恐惧的空间,区别就是触及自我神经的开关。

区别的结果是人与人有了分别,这也就有了人们抗拒的对象,不如意,不成功,不美好的自我,和人们渴望成为的对象,完美的,美好的自我。

6、对于品牌来说,就是要让消费者对某种状态产生抗拒,并最终促成消费行为。

最常见的方法就是否定他们的生活,让人们感觉到自己是以一种不如意的状态存在着。

一个产品或服务,如果不能否定目标客户当下的生活,它就毫无价值。

其实,不是商家在否定消费者的生活,是自我在否定自我。

自我的介入就是要避免别人异样的眼光,因为自我要的是变得更好。

透明的螺旋读后感800字

透明的螺旋读后感800字

透明的螺旋读后感800字(中英文实用版)After immersing myself in the transparent spiral of words, I found myself captivated by the intricate narrative that weaves a tale of self-discovery and introspection.The story, with its unique transparency, reveals layers upon layers of emotional complexity, much like the unfolding petals of a lotus blossom.在透明的螺旋文字中沉浸之后,我发现自己被这个交织着自我发现与内省的复杂叙事深深吸引。

这个故事,以其独特的透明度,揭示了情感复杂的层次,如同莲花瓣的层层展开。

Each chapter is a turn in the spiral, bringing me closer to the core of the characters" beings, exposing their vulnerabilities and strengths.The prose is delicate, almost ethereal, yet packing a punch that resonates with my own experiences, making the read an intimate and thought-provoking journey.每一章节都是螺旋的一次转动,让我更接近角色们的内心核心,展现了他们的脆弱与坚强。

文字细腻入微,几乎飘渺,却又充满力量,与我的经历产生共鸣,使得这次阅读成为一段亲密而发人深思的旅程。

The transparent spiral serves as a metaphor for the transparency we often seek in relationships and within ourselves.It"s a reminder that true understanding comes from peeling back the layers and exposing the raw, unfiltered truth beneath.透明的螺旋象征着我们在人际关系和自我探寻中常追求的透明度。

《夏绿蒂的网》读书笔记范文3篇

《夏绿蒂的网》读书笔记范文3篇

《夏绿蒂的网》读书笔记《夏绿蒂的网》读书笔记范文3篇引导语:读书笔记是指读书时为了把自己的读书心得记录下来或为了把文中的精彩部分整理出来而做的笔记。

在读书时,写读书笔记是训练阅读的好方法。

记忆,对于积累知识是重要的,但是不能依赖记忆。

下面是小编整理的《夏绿蒂的网》读书笔记范文,仅供参考,欢迎大家点击阅读。

《夏绿蒂的网》读书笔记范文篇1一只蜘蛛无力地趴在栏杆上,翡翠色的眼珠动了动,留恋地望着远去的车辆……这是美国著名作家E·B·怀特笔下一个震撼人心的画面。

当我看到夏绿蒂慢慢闭上双眼,手无力垂挂下来时,我的内心被震颤了。

夏绿蒂,一只蜘蛛,一只平平凡凡的蜘蛛,她的一生没有庸庸碌碌,与其它蜘蛛一样织网、捕虫;她的一生,虽平凡但耐人寻味。

任何事物随着时间的流逝终究都会老去,但人生长河中那颗代表友谊的宝石永远都不会褪色,它的光辉会永远在我们脑海中珍藏。

因为……它凝结着朋友之间那坚不可摧的力量呢!故事中的韦伯是一只春天的猪,春天的猪是注定不会见到冬雪的。

它们会在圣诞节前夕送到熏猪屋做成培根,做成熏猪火腿,成为圣诞夜餐桌上一道美味的佳肴。

但韦伯不能在这可怕的将来面前屈服,它渴望看到它朋友口中所说冬天那美丽、洁白无瑕的雪精灵,可现实往往比想象冷酷得多。

韦伯的好朋友夏绿蒂为了帮韦伯实现它的愿望,织出了人类不能想象出的文字网,终于让韦伯免遭进入熏猪屋的厄运,而夏绿蒂因生命到了尽头而永远地睡着了,她用自己的生命来证明了她俩之间的友谊!友谊是什么?友谊是一支美妙的歌曲,世上所有好朋友间那甜蜜的时刻都会收录进去;友谊是什么?友谊是一架忽隐忽现的钢琴,只有拥有美好友谊的人才能找到它弹奏出音乐;友谊是什么?友谊是冬日午后一抹温暖的阳光,照耀你的肌肤,照耀你的心房,将你心中最后一块冰冷的积雪也悄悄融化……其实,我们每个人都是一头等待友谊的猪,都在等待生活中自己的.夏绿蒂,一起,去守护这株美丽的友谊之树。

《夏绿蒂的网》读书笔记范文篇2这本书是美国作家怀特在1952年所写的儿童文学。

《瘾:让人上瘾的产品、广告与创意背后的秘密》读书笔记模板

《瘾:让人上瘾的产品、广告与创意背后的秘密》读书笔记模板

5未来的广告
苹果与宗教谁更广告? 寻找未来的酵母 策划未来的广告 塑造未来的我
精彩摘录
精彩摘录
这是《瘾:让人上瘾的产品、广告与创意背后的秘密》的读书笔记模板,可以替换为自己的精彩内容摘录。
作者介绍
同名作者介绍
这是《瘾:让人上瘾的产品、广告与创意背后的秘密》的读书笔记模板,暂无该书作者的介绍。
谢谢观看
3我的两个工具箱
工具箱A工具1:“为什么”指南针 工具2:2.5个“创意制式” 工具3:团团转计划圈 工具4:角色价值心电图 工具5:T式肯定器 工具6:A4白纸 工具7:ABCDEFG 工具8:“思索列车”时间表 工具9:24/7酵母GPS
Байду номын сангаас
4给大家几乎免费的午餐
世上几乎免费的午餐 免费午餐派发了 一块钱午餐1:公路上竖立的图腾酒店 一块钱午餐2:穿在身上的名画 一块钱午餐3:一间为你准备好思想的酒店 一块钱午餐4:会走动的行李箱 一块钱午餐5:广州应该很艺术吗? 一块钱午餐6:未来的航空公司吃什么?
读书笔记
读书笔记
各种10年前A面广告案例的复盘……玩广告的学历史学心理学都OK。 一切都是销售,一切都是广告,广告就是真正的站在客户的角度看待我们的产品。 没看全名就进来看了,这是个快乐的人写的书,看着看着就感受到了这快乐和自信。 感觉内容和书名没啥关系,而且书中结构散乱,作者有点儿不知所云,逻辑不通。 感觉此书更想作者本人的工作履历回忆书,没有太多关于广告与创意方面系统化的思考和方法。 还可以,作者挺厉害的,经历丰富,热爱生活,但是海航的那段描述听起来怪怪的,和之前的印象相去甚远。 认真的一本让人上瘾的一本书,每次读了一段之后就停下来,断断续续读了很久,thrill of knowing酣畅 淋漓!。 其实讲的还是做广告的初心,这应该是每个人都该保有的,可是如果你真的抱着书中的想法去执行,你会非 常非常累,广告这行能坚持下去的,真的百不足一。 如果你想看到一本工具书,你会大失所望如果你想了解30年前广告人的思维,那值得一看。 太喜欢里面所有创意,真是广告营销大师,很多年没有见过了。

颠覆者读书笔记五篇

颠覆者读书笔记五篇

Don't complain when you encounter difficulties. Since you can't change the past, try to change the future.精品模板助您成功!(页眉可删)颠覆者读书笔记五篇颠覆者读书笔记1还记得上大学的时候,我们为了用上所谓的“免费”杀毒软件,趴在学校BBS上找注册码,一试就过去半天,挨个地复制黏贴。

好不容易试成了一个,可没过几天又被告知“已过期”。

当时的心情,是崩溃的。

那将近200大洋的软件年费,让我们这些囊中羞涩的学生党,情何以堪?而忽然有一天,画风突变:“同学,你用的是什么杀毒?”“360呀。

”不知哪里冒出来了个360安全卫士,居然全免费?!于是一夜间,那黄绿色的小圆球,成为了每台电脑的必备。

而杀毒软件也就此彻底走下了“收费”的神坛。

至少个人用户很难再接受为电脑的“杀毒安全”服务买单了。

那么,在20XX年左右,究竟发生了什么?今天我手上拿到的这本书,作者就是360的创始人周鸿祎。

这本叫做《颠覆者》的书是他的自传,同时也记录了那一段艰辛的“颠覆”历程。

不管你是否对商业模式、创业创新感兴趣,至少,我们能从周鸿祎先生的经历中看到,新时代的英雄,是怎样一种调性。

颠覆者读书笔记2百度百科中对“颠覆”的定义是:对某项事物造成强烈冲击改变,使事物本质发生变化。

“改变本质”,貌似离我们的生活有点远。

但仔细观察不难发现,当今时代的“本质”,在随时随地地发生变化。

从胶片拍照时代,到手机摄像,再到拥有操作系统的智能手机。

短短十几年间,我们的生活已经翻天覆地了不止一次。

而每一次的迭代,都必然源于“颠覆”。

周总在书中序言中说道:颠覆式创新分为两种,商业模式和用户体验。

前者,就像360卫士将“杀毒服务”从收费变为免费;而后者则是让很多人趋之若鹜的iphone系列:原来繁复的手机操作,瞬间只留下了一个按键。

两种形式的颠覆,从本质上来说,都是从低端、通俗入手,逐渐创造出一个全新的,现有头部企业不曾看重的市场。

《富兰克林效应》读书笔记模板

《富兰克林效应》读书笔记模板

精彩摘录
这是《富兰克林效应》的读书笔记模板,可以替换为自己的精彩内容摘录。
作者介绍
这是《富兰克林效应》的读书笔记模板,暂无该书作者的介绍。
谢谢观看
读书笔记
感觉只是作者平时发言的汇总,没有逻辑体系,我是冲书名来的,但其实紧扣书名的部分不算很多吧。 口水书一本.....用几千几万字说一句话。 “富兰克林效应”运用有个前提,价值对等。 曾经帮过你一次忙的人,会比那些你帮助过的人更愿意再帮你一次忙。 确实一般…说的是富兰克林效应说的是学会麻烦别人但是全文都依托在不断的讲道理上并不落地,如何去麻 烦别人?怎么麻烦?什么样的麻烦比较合适?怎么建立?麻烦以后怎么感谢?大多数的一笔带过…也难为作者写 下了一整本…还是挺佩服的。 年初六约朋友聚餐,路过书店买了此书,大年十三,读完。 "★“富兰克林效应”究竟是怎么一回事?富兰克林担任宾夕法尼亚州一会秘书时,希望获得一位议员的支持, 却始终没能奏效。 读《富兰克林效应》有感有名气的书,不一定就是一本好书,但能让你有所收获的书,就是一本好书,这本 书给我最大的收获就是让我认识到“一味的付出,并不一定能得到收获。别为了一时的安逸而委屈自己。
1.有效打造个人品牌 2.有哪些行之有效的学习方法? 3.提升认知结构,搭建知识体系 4.如何取得他人的信任? 5.成为一名优秀的普通人 6.文案变现:新媒体时代下的必备技能 7.有哪些相见恨晚的生活道理?
1.付出越多,离爱越远 2.仪式感拯救无趣生活 3.依赖型人格的自我蜕变 4.怎么保存恋爱中的新鲜感? 5.为什么越来越多的女性不愿意结婚了? 6.打扮成自己喜欢的样子 7.不畏艰难,要成为自己的女神富兰克林效应 Nhomakorabea读书笔记模板
01 思维导图
03 读书笔记 05 精彩摘录

一网打尽读书笔记

一网打尽读书笔记

一网打尽读书笔记《一网打尽》读书笔记2018年夏天,一位在几家大公司工作过的同事推荐这本Amazon的发家史,我记得当时Amazon的市值突破万亿,正好了解Amazon的成长经历,也想看看Jeff Bezos的过人之处,因为我相信任何一位成功创业的创始人一定有非同常人的特质。

花了半年的时间才断断续续读完,而且我读的是纸质书,无法自动汇总摘抄,这是非常遗憾的地方。

这种传记类的书籍应该用Kindle阅读,可以随时划重点,书看完了,系统可以生成摘抄汇总。

虽然我喜欢纸质书的质感以及阅读感受,但Kindle的便捷也很有吸引力。

我喜欢看完一本书,合上后总结依旧能记起来的细节,这些都是打动我的细节,相信也是此时此刻对我有帮助的细节:1. Bezos认为:我们一定要真心为顾客着想,要具有长远的眼光,而且要不断有创新产品的出现。

大多数公司做不到这些。

他们把目光放在竞争对手身上,而不是消费者身上。

他们想从事两三年就能赢利的产业,如果短期内没有回报,他们就会转向其他行业。

他们喜欢做追随者,而不是创新者,因为前者保险系数更高。

亚马逊成功的秘密,就是我们的与众不同;2. 公司文化是对抗性和挑衅性:当双方的想法和观点相互碰撞,有时甚至是激烈的碰撞,真理才会涌现。

3. 公司的经营理念就是Bezos的价值观,经过20年的低利润和激烈的质疑后形成的;4. 6-Page Memo,不写PPT,只写6页的短文,来陈述观点;5. 用经营数据来考察业务的经营状况,用数据说话;6. 特殊的薪酬设计来达到节约成本:a) 按工作年限做股票分配的调整,而不是平均分摊;b) 绩效需要做分级排序,末位淘汰;c) 公司内的节约之风处处可见;7. 公司市值 vs 给客户创造价值:Bezos非常重视用户的反馈,仔细阅读公共邮箱收到的用户邮件,很多是潜在的用户问题。

书中介绍了一个故事,性健康的电子邮件营销影响少量用户的体验,经过公司内部激烈的讨论,最终停止这类产品的电子邮件营销渠道,意味着销售额的损失。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Netfilter ALG读书笔记fist<fist_hust@>初稿:2004-07-11目录目录 (1)前言 (1)什么是ALG? (1)Netfilter中ALG的组成部分 (1)ALG的框架 (2)1.主要文件 (2)2.如何track connection? (2)3. 如何expected and related? (3)4.如何nat mangling? (11)ALG Conntrack Helper的构成 (42)ALG Nat helper的构成 (45)可改进的之处 (47)前言本文以NAT中的应用层网关为线索,以ftp ALG为例子,分析了netfilter中NAT部分的实现。

Netfilter虽然集成了Firewall,NAT和mangel的功能,但本人觉得NAT最为复杂。

当理解了NAT部分的功能,再看Firewall和mangle的功能,会有“会当临绝顶,一览众山小”的感觉。

曾经在网络上搜索过netfilter的资料,其中以iptables的用法和netfilter的框架描述比较多。

因此,本文没有花篇幅介绍这些,希望读者对iptables有些了解,至少可以man iptables.另外了解netfilter有5个hook点,能完成NAT,firewall,mangle等功能。

网络上分析netfilter 源码的文章比较少,希望能够对需要了解netfilter实现的人有帮助。

什么是ALG?ALG---Application Layer Gateway.一种为了解决NAT问题,针对不同应用程序的内核补丁。

不同的应用,具有不同的ALG,常见的ALG有ftp ALG, irc ALG等。

Netfilter中ALG的组成部分在Linux系统中,netfilter是一个集防火墙、NAT和一些其他功能的综合模块。

很显然,NAT ALG也实现在netfilter中。

对一个ALG在Linux netfilter实现中有两部分组成:conntrack helper和nat helper两部分组成。

Conntrack helper顾名思义是connection track helper的意思,根据数据报的源,目的地址和端口等信息,把不同的数据报联系起来,之间的媒介就是ip_conntrack数组。

Nat helper完成的是根据数据报的内容,例如源,目的地址,端口,协议找到对应存储在的ip_conntrack数组的信息,根据ALG的要求对数据报进行修改,解决NAT 有关的问题。

例如在linux/net/ipv4/netfilter下:ftp的ALG的两部分分别实现在ip_conntrack_ftp.c和ip_nat_ftp.c两个文件中。

在netfilter中ALG是一个可扩充的灵活框架,增加不同应用的NAT文件,就可以增加该应用的ALG.这些文件必须实现conntrack helper 和nat helper两部分。

ALG的框架1.主要文件实现conntrack和nat mangle两部分的核心集中在四个文件中:Linux/net/ipv4/netfilter/ip_conntrack_core.c -----与conntrack有关的一些核心函数ip_conntrack_standalone.c---- ip conntrack 模块的所有函数(netfilter可以作为模块编译)ip_nat_core.c---与nat mangle有关的一些核心函数ip_nat_standalone.c---ip nat模块的所有函数(netfilter可以作为模块编译)2.如何track connection?Ip_conntrack_standalone.c定义并注册了nefilter ops.(参考netfilter的有关资料)、Struct nf_hook_ops ip_conntrack_in_ops; //For PRE_ROUTINGStruct nf_hook_ops ip_conntrack_local_out_ops;//For LOCAL_OUTStruct nf_hook_ops ip_conntrack_out_ops;//For POST_ROUTINGStruct nf_hook_ops ip_conntrack_local_in_ops;//For LOCAL IN.值得指出的是优先级分别为NF_IP_PRI_CONNTRACK, NF_IP_PRI_CONNTRACK, NF_IP_PRI_LAST .NF_IP_PRI_LAST-1,分别为第一个和最后几个。

也就是说当数据报进入IP 层或者离开IP层的时候,就会对数据报进行connection tracking.具体就是调用call back 函数ip_conntrack_in,ip_conntrack_local,ip_refrag,ipconfirm.在ip_conntrack_in中,根据协议不同进行不同的connection分析。

例如,对于icmp调用icmp_error_track.对于TCP/UDP调用resolve_normal_ct.以resolve_normal_ct为例,首先在数组ip_conntrack中是否已经有响应的信息,没有则建立。

如果已经建立,则更新连接信息。

如果第一次出现的连接,状态置为IP_CT_NEW。

如果收到的是回复方向的数据报,置为IP_CT_ESTABLSIHED和IP_CT_IS_REPLY.对于已经收到了回复包,并且当前方向是发起方向,置为ESTABLISHED状态。

如果设置了IPS_EXPECTED_BIT,则置为IP_CT_RELATED.并更新skb->nfct;这里和ALG联系最紧密的状态是IP_CT_RELATED.在resolv_normal_ct之后是调用与协议有关的函数更新connection tracking info.例如对于tcp调用的是ip_conntrack_proto_tcp.c中的tcp_packet更新与tcp协议有关的状态,例如确定当前TCP的状态(例如SYN_RECV,SYN_SENT)。

再次之后就是ALG conntrack helper的关键部分---调用各ALG的conntrack helper的help 函数.例如对于ftp其help函数定义在ip_conntrack_ftp.c中。

其主要内容是在ftp数据部分查找需要进行特殊NAT处理的数据内容,例如把ftp的内部IP地址变成外部地址,以便正确建立ftp 中的data connection.特别指出四点:1)在resolv_normal_ct(icmp_error_track)和后面的tcp_packet之类的函数进行TCP/UDP/ICMP的NAT处理。

2)针对不同应用的connection track实现在对应用层数据的处理(废话?TCP/UDP/ICMP 之后的层次),主要靠conntrack helper实现。

3)如何调用不同的conntrack helper?在ip_conntrack_core.c的init_conntrack()函数中,conntrack->helper=ip_ct_find_helper(&repl_tuple);struct ip_conntrack_helper *ip_ct_find_helper(const struct ip_conntrack_tuple *tuple){LIST_FIND(&helpers,helper_cmp,tuple);return}也就是根据数据报的源,目的地址,协议和应用层协议找到ALG的conntrack helper.与特定应用相关的信息放在ip_conntrack->help中。

不同的ALG conntrack helper就是通过ip_conntrack_helper_register链接在helpers结构中。

4)对于具有多于一条连接的应用,例如IRC,FTP,另外的连接与最初的连接是一个Related的关系。

最初的连接需要建立ip_conntrack_expect结构。

至此,conntrack helper模块就可以把不同的数据报联系在ip_conntrack结构中,而且把一些与ALG相关的应用程序信息放在了这个结果中。

在nat helper中需要这些信息的时候,就可以从 ip_conntrack中取得。

可谓万事具备,只欠东风――――当需要进行NAT处理的时候,处理就行了。

3. 如何expected and related?很多应用之所以需要ALG是因为在应用层的数据里有IP地址和端口信息,当在TCP、UDP或ICMP做了常规的NAT(更改了ip地址或端口)之后,这与在应用层的数据和端口信息不一致。

这些地址和端口信息通常用来建立新的连接。

例如在ftp中,在控制连接(control connection)的数据报中,应用层协议含有了数据连接(data connection)的地址和端口信息。

当客户端(或者服务器)建立数据连接的时候,需要使用这些地址和端口信息。

如果这些地址没有正确更正为一致,势必让连接不正常。

问题在于数据连接和控制连接如何联系起来。

显然是connection tracking。

Connection tracking使用related的关系来描述这种关系:数据连接related to控制连接。

控制连接在发现了在应用层数据含有地址和端口信息的时候,控制连接expected数据连接。

具体以ftp为例说明:1)ip_conntrack_ftp.c注册conntrack helper。

struct ip_conntrack_helper ftp;ftp.tuple.src..tcp.port=htons(FTP_PORT);ftp.tuple.dst.protonum=IPPROTO_TCP;ftp.mask.src.tcp.port=0xFFFF;ftp.mask.dst.protonum=0xFFFF;ftp.help=help;ip_conntrack_helper_register(&ftp);2)work flow__________ _____________________________ _____________-------------|192.168.1.1 NAT 202.100.100.1 | --------| 202.100.100.2||192.168.1.2|假定ftp客户端在NAT后面的192.168.1.2,穿过NAT设备,访问在公共网络上的202.100.100.2的ftp server.a).src/dst/srcpt/dstpt:192.168.1.2/202.100.100.2/3333/21 syn client- server control connection当数据报到达NAT设备的时候,调用ip_conntrack_in().进而进入resolve_normal_ct().在resolve_normal_ct()(ip_conntrack_core.c)中,get_tuple(skb->nh.iph,skb->len,&tuple,proto);/*tuple.src.ip=192.168.1.2tuple.dst.ip=202.100.100.2tuple.dst.protonum=tcptuple.src,u.tcp.port=3333tuple.dst.u.tcp.port=21*/h=ip_conntrack_find_get(&tuple,NULL)if(!h){h=init_conntrack(&tuple,proto,skb);}在init_conntrack()(ip_conntrack_core.c)中,ip_conntrack_core.cip_conntrack_in()- resolve_normal_ct() init_conntrack();invert_tuple(&repl_tuple,tuple,protocol);/*repl_tuple.dst.ip=192.168.1.2repl_tuple.src.ip=202.100.100.2repl_tuple.dst.protonum=tcprepl_tuple.dst,u.tcp.port=3333repl_tuple.src.u.tcp.port=21*/conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple=*tuple;conntrack->tuplehash[IP_CT_DIR_ORIGINAL].ctrack=conntrack;conntrack->tuplehash[IP_CT_DIR_REPLY].tuple=repl_tuple;conntrack->tuplehash[IP_CT_DIR_REPLY].ctrack=conntrack;protocol->new(conntrack,skb->nh.iph,skb->len);/*tcp_new():conntrack->proto.tcp.state=newconntrack;*/init_timer(&conntrack->timeout);conntrack->timerout.data=(unsigned long)conntrack;conntrack->timeout.function= deatch_by_timeoutl;/*当conntrack超时后,自动删除该conntrack 信息.*/expected=LIST_FIND(&ip_conntrack_expect_list,expect_cmp,struct ip_conntrack expect *,tuple);/*此时,很显然这是控制连接,没有expected conntrack.expected=NULL;*/if(!expected)=ip_ct_find_helper(&repl_tuple);conntrack->helper/*上面有了repl_tuple的值,可知,这里conntrack->helper=(ip_conntrack_helper*)&ftp;*/回到remove_normal_ct();*ctinfo=IP_CT_NEW;*set_reply=0;=&h->conntrack->infos[*ctinfo];skb->nfct/*在skb结构中含有一些conntrack info的信息.*/返回到ip_conntrack_in()中,ret=proto->packet(ct,(*pskb)->nh..iph,(*pskb)->len,ctinfo);/*ip_conntrack_tcp.c tcp_packet():更新tcp状态conntrack->proto.tcp.state ;处理tcp conntrack定时器.*/if(ret!=NF_DROP &&ct->helper)ct->helper->help((*pskb)->nh.iph,(*pskb)->len,ct,ctinfo);这里调用的是ip_conntrack_ftp.c中的help(),在该函数中,ctinfo==IP_CT_NEW,故,ret=NF_ACCEPT;至此,本数据包的conntrack 处理完毕.但在nat helper中,一般会根据配置的iptables规则把本数据报改为: src/dst/srcpt/dstpt:202.100.100.1/202.100.100.2/2222/21 client- server control connection.同时在nat helper中,调用ip_nat_setup_info(ip_nat_core.c)时,会调用函数ip_conntrack_alter_reply(conntrack,&reply)(ip_conntrack_core.c)把conntrack->tuplehash[IP_CT_DIR_REPLY].tuple=*newreply;/**newreply dst.ip=202.100.100.1*newreply.src.ip=202.100.100.2*newreply.dst.protonum=tcp*newreply.dst,u.tcp.port=2222*newreply.src.u.tcp.port=21*/conntrack->helper=LIST_FIND(&helpers,helper_cmp,struct ip_conntrack_helper *,newreply);/*conntrack->helper=(struct ip_conntrack_helper*)&ftp;*/b) src/dst/srcpt/dstpt:202.100.100.2/202.100.100.1/21/2222 syn+ack server- client control connection再次进入函数ip_conntrack_in().Proto=ip_ct_find_proto((*pskb)->nh.iph->protocol);/*proto=ip_conntrack_protocol_tcp;*/resolve_normal_ct(*pskb,proto,&set_reply,hooknum,&ctinfo);暂且看看resolve_normal_ct()函数:get_tuple(skb->nh.iph,skb->len.&tuple,proto);/*tuple.src.ip=202.100.100.2tuple.dst.ip=202.100.100.1tuple.dst.protonum=tcptuple.src,u.tcp.port=21tuple.dst.u.tcp.port=2222*/h=ip_conntrack_find_get(&tuple,NULL);/** h!=NULL; h就是上面我们已经填写好的conntrack->tuplehash[IP_CT_DIR_REPLY];*/*ctinfo=IP_CT_ESTABLISHED + IP_CT_IS_REPLY;*set_reply=1;返回到ip_conntrack_in()中,proto->packet(ct,(*pskb)->nh.iph,(*pskb)->len,ctinfo);/*TCP有关的状态信息更新*/ct->helper->help((*pskb)->nh.iph,(*pskb)->len,ct,ctinfo);上面的调用实际上进入ip_conntrack_ftp.c/help中的help()函数.在该函数中,array[0]=(ntohl(ct->tuplehash[dir].tuple.src.ip)>>24)&0xFF;array[1]=(ntohl(ct->tuplehash[dir].tuple.src.ip)>>16)&0xFF;array[2]=(ntohl(ct->tuplehash[dir].tuple.src.ip)>>8)&0xFF;array[3]=(ntohl(ct->tuplehash[dir].tuple.src.ip)>>0)&0xFF;/** array[0-3]—记录了方向dir源ip地址.*/for(…){continue;if(search[i].dir!=dir)found=find_pattern(data,datalen,search[i].pattern,search[i].plen,search[i].skip,search[i].term,&matchoff,&matchlen,array,search[i].getnum);break;if(found)/** 这是ftp conntrack helper的主要部分了.它搜索长度为datalen的data中,看是否含有ip地址信息.如果找到退出循环.*/}if(found==-1)NF_DROP;//丢包returnelse if(found==0)NF_ACCEPT;//接收数据return/** 当应用层数据含有地址或端口信息的时候,就执行下面的语句了.*/struct ip_ct_ftp_master *ct_ftp_info =&ct->help.ct_ftp_info;struct ip_conntrack_expect expect,*exp=&expectlstruct ip_ct_ftp_expect *exp_ftp_info =&exp->help.exp_ftp_info;if(htonl((array[0]<<24)|(array[1]<<16)|array[2]<<8)|array[3])==ct->tuplehash[dir].tuple.src.ip){ exp->seq=ntohl(tcph->seq)+matchoff;exp_ftp_info->len=matchlen;exp_ftp_info->ftptype=search[i].ftptype;exp_ftp_info->port =array[4]<<8|array[5];/**记录了一些expected info的特征.*/}else{}exp->tuple =((struct ip_conntrack_tuple){{ct->tuplehash[!dir].tuple.src.ip},{0}},{htonl((array[0]<<24|(array[1]<<16)|(array[2]<<8)|(array[3]),{.tcp={htons(array[4]<<8)|(array[5]}},IPPROTO_TCP}});exp->mask=((struct ip_conntrack_tuple){0xffffffff,{0}},{{0xffffffff,{.tcp={0xffff}},0xffff}});exp->expectfn =NULL;例如在数据包的ftp数据部分函数”227 Entering Passive Mode (202,100,100,2,5,6)\r\n” server client为例,上面的结果是exp_ftp_info->ftptype=IP_CT_FTP_P ASV;exp_ftp_info->port=256*5+6=1286;exp->tuple.src.ip=192.168.1.2exp->tuple.src.u.all=0;exp->tuple.dst.ip=202.100.100.2;exp->tuple.dst.tcp=1286;exp->protonum=IPPROTO_TCP;ip_conntrack_expect_related(ct,&expect);查看ip_conntrack_core.c中的ip_conntrack_expect_related();in ip_conntrack_expect_related(struct ip_conntrack *related_to,struct ip_conntrack_expect *expect){struct ip_conntrack_expect *new;new=kmalloc();new->expectant=related_to;new->sibling=NULL;/* Add to expected list for this connection */list_add(&new->expected_list,&related_to->sibling_list);/*Add to global list of expectations*/list_prepend(ip_conntrack_expect_list,&new->list);related_to->expecting++;}回到ip_conntrack_in()中设置IPS_SEEN_REPLY值.set_bit(IPS_SEEN_REPLY_BIT,&ct->status);c)假如server向client发送了port命令, client就会向server发起数据连接(data connection).这时候的数据报为src/dst/srcpt/dstpt:192.168.1.2/202.100.100.2/1111/1286 syn client- server data connection 数据报到达NAT设备时,进入ip_conntrack_in函数,在该函数中,proto=ip_ct_find_proto((*pskb)->nh.iph->protocol);/*proto=&ip_conntrack_protocol_tcp;*/resolve_normal_ct(*pskb,proto,&set_reply,hooknum,&ctinfo);再来看看resolve_normal_ct函数的东东.get_tuple(skb->nh.iph,skb->len,&tuple,proto);/*tuple.src.ip=192.168.1.2tuple.dst.ip=202.100.100.2tuple.dst.protonum=tcptuple.src,u.tcp.port=1111tuple.dst.u.tcp.port=1286*/h=ip_conntrack_find_get(&tuple,NULL);/*h=NULL*/init_conntrack(&tuple,proto,skb);现在看看init_conntrack()函数:ip_conntrack_core.cip_conntrack_in()- resolve_normal_ct() init_conntrack();invert_tuple(&repl_tuple,tuple,protocol);/*repl_tuple.dst.ip=192.168.1.2repl_tuple.src.ip=202.100.100.2repl_tuple.dst.protonum=tcprepl_tuple.dst,u.tcp.port=1286repl_tuple.src.u.tcp.port=1111*/conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple=*tuple; conntrack->tuplehash[IP_CT_DIR_ORIGINAL].ctrack=conntrack; conntrack->tuplehash[IP_CT_DIR_REPLY].tuple=repl_tuple; conntrack->tuplehash[IP_CT_DIR_REPLY].ctrack=conntrack;protocol->new(conntrack,skb->nh.iph,skb->len);/*tcp_new():conntrack->proto.tcp.state=newconntrack;*/init_timer(&conntrack->timeout);conntrack->timerout.data=(unsigned long)conntrack; conntrack->timeout.function= deatch_by_timeout;expected=LIST_FIND(&ip_conntrack_expected_list,expect_cmp, struct ip_conntrack_expect * ,tuple);/*前面的我们加入链表的expect结构如下exp_ftp_info->port=256*5+6=1286;exp->tuple.src.ip=192.168.1.2exp->tuple.src.u.all=0;exp->tuple.dst.ip=202.100.100.2;exp->tuple.dst.tcp=1286;exp->protonum=IPPROTO_TCP;正好与tuple相匹配,所以(expected=exp)!=NULL;*/if(expected){__set_bit(IPS_EXPECTED_BIT,&conntrack->status);conntrack->master=expected;expected->sibling=conntrack;LIST_DELETE(&ip_conntrack_expect_list,expected);expected->expectant->expecting--;}至此,我们已经如下的关系图.expected->expectant=ct_ftp_ctrl_info;ct_ftp_ctrl_info->sibling_list -------- expected->expected_list;ct_ftp_data_info->master=expected;expected->sibling=ct_ftp_data_info;其中:ct_ftp_ctrl_info:IP_CT_DIR_ORIGINAL:src/dst/srcprt/dstprt: 192.168.1.2/202.100.100.2/3333/21 IP_CT_DIR_REPLY: src/dst/srcprt/dstprt: 202.100.100.2/202.100.100.1/21/2222ct_ftp_ctrl_info->helper=(struct ip_conntrack_helper*)&ftp;Ct_ftp_data_info:IP_CT_DIR_ORIGINAL:src/dst/srcprt/dstprt: 192.168.1.2/202.100.100.2/1111/1286 IP_CT_DIR_REPLY: src/dst/srcprt/dstprt: 202.100.100.2/192.168.1.2/1286/1111ct_ftp_data_info->helper=NULL;Expected:exp_ftp_info->port=256*5+6=1286;exp->tuple.src.ip=192.168.1.2exp->tuple.src.u.all=0;exp->tuple.dst.ip=200.100.100.2;exp->tuple.dst.tcp=1286;exp->protonum=IPPROTO_TCP;返回到resolve_normal_ct()ip_conntrack_core.c在ip_conntack_in- resolve_normal_ct()中if(test_bit(IPS_EXPECTED_BIT,&h->ctrack->status)){*ct_info=IP_CT_RELATED;//相关啦,哈哈.*set_reply=0;}返回到ip_conntrack_in()中,ip_conntrack_core.c在ip_conntrack_in()中.接下来做一些与TCP协议有关的操作而已.接下来,执行nat helper,在函数ip_nat_fn()(ip_nat_standalone.c)if(ct->master &&master_ct(ct)->.helper &&master_ct(ct)->.helper->expect){=call_expect(master_ct(ct),pskb,hooknum,ct,info);nat}/*这里会调用ip_nat_helper nat_ftp的函数ftp_nat_expected()(ip_nat_ftp.c);同时设置新的conntrack内容使得数据报变成了:src/dst/srcpt/dstpt:202.100.100.1/202.100.100.2/4444/1286 syn client- server data connection另外还要设置调用ip_nat_setup_info之后的ct_ftp_data_info是Ct_ftp_data_info:IP_CT_DIR_ORIGINAL:src/dst/srcprt/dstprt: 192.168.1.2/202.100.100.2/1111/1286IP_CT_DIR_REPLY: src/dst/srcprt/dstprt: 202.100.100.2/202.100.100.1/1286/4444ct_ftp_data_info->helper=NULL;*/小结:1)常规NAT规则通过iptables命令设定.可以设定的协议,有tcp/udp/icmp,当然也可能有其他一些iptables extenstions.ALG的规则会受这些规则的影响,因为每次调用ip_nat_setup_info的时候需要改变ip_conntrack的一些信息.例如上面的需要更改IP_CT_DIR_REPLY方向的地址和端口信息,让conntrack可以识别回复方向的数据报.2)ALG主要通过expected和related关系处理同一应用的不同连接,例如上面ftp的数据连接和控制连接正是通过这种关系联系起来,以便后面的nat helper进行处理.3)Nat helpr实际上需要conntrack设置ctinfo为IP_CT_RELATED来调用nat helper的expect函数.4)如果客户端使用port命令,也就是使用私有IP地址的一方使用port命令,结果是有问题的,可以作些试验证明该想法,这也就是本修订版的改进之处。

相关文档
最新文档