1.iptables有三个表,分别是filter表,nat表和mangle表。其中默认的表为filter表,使用时无需-t参数指定,其它2个表则需要使用-t参数明示。
2.filter表。
(1)filter表支持三个内建的规则链,以及自定义的规则链。
三个内建的规则链分别是INPUT,OUTPUT,FORWARD。
INPUT规则链指定对数据包进行处理时进行的修改。
FORWARD规则链指定对数据包进行转发时进行的修改。
Output规则链指定对本地产生的数据包进行的修改。
处置结果有两种:ACCEPT、DROP。另外支持一种目标扩展REJECT。
DROP和REJECT的区别在于DROP不会向数据包的发送方返回任何icmp错误信息,而REJECT则会返回一条icmp错误信息。
(2)数据包的匹配条件主要包括:
(a)地址信息:源和目的IP地址和端口。 ( -s xxx.xxx.xxx.xxx --sport 80 -d yyy.yyy.yy.yyy --dport 4001 )
(b)接口信息:接口设备以及MAC地址。( -i eth0 -o eth0 )
(c)协议信息:tcp,udp和icmp。 ( -p tcp )
(d)数据包发送者的相关信息:gid,uid,以及pid,pgid。
(e)mark字段。
(f)QOS字段。
(g)链接状态( -m state --state established,related ),包括tcp、udp和icmp。
3.NAT表。
(1)nat表用于实现NAT地址转换。主要应用场景包括两种:
(a)为内网主机提供访问外网服务的能力。主要是使用SNAT和MASQUERADE这两种源地址转换。
(b)为内网主机提供对外网提供服务的能力。主要是使用DNAT和REDIRECT这两种目的地址转换。
(2)源地址转换。
源地址转换包括两种:SNAT和MASQUERADE。
(a)SNAT。
SNAT的源地址转换功能体现在以下两个方面。 其一:在防火墙(路由器)的内网接口收到来自内网的数据包后通常会将该数据包经由外网接口发送到外网的其它主机,此时该数据包的源IP地址和源端口均是内网主机的IP地址和端口,如果不经过修改就直接发送到外网主机,该外网主机的回复数据将无法路由到正确的源主机。因此在数据包由外网接口发送到外网的其他主机之前,应该将数据包的源IP地址和端口转换为防火墙(路由器)的外网接口所在的网络的一个主机的IP地址和端口,这个IP地址和端口应该是目标主机可以路由到的一个地址。 其二:如果来自外网主机的回复数据包到达防火墙(路由器),则还需要做一个工作,将该数据包经由内网接口发送到内网主机。本步骤在设定了SNAT之后自动完成。功能有点类似DNAT。本步骤只会自动处理在已经建立了SNAT映射的前提下收到了来自特定外网IP和端口的回复数据,可以认为之前内网主机必定已经主动向外网主机发送了数据包。
(b)MASQUADE。
MASQUADE与SNAT相同之处在于两者本质上都是源地址转换。不同在于SNAT只要求将源地址转换为外网接口所在的网络的一个IP和端口即可,而MASQUADE则只能替换端口号为路由器(防火墙)的外网接口上的端口号,不能指定为其它主机。SNAT可以同时指定IP地址和端口号,配置更为灵活,也更安全。
(3)目的地址转换。
目的地址转换包括两种:DNAT和REDIRECT。
(a)DNAT
DNAT功能体现在以下两个方面。其一:外网主机希望访问在防火墙(路由器)的内网主机上的服务,在没有实施DNAT的情况下,是无法访问的。所谓实施DNAT,,是将防火墙(路由器)的外网接口上 的某个端口映射为某个内网主机的某个服务端口。在收到来自外网主机的请求数据包时,将该数据包通过内网接口发送到内网主机。同样在发送之前需要修改该数据包的目的地址。因为此时目的地址是外网接口的IP地址和端口。修改该数据包的目的地址为内网主机的服务端口和IP地址。来自外网的数据包将可以正常达到内网主机的网卡。其二:同样需要自动对内网主机的回复数据包进行处理,以便回复数据包能够正常路由到发出请求的外网主机。
(b)REDIRECT。
REDIRECT和DNAT相同之处在于两者都是目的地址转换。不同在于REDIRECT只能指定目标地址的端口,不能指定目标地址的IP地址,而DNAT则更为通用。因此REDIRECT只适用于路由器(防火墙)自身提供某种对外服务的情况,而DNAT则还可以用于让内网主机获得对外网提供服务的能力。
(4)NAT和规则链。
SNAT和MASQUERADE用于POSTRouting规则链。POSTRouting规则链指定对离开路由器(防火墙)的数据包进行的修改。
DNAT用于PreRouting规则链。PreRouting规则链指定对达到路由器(防火墙)的数据包进行的修改。
REDIRECT用于PreRouting和OUTPUT规则链。Output规则链指定对本地产生的数据包进行的修改。
处理次序:
(a)PreRouting规则链=>INPUT=>OUTPUT=>POSTRouting
(b)PreRouting规则链=>FORWARD=>POSTRouting。
(5)NAT与P2P。
路由器(防火墙)上使用的NAT技术,正是各种P2P软件得以正常运行的技术基础。P2P需要解决的问题在于SNAT和MASQUERADE使用的端口是路由器(防火墙)动态管理的,P2P软件只能使用一些巧妙的办法让两个不同网络的内网主机建立直接的连接,这一技术的前提是必须在公网(Internet)上放置一台服务器,仅仅用于建立连接阶段。
4.mangle表。
(1)mangle表主要用于mark和QOS。
-t mangle
-j MARK --set-mark 0x00010070 (猜测:此处的32位整数代表的mark应该和在cgroup中设置的net_cls.classid是相同的概念)
关于cgroup中网络资源的限定的相关内容请参考本人博客:
Docker02:Docker核心技术探索(9)使用cgroup限制资源的使用
推荐阅读:
书籍:<<Linux防火墙>>第4版 人民邮电出版社。该书介绍了linux下几个典型的防火墙,其中对于iptables的介绍非常详细,尤其是对nat的介绍尤为详细。希望进一步了解iptables以及nat的朋友会发现,阅读该书是一件非常值得的事情。