分类: LINUX
2012-06-15 16:23:15
本节在先前介绍的知识基础上,进一步介绍用iptalbes实现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目标动作扩展
变换数据包的源地址,例:
iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.4用于具有动态IP地址的拨号连接的SNAT,类似于SNAT,但是如果连接断开,所有的连接跟踪信息将被丢弃,而去使用重新连接以后的IP地址进行IP伪装,例:
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0转换数据报的目的地址,这是在PREROUTING钩子链中处理的,也就是在数据报刚刚进入时。因此Linux随后的处理得到的都是新的目的地址,例:
iptables -t nat -A PREROUTING -j DNAT --to-destination 1.2.3.4:8080 -p tcp --dport 80 -i eth1重定向数据报为目的为本地,和DNAT将目的地址修改为接到数据报的接口地址情况完全一样,例:
iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth1 -p tcp --dport 80 二、利用iptables进行数据报处理(Packet mangling)mangle表提供了修改数据报各个字段的值的方法。
针对数据包处理的目标扩展设置nfmark字段的值。我们可以修改nfmark字段的值。nfmark仅仅是一个用户定义的数据报的标记(可以是无符号长整数范围内的任何 值)。该标记值用于基于策略的路由,通知ipqmpd (运行在用户空间的队列分捡器守护进程)将该数据报排队给哪个哪个进程等信息。例:
iptables -t mangle -A PREROUTING -j MARK --set-mark 0x0a -p tcp设置数据报的IP头的TOS字段值。若希望适用基于TOS的数据报调度及路由,这个功能是非常有用处的。例:
iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 -p tcp --dport ssh 三、清空iptables规则有时候在进行设置前,希望清空iptables的当前规则。
iptables -t nat -F iptables -t nat -X iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t mangle -F iptables -t mangle -X iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P INPUT ACCEPT iptables -t mangle -P FORWARD ACCEPT iptables -t mangle -P OUTPUT ACCEPT iptables -t mangle -P POSTROUTING ACCEPT iptables -F iptables -X iptables -P FORWARD ACCEPT iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -t raw -F iptables -t raw -X iptables -t raw -P PREROUTING ACCEPT iptables -t raw -P OUTPUT ACCEPT 语法iptables [-t table] -F [chain] [options...] iptables [-t table] -X [chain] iptables [-t table] -P chain target 选项说明这里以用于配置OpenVPN的NAT转发规则为例进行说明,希望读者能进一步了解规则设置的方法:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j MASQUERADE iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 3306 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT iptables -t nat -A PREROUTING -p udp -m udp --dport 53 -j DNAT --to-destination 8.8.8.8 iptables -A INPUT -p udp --dport 1194 -j ACCEPT iptables -A INPUT -s 10.8.0.0/24 -p all -j ACCEPT iptables -A FORWARD -d 10.8.0.0/24 -j ACCEPT iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT 注释此处仅列出之前没有提到过的特殊语法或选项
可以采用两种方法:
-L选项iptables -L该命令输出所有链中的所有规则
iptables-save命令这条命令会以“表”的形式输出,用于程序读取,所以一般是这样用:
iptables-save > iptables.rulesReference
[1]
[2] openvz vps ubuntu 安装 openvpn 并配置iptables防火墙
[3] man iptalbes
[4]
[5]