iptables详解
Netfilter包含有三种表,三种表下共包含有五种链,链下面包含各种规则。即表包含若干链,链包含若干规则。
(一)三种表为:filter nat mangle
1、filter:处理与本机有关的数据包,是默认表,包含有三种链:input output forward
2、nat表:与本机无关。主要处理源与目的地址IP和端口的转换。有三种链:prerouting postrouting output
3、mangle表:用于高级路由信息包,如包头内有更改(如tos改变包的服务类型,ttl包的生存时间,mark特殊标记)。有两种链:prerouting output (kernel 2.4.18后又加了两种链:input forward)这种表很少使用。
(二)五种链
1、prerouting:进入netfilter后的数据包在进入路由判断前执行的规则。改变包。
2、Input:当经过路由判断后,要进入本机的数据包执行的规则。
3、output:由本机产生,需向外发的数据包执行的规则。
4、forward:经过路由判断后,目的地不是本机的数据包执行的规则。与nat 和 mangle表相关联很高,与本机没有关联。
5、postrouting:经过路由判断后,发送到网卡接口前。即数据包准备离开netfilter时执行的规则。

上图中,运行中的守护进程,是指本机。Input的包都会发到本机。本机处理后再经output 发出去。
(三)数据包进入netfilter后的经过图:
1、数据包进入linux服务器入接口,接口把数据包发往netfilter,数据包就此进入netfilter。
2、经prerouting处理,(如是否需要更改数据包的源IP地址等)
3、数据包到路由,路由通过路由表判断数据包的目的地。如果目的地是本机,就把数据包转给intput处理后进入本机。如果目的地不是本机,则把数据包转给forward处理。
4、数据包通过forward处理后,再转给postrouting处理,(是否有目标地址需要改变等),处理后数据包就出了netfilter,到linux服务器出接口,就出了linux服务器。
5、如果数据包进了本机后经过处理需要外发数据包,或本机自身有数据包需要外发,就把数据包发给output链进行处理后,转给postrouting处理后,出linux服务器。进入外面的花花世界。
(四)规则的执行顺序
当数据包进入netfilter,就会和里面的规则进行对比。规则是有顺序的。
先和规则1对比,如果和规则1相匹配,被规则1接受(accept),则数据将不再和后面的规则进行对比。如果不匹配,则按顺序和后面的规则进行对比,直到被接受。如果所有的规则都不匹配,则进行默认策略操作,以决定数据包的去向。所以规则的顺序很重要。
IPTABLE主要是理解上面的内容,一些详细参数可以见附件中的指南。
二、iptalbe语法及参数
iptable [-t table] command [chain] [match][-j target]
注释:iptable [-t 表名] -命令 [链接] [匹配] [-j 动作/目标]
(一) table (表)
1、filter表:默认用filter表执行所有的命令。只操作与本机有关的数据包。
2、nat表:主要用于NAT地址转换。只有数据流的第一个数据包被这个链匹配,后面的包会自动做相同的处理。
分为:DNAT(目标地址转换)、SNAT(源地址转换)、MASQUERADE
(1)DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问 重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。
(2)SNAT 改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。内网到外网的映射。
(3)MASQUERADE 的作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。
3、mangle表:用来改变数据包的高级特性,一般不用。
(二) command(命令)详解
1、 -A或者--append //将一条或多条规则加到链尾
2、 -D或者--delete //从链中删除该规则
3、 -R或者--replace //从所选链中替换一条规则
4、 -L或者--list //显示链的所有规则
5、 -I或者--inset //根据给出的规则序号,在链中插入规则。按序号的顺序插入,如是 “1”就插入链首
6、 -X或者--delete-chain //用来删除用户自定义链中规则。必须保证链中的规则都不在使用时才能删除链。如没有指定链,将删除所有自定义链中的规则。
7、 -F或者--flush //清空所选链中的所有规则。如指定链名,则删除对应链的所有规则。如没有指定链名,则删除所有链的所有规则。
8、 -N或者--new-chain //用命令中所指定的名字创建一个新链。
9、 -P或者--policy //设置链的默认目标,即策略。 与链中任何规则都不匹配的信息包将强制使用此命令中指定的策略。
10、-Z或者--zero //将指定链中的所有规则的包字节计数器清零。
(三) match 匹配
分为四大类:通用匹配、隐含匹配、显示匹配、针对非正常包的匹配
1、通用匹配
无论我们使用何种协议,装入何种扩展,通用匹配都可以使用。不需要前提条件
(1) -p(小写)或--protocol
用来检查某些特定协议。协议有TCPUDPICMP三种。可用逗号分开这三种协议的任何组合。也可用“!”号进行取反,表示除该协议外的剩下的协议。也可用all表示全部协议。默认是all,但只代表tcpudpicmp三种协议。
$ iptable -A INPUT -p TCP,UDP
$ iptable -A INPUT -p ! ICMP //这两种表示的意思为一样的。
(2) -s 或 --source
以Ip源地址匹配包。根据源地址范围确定是否允许或拒绝数据包通过过滤器。可使用 “!”符号。 默认是匹配所有ip地址。
可是单个Ip地址,也可以指定一个网段。 如: 192.168.1.1/255.255.255.255 表示一个地址。 192.168.1.0/255.255.255.0 表示一个网段。
(3) -d 或 --destination
用目的Ip地址来与它们匹配。与 source 的格式用法一样
(4) -i
以包进入本地所使用的网络接口来匹配包。只能用INPUT FORWARD PREROUTING 三个链中。用在其他任何链中都会出错。
可使用“+” “!”两种符号。
只用一个“+"号,表示匹配所有的包,不考虑使用哪个接口。如: iptable -A INPUT -i + //表匹配所有的包。
放在某类接口后面,表示所有此类接口相匹配。如: iptable -A INPUT -i eth+ //表示匹配所有ethernet 接口。
(5) -o
以数据包出本地所使用的网络接口来匹配包。与-i一样的使用方法。
只能用OUTPUT FORWARD POSTROUTING 三个链中。用在其他任何链中都会出错。
可使用“+” “!”两种符号。
(6) -f (或 --fragment )
用来匹配一个被分片的包的第二片或以后的部分。因一个数据包被分成多片以后,只有第一片带有源或目标地址。后面的都不带 ,所以只能用这个来匹配。可防止碎片攻击。
2、隐含匹配
这种匹配是隐含的,自动的载入内核的。如我们使用 --protocol tcp 就可以自动匹配TCP包相关的特点。
分三种不同协议的隐含匹配:tcp udp icmp
2.1 tcp match
tcp match 只能隐含匹配TCP包或流的细节。但必须有 -p tcp 作为前提条件。
(2.1.1) TCP --sport
基于tcp包的源端口匹配包 ,不指定此项则表示所有端口。
iptable -A INPUT -p TCP --sport 22:80 //TCP源端口号22到80之间的所有端口。
iptable -A INPUT -p TCP --sport 22: //TCP源端口号22到65535之间的所有端口。
(2.1.2) TCP --dport
基于tcp包的目的端口来匹配包。 与--sport端口用法一样。
(2.1.3) TCP --flags
匹配指定的TCP标记。
iptable -p TCP --tcp-flags SYN,FIN,ACK SYN
2.2 UDP match
(2.1.1) UDP --sport
基于UDP包的源端口匹配包 ,不指定此项则表示所有端口。
(一)三种表为:filter nat mangle
1、filter:处理与本机有关的数据包,是默认表,包含有三种链:input output forward
2、nat表:与本机无关。主要处理源与目的地址IP和端口的转换。有三种链:prerouting postrouting output
3、mangle表:用于高级路由信息包,如包头内有更改(如tos改变包的服务类型,ttl包的生存时间,mark特殊标记)。有两种链:prerouting output (kernel 2.4.18后又加了两种链:input forward)这种表很少使用。
(二)五种链
1、prerouting:进入netfilter后的数据包在进入路由判断前执行的规则。改变包。
2、Input:当经过路由判断后,要进入本机的数据包执行的规则。
3、output:由本机产生,需向外发的数据包执行的规则。
4、forward:经过路由判断后,目的地不是本机的数据包执行的规则。与nat 和 mangle表相关联很高,与本机没有关联。
5、postrouting:经过路由判断后,发送到网卡接口前。即数据包准备离开netfilter时执行的规则。

上图中,运行中的守护进程,是指本机。Input的包都会发到本机。本机处理后再经output 发出去。
(三)数据包进入netfilter后的经过图:
1、数据包进入linux服务器入接口,接口把数据包发往netfilter,数据包就此进入netfilter。
2、经prerouting处理,(如是否需要更改数据包的源IP地址等)
3、数据包到路由,路由通过路由表判断数据包的目的地。如果目的地是本机,就把数据包转给intput处理后进入本机。如果目的地不是本机,则把数据包转给forward处理。
4、数据包通过forward处理后,再转给postrouting处理,(是否有目标地址需要改变等),处理后数据包就出了netfilter,到linux服务器出接口,就出了linux服务器。
5、如果数据包进了本机后经过处理需要外发数据包,或本机自身有数据包需要外发,就把数据包发给output链进行处理后,转给postrouting处理后,出linux服务器。进入外面的花花世界。
(四)规则的执行顺序
当数据包进入netfilter,就会和里面的规则进行对比。规则是有顺序的。
先和规则1对比,如果和规则1相匹配,被规则1接受(accept),则数据将不再和后面的规则进行对比。如果不匹配,则按顺序和后面的规则进行对比,直到被接受。如果所有的规则都不匹配,则进行默认策略操作,以决定数据包的去向。所以规则的顺序很重要。
IPTABLE主要是理解上面的内容,一些详细参数可以见附件中的指南。
二、iptalbe语法及参数
iptable [-t table] command [chain] [match][-j target]
注释:iptable [-t 表名] -命令 [链接] [匹配] [-j 动作/目标]
(一) table (表)
1、filter表:默认用filter表执行所有的命令。只操作与本机有关的数据包。
2、nat表:主要用于NAT地址转换。只有数据流的第一个数据包被这个链匹配,后面的包会自动做相同的处理。
分为:DNAT(目标地址转换)、SNAT(源地址转换)、MASQUERADE
(1)DNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问 重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。
(2)SNAT 改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。内网到外网的映射。
(3)MASQUERADE 的作用和SNAT完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。
3、mangle表:用来改变数据包的高级特性,一般不用。
(二) command(命令)详解
1、 -A或者--append //将一条或多条规则加到链尾
2、 -D或者--delete //从链中删除该规则
3、 -R或者--replace //从所选链中替换一条规则
4、 -L或者--list //显示链的所有规则
5、 -I或者--inset //根据给出的规则序号,在链中插入规则。按序号的顺序插入,如是 “1”就插入链首
6、 -X或者--delete-chain //用来删除用户自定义链中规则。必须保证链中的规则都不在使用时才能删除链。如没有指定链,将删除所有自定义链中的规则。
7、 -F或者--flush //清空所选链中的所有规则。如指定链名,则删除对应链的所有规则。如没有指定链名,则删除所有链的所有规则。
8、 -N或者--new-chain //用命令中所指定的名字创建一个新链。
9、 -P或者--policy //设置链的默认目标,即策略。 与链中任何规则都不匹配的信息包将强制使用此命令中指定的策略。
10、-Z或者--zero //将指定链中的所有规则的包字节计数器清零。
(三) match 匹配
分为四大类:通用匹配、隐含匹配、显示匹配、针对非正常包的匹配
1、通用匹配
无论我们使用何种协议,装入何种扩展,通用匹配都可以使用。不需要前提条件
(1) -p(小写)或--protocol
用来检查某些特定协议。协议有TCPUDPICMP三种。可用逗号分开这三种协议的任何组合。也可用“!”号进行取反,表示除该协议外的剩下的协议。也可用all表示全部协议。默认是all,但只代表tcpudpicmp三种协议。
$ iptable -A INPUT -p TCP,UDP
$ iptable -A INPUT -p ! ICMP //这两种表示的意思为一样的。
(2) -s 或 --source
以Ip源地址匹配包。根据源地址范围确定是否允许或拒绝数据包通过过滤器。可使用 “!”符号。 默认是匹配所有ip地址。
可是单个Ip地址,也可以指定一个网段。 如: 192.168.1.1/255.255.255.255 表示一个地址。 192.168.1.0/255.255.255.0 表示一个网段。
(3) -d 或 --destination
用目的Ip地址来与它们匹配。与 source 的格式用法一样
(4) -i
以包进入本地所使用的网络接口来匹配包。只能用INPUT FORWARD PREROUTING 三个链中。用在其他任何链中都会出错。
可使用“+” “!”两种符号。
只用一个“+"号,表示匹配所有的包,不考虑使用哪个接口。如: iptable -A INPUT -i + //表匹配所有的包。
放在某类接口后面,表示所有此类接口相匹配。如: iptable -A INPUT -i eth+ //表示匹配所有ethernet 接口。
(5) -o
以数据包出本地所使用的网络接口来匹配包。与-i一样的使用方法。
只能用OUTPUT FORWARD POSTROUTING 三个链中。用在其他任何链中都会出错。
可使用“+” “!”两种符号。
(6) -f (或 --fragment )
用来匹配一个被分片的包的第二片或以后的部分。因一个数据包被分成多片以后,只有第一片带有源或目标地址。后面的都不带 ,所以只能用这个来匹配。可防止碎片攻击。
2、隐含匹配
这种匹配是隐含的,自动的载入内核的。如我们使用 --protocol tcp 就可以自动匹配TCP包相关的特点。
分三种不同协议的隐含匹配:tcp udp icmp
2.1 tcp match
tcp match 只能隐含匹配TCP包或流的细节。但必须有 -p tcp 作为前提条件。
(2.1.1) TCP --sport
基于tcp包的源端口匹配包 ,不指定此项则表示所有端口。
iptable -A INPUT -p TCP --sport 22:80 //TCP源端口号22到80之间的所有端口。
iptable -A INPUT -p TCP --sport 22: //TCP源端口号22到65535之间的所有端口。
(2.1.2) TCP --dport
基于tcp包的目的端口来匹配包。 与--sport端口用法一样。
(2.1.3) TCP --flags
匹配指定的TCP标记。
iptable -p TCP --tcp-flags SYN,FIN,ACK SYN
2.2 UDP match
(2.1.1) UDP --sport
基于UDP包的源端口匹配包 ,不指定此项则表示所有端口。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。