📄 linux 2.4中netfilter框架实现.htm
字号:
<P>第二部分 使用iptables及netfilter进行数据包过滤
<P>一、概述
<P>下面的内容要求具有对TCP/IP,路由,防火墙及包过滤的基本概念的了解。
<P>在第一部分已经解释过,filter表和三个钩子进行了挂接,因此提供了三条链进行数据过滤。所有来自于网络,并且发给本机的数据报会遍历INPUT规则链。所有被转发的数据报将仅仅遍历FORWARD规则链。最后,本地发出的数据报将遍历OUTPUT链。
<P>二、向规则链中插入规则
<P>Linux2.4提供了一个简洁强大的工具"iptables"来插入/删除/修改规则链中的规则。这里并不对iptalbes进行详细的介绍,而只是讨论它的主要的一些特性:
<P>该命令实现对所有的ip表进行处理,当前包括filter,nat及mangle三个表格,及以后扩展的表模块。<BR>该命令支持插件来支持新的匹配参数和目标动作。因此对netfilter的任何扩展都非常的简单。仅仅需要编写一个完成实际目标动作处理的模块和iptalbes插件(动态连接库)来添加所需要的一切。<BR>它有两个实现:iptables(IPV4)及ip6tables。两者都基于相同的库和基本上相同的代码。<BR>基本的iptables命令<BR>一个iptables命令基本上包含如下五部分:
<P>希望工作在哪个表上<BR>希望使用该表的哪个链<BR>进行的操作(插入,添加,删除,修改)<BR>对特定规则的目标动作<BR>匹配数据报条件<BR>基本的语法为:
<P>iptables -t table -Operation chain -j target
match(es)<BR>例如希望添加一个规则,允许所有从任何地方到本地smtp端口的连接:
<P>iptables -t filter -A INPUT -j ACCEPT -p tcp --dport smtp
<P>当然,还有其他的对规则进行操作的命令如:清空链表,设置链缺省策略,添加一个用户自定义的链....
<P>基本操作:
<P>-A 在链尾添加一条规则<BR>-I 插入规则<BR>-D 删除规则<BR>-R 替代一条规则<BR>-L 列出规则
<P>基本目标动作,适用于所有的链
<P>ACCEPT 接收该数据报<BR>DROP 丢弃该数据报<BR>QUEUE 排队该数据报到用户空间<BR>RETURN
返回到前面调用的链<BR>foobar 用户自定义链<BR>基本匹配条件,适用于所有的链
<P>-p 指定协议(tcp/icmp/udp/...)<BR>-s 源地址(ip address/masklen)<BR>-d 目的地址(ip
address/masklen)<BR>-i 数据报输入接口<BR>-o 数据报输出接口<BR>出了基本的操作,匹配和目标还具有各种扩展。
<P>三、iptables的数据报过滤匹配条件扩展
<P>有各种各样的数据包选择匹配条件扩展用于数据包过滤。这里仅仅简单的说明来让你感受扩展匹配的强大之处。
<P>这些匹配扩展给了我们强大的数据报匹配手段:
<P>TCP匹配扩展能匹配源端口,目的端口,及tcp标记的任意组合,tcp选项等。<BR>UPD匹配扩展能匹配源端口和目的端口<BR>ICMP匹配扩展能匹配ICMP类型<BR>MAC匹配扩展能匹配接收到的数据的mac地址<BR>MARK匹配扩展能匹配nfmark<BR>OWNE匹配扩展(仅仅应用于本地产生的数据报)来匹配用户ID,组ID,进程ID及会话ID<BR>LIMIT扩展匹配用来匹配特定时间段内的数据报限制。这个扩展匹配对于限制dos攻击数据流非常有用。<BR>STATE匹配扩展用来匹配特定状态下的数据报(由连接跟踪子系统来决定状态),可能的状态包括:<BR>INVALID
(不匹配于任何连接)<BR>ESTABLISHED (属于某个已经建立的链接的数据报)<BR>NEW (建立连接的数据报)<BR>RELATED
(和某个已经建立的连接有一定相关的数据报,例如一个ICMP错误消息或ftp数据连接)<BR>TOS匹配扩展用来匹配IP头的TOS字段的值。
<P>四、iptables的数据报过滤目标动作扩展
<P>LOG 将匹配的数据报传递给syslog()进行记录<BR>ULOG 将匹配的数据适用用户空间的log进程进行记录<BR>REJECT
不仅仅丢弃数据报,同时返回给发送者一个可配置的错误信息<BR>MIRROR 互换源和目的地址以后重新传输该数据报
<P>第三部分 利用iptables和netfilter进行NAT
<P>linux以前的内核仅仅支持有限的NAT功能,被称为伪装。Netfilter则支持任何一种NAT。一般来讲NAT可以分为源NAT和目的NAT。
<P>源NAT在数据报经过NF_IP_POST_ROUTING时修改数据报的源地址。伪装是一个特殊的SNAT。
<P>目的NAT在数据报经过NF_IP_LOCAL_OUT或NF_IP_PRE_ROUTING 时修改数据报目的地址。端口转发和透明代理都是DNAT。
<P>一、iptables的NAT目标动作扩展
<P>SNAT<BR>变换数据包的源地址。
<P>例:
<P>iptables -t nat -A POSTROUTING -j SNAT --to-source
1.2.3.4<BR><BR><BR>MASQUERADE<BR>用于具有动态IP地址的拨号连接的SNAT,类似于SNAT,但是如果连接断开,所有的连接跟踪信息将被丢弃,而去使用重新连接以后的IP地址进行IP伪装。
<P>例:
<P>iptables -t nat -A POSTROUTING -j MASQUERADE -o
ppp0<BR>DNAT<BR>转换数据报的目的地址,这是在PREROUTING钩子链中处理的,也就是在数据报刚刚进入时。因此Linux随后的处理得到的都是新的目的地址。
<P>例:
<P>iptables -t nat -A PREROUTING -j DNAT --to-destination 1.2.3.4:8080 -p tcp
--dport 80 -i eth1
<P><BR>REDIRECT<BR>重定向数据报为目的为本地,和DNAT将目的地址修改为接到数据报的接口地址情况完全一样。
<P>例:
<P>iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth1 -p tcp
--dport 80<BR> <BR>第四部分 利用iptables和netfilter进行数据报处理(Packet mangling)
<P>mangle表提供了修改数据报各个字段的值的方法。
<P>一、针对数据包处理的目标扩展
<P>MARK<BR>设置nfmark字段的值。我们可以修改nfmark字段的值。nfmark仅仅是一个用户定义的数据报的标记(可以是无符号长整数范围内的任何值)。该标记值用于基于策略的路由,通知ipqmpd
(运行在用户空间的队列分捡器守护进程)将该数据报排队给哪个哪个进程等信息。
<P>例: iptables -t mangle -A PREROUTING -j MARK --set-mark 0x0a -p tcp
<P>TOS<BR>设置数据报的IP头的TOS字段值。若希望适用基于TOS的数据报调度及路由,这个功能是非常有用处的。
<P>例: iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 -p tcp --dport ssh
<P>第五部分 排队数据报到用户空间
<P>前面已经提到,任何时候在任何nefilter规则链中,数据报都可以被排队转发到用户空间去。实际的排队是由内核模块来完成的(ip_queue.o)。
<P>数据报(包括数据报的原[meta]数据如nfmark和mac地址)通过netlink
socket被发送给用户空间进程.该进程能对数据报进行任何处理。处理结束以后,用户进程可以将该数据报重新注入内核或者设置一个对数据报的目标动作(如丢弃等)。
<P>这是netfilter的一个关键技术,使用户进程可以进行复杂的数据报操作。从而减轻了内核空间的复杂度。用户空间的数据报操作进程能很容易的适用ntfilter提供的称为libipq的库来进行开发。
<P>参考文献:
<P>LaForge's talk about
Netfilter<BR>http://www.lisoleg.org/forum-source/messages/1410.html
<P>The netfilter framework in Linux
2.4<BR>http://www.gnumonks.org/papers/netfilter-lk2000/presentation.html
<P>Linux 2.4 Packet Filtering
HOWTO<BR>http://netfilter.kernelnotes.org/unreliable-guides/packet-filtering-HOWTO/index.html
<P>Linux 2.4 NAT
HOWTO<BR>http://netfilter.kernelnotes.org/unreliable-guides/NAT-HOWTO/index.html
<P>netfilter hacking
HOWTO<BR>http://netfilter.kernelnotes.org/unreliable-guides/netfilter-hacking-HOWTO/index.html</P>
<P align=center> </P>
<P align=center><A name=author1><SPAN class=atitle2>本文转自网络</SPAN></A>
如果您觉得违反了你的权益请<A
href="mailto:harryxin7277@sina.com">通知</A>我,我会在作相应的修改</P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -