1.“也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因”这段话说明不能在nat规则中作过滤,因为linux的链接跟踪机制,只有每个流的第一个包才会经过nat表,并将匹配的规则设置到连接跟踪的数据结构中,接下来的包都是直接取连接跟踪相关数据结构的结果,而不再经过nat表,如果在nat中做了过滤,那么只有第一个包会匹配规则,而后面的则无法匹配,也许你会问,第一个包过不去后面的能过吗?事实上,仅举最简单的两个例子,第一,udp包,第二,tcp包的第一个包过去后再设置nat的过滤规则。
2.dnat为何要在output链中有个钩子。dnat路由器将世界所有的主机分为三类,第一类是自己一个网卡口一侧的主机,第二类是自己所有其它网卡口一侧的主机,第三类是它自己。所有非自己的请求都会经过pre-routing链,然后被forward,而dnat则是在pre-routing上做的,但是对于自己发出的请求,则无法经过pre-routing链,而是经过output链,因此需要在output链上做dnat。
3.reject target这是一个咋看上去很不错的target,因为它避免了请求在发出后在该连接被中间路由器drop的时候源端在超时时间内的忙等,但是其只有有限的几种通告类型,简单说就是tcp-reset和icmp。看看会有什么问题,tcp-reset无法用于udp,而icmp可能会在通告给源主机的路上被丢弃。
4.queue target是一个很有趣的target,它可以在用户空间决定如何处置这个数据包。
5.MASQUERADE target在内核中会按照一定的策略选择源ip地址,这确实是“一定的策略”,并且内核的实现很不同,因此需要注意。
6.windows的死网关检测机制是一种坡脚的机制,第一,该机制的算法非常傻,第二,如果用户自己不设置,系统为何要帮用户设置呢?很多时候,你会发现,在windows上配置了一条静态路由,然而当该静态路由的下一跳不可达的时候,用route print查看,发现该路由被莫名奇妙的改变了,下一跳被改变了...
7.unix上直接提供了pf_packet,它不但能抓包,还能让你彻底绕开tcp/ip协议栈,包括路由,netfilter等,直接将数据发送到网卡,任何数据都行,设置你可以自己定义协议。
8.为何桥接过滤要走ip层的钩子呢?这是因为linux主机往往同时配置成网桥和路由器,linux网桥可以基于三层信息进行二层过滤。
9.linux 2.6.10以前的内核的nat模块有个问题,首先在ip_nat_fn这个终极钩子函数中会失效校验码,这是没有必要的,因为很多包根本就不进行nat,只是走一下过场罢了,因此最好的办法是仅仅对真正需要nat的家伙们进行失效校验和的操作。不管怎样,虽然这是一个缺陷,然而更大的弊端在于其做的不干净,在失效校验码的函数中如果当前skb的使用者不止一个,那么会复制一个skb副本出来,然后传输该副本,但是在复制的时候并没有复制tso的信息,这样在经过了netfilter接下来的是否分段的判断中就会误判,skb_shinfo(skb)->tso_size为0:
if ((skb->len > dst_pmtu(skb->dst) || skb_shinfo(skb)->frag_list) && !skb_shinfo(skb)->tso_size)
return ip_fragment(skb, ip_finish_output);
因此即使网卡有tso的能力也会分段,特别是在应用设置了mtu发现并且skb的长度超过mtu的时候还会发送icmp出错报告,这就大大延迟了应用的响应时间。还好,2.6.10之后这个问题被修正了,在2.6.1x(x>8)之后,不需要nat的家伙们不再失效校验码...。唉...独立发现了问题,却迟了一步解决问题,自己的能力还满意,不过速度不够快!
分享到:
相关推荐
Linux网络体系结构 Linux内核中网络协议的设计与实现,Linux网络体系结构 Linux内核中网络协议的设计与实现
详细描述了linux2.4/2.6内核版本中的网络子系统。解释了协议的工作方式、建立了Linux网络体系结构中的多种重要概念——从设备驱动程序概念一直到应用程序接口的概念。能帮助读者更容易理解 Linux网络架构的进程和...
编写本书是为了向学生和专业人员提供在Linux内核中实现网络功能时所需的基础知识,本书也适合所有希望深入理解操作系统内部网络特定进程的人。本书介绍了Linux内核的关键网络组件及机制,同时也介绍了通信系统的设计...
本书主要对 Linux 1.2.13 内核协议栈的全部源代码做了详细的分析, 该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握 Linux 网络协议结构。...
《Linux内核网络栈源代码情景分析》主要对Linux1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux...
此Linux内核学习资料包中有Linux内核--网络栈实现分析(二)--数据包的传递过程(上).pdf Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上).pdf Linux内核--网络栈实现分析(四)--网络层之IP协议(上)....
本文将讲述内核模块的编写者如何利用Netfilter的钩子来达到任何目的,以及怎样将网络传输从一个Libpcap的应用中隐藏掉。尽管Linux2.4支持对IPV4,IPV6以及DECnet的钩子,本文只提及IPV4的钩子。但是,对IPV4的大多数...
linux-1.2.13内核网络栈实现源代码分析.pdf 带书签
详细分析Linux网络实现的核心数据结构,附带一个虚拟多网卡的程序
Linux 4.4.0内核源码分析TCP实现
对linux内核源码进行详细的分析
LINUX-1.2.13内核网络栈实现源代码分析.pdf Linux内核源码剖析—TCP&IP实现(下).pdf Linux 内核源码剖析- TCP.IP 实现, 樊东东, 莫澜, 上册, 2011.pdf 3本合集
LINUX-1.2.13内核网络栈实现源代码分析.pdf
本书主要对Linux 1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以...本书适合Linux网络开发人员及Linux内核爱好者阅读。
LINUX-1.2.13内核网络栈实现源代码分析,详细的移植说明手册,源代码注解,中国科技大学 曹桂平著 超清晰PDF版,共881页,3.08M
基于Linux内核的用户态网络协议栈的实现.pdf
基于Linux内核在网络层实现移动终端的漫游通信.pdf
linux内核分析资料合集,包括:linux内核完全剖析基于0.12内核、linux内核网络栈实现源代码分析、linux内核注释_v2.2.5、linux2.6内核启动分析--李枝果、怎样读linux内核源代码
在目前以IPv4为支撑的网络协议上搭建的网络环境中...本文就分别介绍一下SYN Flood攻击和SYN Cookie的原理,更重要的是介绍Linux内核中实现SYN Cookie的方式。最后,本文给出一种增强目前Linux中SYN Cookie功能的想法。