利用iptables和netfilter进行NAT和数据报处理
利用iptables和netfilter进行NAT
linux以前的内核仅仅支持有限的NAT功能,被称为伪装。Netfilter则支持任何一种NAT。一般来讲NAT可以分为源NAT和目的NAT。
源NAT在数据报经过NF_IP_POST_ROUTING时修改数据报的源地址。伪装是一个特殊的SNAT。
目的NAT在数据报经过NF_IP_LOCAL_OUT或NF_IP_PRE_ROUTING 时修改数据报目的地址。端口转发和透明代理都是DNAT。
iptables的NAT目标动作扩展
SNAT
变换数据包的源地址。
例:
iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.4
MASQUERADE
用于具有动态IP地址的拨号连接的SNAT,类似于SNAT,但是如果连接断开,所有的连接跟踪信息将被丢弃,而去使用重新连接以后的IP地址进行IP伪装。
例:
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
DNAT
转换数据报的目的地址,这是在PREROUTING钩子链中处理的,也就是在数据报刚刚进入时。因此Linux随后的处理得到的都是新的目的地址。
例:
iptables -t nat -A PREROUTING -j DNAT --to-destination 1.2.3.4:8080 -p tcp --dport 80 -i eth1
REDIRECT
重定向数据报为目的为本地,和DNAT将目的地址修改为接到数据报的接口地址情况完全一样。
例:
iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth1 -p tcp --dport 80
利用iptables和netfilter进行数据报处理(Packet mangling)
mangle表提供了修改数据报各个字段的值的方法。
针对数据包处理的目标扩展
MARK
设置nfmark字段的值。我们可以修改nfmark字段的值。nfmark仅仅是一个用户定义的数据报的标记(可以是无符号长整数范围内的任何值)。该标记值用于基于策略的路由,通知ipqmpd (运行在用户空间的队列分捡器守护进程)将该数据报排队给哪个哪个进程等信息。
例: iptables -t mangle -A PREROUTING -j MARK --set-mark 0x0a -p tcp
TOS
设置数据报的IP头的TOS字段值。若希望适用基于TOS的数据报调度及路由,这个功能是非常有用处的。
例: iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 -p tcp --dport ssh
排队数据报到用户空间
前面已经提到,任何时候在任何nefilter规则链中,数据报都可以被排队转发到用户空间去。实际的排队是由内核模块来完成的(ip_queue.o)。
数据报(包括数据报的原[meta]数据如nfmark和mac地址)通过netlink socket被发送给用户空间进程.该进程能对数据报进行任何处理。处理结束以后,用户进程可以将该数据报重新注入内核或者设置一个对数据报的目标动作(如丢弃等)。
这是netfilter的一个关键技术,使用户进程可以进行复杂的数据报操作。从而减轻了内核空间的复杂度。用户空间的数据报操作进程能很容易的适用ntfilter提供的称为libipq的库来进行开发。
参考文献:
LaForge''s talk about Netfilter
http://www.lisoleg.org/forum-source/messages/1410.html
The netfilter framework in Linux 2.4
http://www.gnumonks.org/papers/netfilter-lk2000/presentation.html
Linux 2.4 Packet Filtering HOWTO
http://netfilter.kernelnotes.org/unreliable-guides/packet-filtering-HOWTO/index.html
Linux 2.4 NAT HOWTO
http://netfilter.kernelnotes.org/unreliable-guides/NAT-HOWTO/index.html
netfilter hacking HOWTO
http://netfilter.kernelnotes.org/unreliable-guides/netfilter-hacking-HOWTO/index.html
<全文完>