1.iptables的发展:

 对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。iptables是网络层的防火墙.
 
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
 
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)。
作者一共在内核空间中选择了5个位置,
1.内核空间中:从一个网络接口进来,到另一个网络接口去的
2.数据包从内核流入用户空间的
3.数据包从用户空间流出的
4.进入/离开本机的外网接口
5.进入/离开本机的内网接口
在内核空间中选择了5个位置进行过滤。来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。     
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)   进入netfilter后的数据包在进入路由判断前执行的规则。改变包。
2.INPUT (数据包流入口)    当经过路由判断后,要进入本机的数据包执行的规则。
3.FORWARD (转发管卡)  经过路由判断后,目的地不是本机的数据包执行的规则。与nat 和 mangle表相关联很高,与本机没有关联。
4.OUTPUT(数据包出口)  由本机产生,需向外发的数据包执行的规则。
5.POSTROUTING(路由后) 经过路由判断后,发送到网卡接口前。即数据包准备离开netfilter时执行的规则。
  这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。    
(图片中的说明单网卡和双网卡的的过滤位置)

我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的,对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
2.nat 定义地址转换的  ,对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
3.mangle功能:用于高级路由信息包,如包头内有更改(如tos改变包的服务类型,ttl包的生存时间,mark特殊标记),而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

为了更方便的测试,linux做为单机防火墙测试,图中的linux1和linux2以做了nat.具体配置流程查看链接。

http://www.cnblogs.com/Yuanbangchen/p/5840297.html

三.规则的写法:
 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
          iptable  [-t 表名]  -命令        [链接]  [匹配]      [-j 动作/目标]
 -t table :3个filter nat mangle
 COMMAND:定义如何对规则进行管理
 chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
 CRETIRIA:指定匹配标准
-j ACTION:指定动作
 (一) 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       //显示链的所有规则  
  -v 显示链更详细的规则     
  -N 显示链所有规则,并以数字形式显示。跟-L配合使用。
5、 -I或者--inset     //根据给出的规则序号,在链中插入规则。按序号的顺序插入,如是 “1”就插入链首
6、 -X或者--delete-chain  //用来删除用户自定义链中规则。必须保证链中的规则都不在使用时才能删除链。如没有指定链,将删除所有自定义链中的规则。
7、 -F或者--flush        //清空所选链中的所有规则。如指定链名,则删除对应链的所有规则。如没有指定链名,则删除所有链的所有规则。
8、 -N或者--new-chain      //用命令中所指定的名字创建一个新链。
9、 -P或者--policy        //设置链的默认目标,即策略。 与链中任何规则都不匹配的信息包将强制使用此命令中指定的策略。 
10、-Z或者--zero        //将指定链中的所有规则的包字节计数器清零。
测试说明
[linux1]iptables -t filter  -P INPUT ACCEPT  设置 INPUT链中的默认规则为ACCEPT
[linux1]iptables -t filter -L INPUT  查看filter中INPUT链的规则
[linux1]iptables -t filter -D INPUT 1  删除表filter中INPUT链的第一条规则
[linux1]iptables -t filter -I INPUT 2 -p icmp -j DROP  插入规则,放在第二条,拒绝icmp协议进入linux
[linux1]iptables -t filter  -R INPUT 2 -p icmp -j ACCEPT  替换INPUT链中的规则,
[linux1]iptables -t filter -F INPUT  //清空INPUT链中的所有规则
(三) 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 的格式用法一样
[linux1]iptables -t filter -I FORWARD -p tcp -s 192.168.80.100/32 -d 192.168.10.200/32 --dport 3389 -jDROP(拒绝IP地址为80.100,XP远程win2003.目标端口是3389)
(4)-i  或 --in-interface
   指定数据包从哪个网络接口进入。只能用INPUT FORWARD PREROUTING 三个链中。用在其他任何链中都会出错。可使用“+”  “!”两种符号。
  只用一个“+"号,表示匹配所有的包,不考虑使用哪个接口。如: iptable -A INPUT  -i +  //表匹配所有的包。
  放在某类接口后面,表示所有此类接口相匹配。如:    iptable  -A INPUT -i eth+   //表示匹配所有ethernet 接口。
[linux1]iptables -t filter -I INPUT 2 -p icmp -i eth1 -j DROP  插入规则,拒绝icmp协议从eth1进入linux ( 使用xp ping linux1不通,使用xp ping win2003通(使用的是FORWARD),)
(5)  -o  --out-interface
  指定数据包从哪个网络接口输出。与-i一样的使用方法。只能用OUTPUT FORWARD POSTROUTING 三个链中。用在其他任何链中都会出错.可使用“+”  “!”两种符号。
 (6)  -f  ( --fragment )
      用来匹配一个被分片的包的第二片或以后的部分。因一个数据包被分成多片以后,只有第一片带有源或目标地址。后面的都不带 ,所以只能用这个来匹配。可防止碎片攻击。
2、隐含匹配
   这种匹配是隐含的,自动的载入内核的。如我们使用 --protocol tcp  就可以自动匹配TCP包相关的特点。
   分三种不同协议的隐含匹配:tcp   udp  icmp
    1 tcp 
       tcp match 只能隐含匹配TCP包或流的细节。但必须有  -p tcp 作为前提条件。
     TCP --sport  
            基于tcp包的源端口匹配包  ,不指定此项则表示所有端口。
            iptable -A INPUT -p  TCP  --sport   22:80    //TCP源端口号22到80之间的所有端口。
            iptable -A INPUT -p  TCP  --sport   22:      //TCP源端口号22到65535之间的所有端口。     
      TCP --dport  
            基于tcp包的目的端口来匹配包。   与--sport端口用法一样。
      TCP --flags  
            匹配指定的TCP标记。 
            iptable  -p  TCP --tcp-flags  SYN,FIN,ACK   SYN
   2   UDP match
       UDP --sport  
            基于UDP包的源端口匹配包  ,不指定此项则表示所有端口。
        UDP --dport  
            基于UDP包的目的端口匹配包  ,不指定此项则表示所有端口。
  3   -m icmp  --icmp-type
       根据ICMP类型包匹配。类型 的指定可以使用十进制数或相关的名字,不同的类型,有不同的ICMP数值表示。也可以用“!”取反。
  类型 8 echo-request    请求
  类型0 echo-reply
  [linux1] iptables -t filter -I FORWARD -s 192.168.10.0/24 -d 192.168.80.0/24 -p icmp -m icmp --icmp-type 8 -j DROP 拒绝win2003与xp新建会话。xp向2003是允许的。
  [linux1] iptables -t filter -I INPUT  -p icmp -m icmp --icmp-type echo-request -j DROP 拒绝ping linux1 ,单向的。
  3、显示匹配
    显示匹配必须用  -m装 载。 
     (0)-m state  --state  基于状态的数据包。--state {NEW,ESTATBLISHED,INVALID,RELATED}  指定检测那种状态
  NEW:表示该封包想要开始一个新的连接
  ESTATBLISHED:表示该封包属于某个已经建立的连接。
  INVALID:表示该封包的连接编号无法辨识或编号不正确。
  RELATED:表示该封包属于某个已经建立的连接,所建立的新连接。例如   FTP 连接必定是源自某个 FTP连接。先21连接,再22连接。
      [linux1]iptables -t filter -I FORWARD  -s 192.168.10.0/24 -d 192.168.80.0/24 -m state --state NEW  -j DROP  拒绝win2003与xp新建会话(单向拒绝)。xp向2003是允许的。
  [linux1]iptables -t filter -I OUTPUT -m state --state NEW  -j DROP  (linux1禁止主动与客户端口建立会话, 客户端口可以与lunux1建立会话)
     (1)-m limit    
       必须用 -m limit 明确指出。  可以对指定的规则的匹配次数加以限制。即,当某条规则匹配到一定次数后,就不再匹配。也就是限制可匹配包的数量。这样可以防止DOS攻击。
       限制方法: 设定对某条规则 的匹配最大次数。设一个限定值 。 当到达限定值以后,就停止匹配。但有个规定,在超过限制次数后,仍会每隔一段时间再增加一次匹配次数。但增加的空闲匹配数最大数量不超过最大限制次数。
        --limit rate
          最大平均匹配速率:可赋的值有'/second', '/minute', '/hour', or '/day'这样的单位,默认是3/hour。
    192.168.10.0网段每分种向192.168.80.0发送数据包不能超过300个。 1500字节*300=450K, 超了就拒绝。
    [linux1]iptables -t filter -I FORWARD  -s 192.168.10.0/24 -d 192.168.80.0/24 -m limit --limit 300/second   -j ACCEPT 
    [linux1]iptables -t filter -A FORWARD  -s 192.168.10.0/24 -d 192.168.80.0/24  -j DROP  
     
    for((i=2;i<254;i++))
    do
    iptables -I FORWARD -s 192.168.10.$i -j DROP
    iptables -I FORWARD -s 192.168.10.$i  -m limit --limit 300/sec --limit-burst 500 -j ACCEPT
    done
        --limit-burst number
         待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5
    iptable -A INPUT -m limit --limt 3/hour    //设置最大平均匹配速率。也就是单位时间内,可匹配的数据包个数。   --limt 是指定隔多 长时间发一次通行证。
    iptable -A INPUT  -m limit --limit-burst 5  //设定刚开始发放5个通行证,也最多只可匹配5个数据包。
    前5个数据包不限速,第6个开限速。
    iptables -I FORWARD -s 192.168.10.200 -d 192.168.80.100  -m limit --limit 300/sec --limit-burst 5 -j ACCEPT
    允许ping 最多5个数据包。第6个将使用第二条规则来决定数据包的走向。
    [linux1]iptables -t filter -I FORWARD  -s 192.168.10.200 -d 192.168.80.100  -p icmp -m limit --limit-burst 5  -j ACCEPT
       [linux1]iptables -A filter -I FORWARD  -s 192.168.10.200 -d 192.168.80.100  -p icmp  -j DROP
  
  (2) mac   只能匹配MAC源地址。基于包的MAC源地址匹配包 ,OUTPUT和POSTROUTING链上不能用。
      [linux1]iptable -A  FORWARD -d 192.168.80.100 -m mac  --mac-source   00:00:eb:1c:24  -j DROP   //MAC地址禁止访问80.100
  (3)  mark 
       以数据包被 设置的MARK来匹配包。这个值由  MARK TARGET 来设置的。
  (4)  -m  multiport 
         这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用。
        多端口匹配扩展让我们能够在一条规则里指定不连续的多个端口。如果没有这个扩展,我们只能按端口来写规则了。这只是标准端口匹配的增强版。不能在一条规则里同时用标准端口匹配和多端口匹配。
    三个选项:   --source-ports   ;  --destination-ports  ;   --ports
   [linux1]iptables -t filter -I FORWARD  -p tcp -s 192.168.10.0/24 -d 192.168.80.0/24   -m multiport --source-ports 1:1022,3389 -j DROP 拒绝1到1024 和3389连接。
        iptable  -A INPUT  -p TCP   -m  multiport  --sport 1:1024,115       
        iptable  -A INPUT  -p TCP   -m  multiport  --dport 22,28,115 
        iptable  -A INPUT  -p TCP   -m  multiport  --port 22,28,115
  
(5) -m iprange  指定地址范围   --src-range ip-ip    --dst-range ip-ip
   [linux1]iptables -t filter -I FORWARD  -m iprange --src-range 192.168.80.1-192.168.80.100 -j  DROP   拒绝192.168.80.1-192.168.80.100访问
(6) -m connlimit限制最大连接个数。 --connlimit-above  
   [linux1]iptables -t filter -I FORWARD  -p tcp --dport 3389  -s 192.168.80.100  -d 192.168.10.200 -m connlimit --connlimit-above 2 -j DROP 拒绝超过2个以上的远程会话。 
(7)   ttl match
     根据IP头里的TTL字段来匹配包。
用来更改包的TTL,有些ISP根据TTL来判断是不是有多台机器共享连接上网。
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 1
   # 离开防火墙的时候实际上TTL已经-2了,因为防火墙本身要-1一次。
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
   # 离开防火墙的时候不增不减,tracert就不好用了,呵呵。
(8) owner match
基于包的生成者(即所有者或拥有者)的ID来匹配包。 
owner 可以是启动进程的用户的ID,或用户所在的级的ID或进程的ID,或会话的ID。此只能用在OUTPUT 中。
此模块设为本地生成包匹配包创建者的不同特征。而且即使这样一些包(如ICMP ping应答)还可能没有所有者,因此永远不会匹配。
--uid-owner userid
如果给出有效的user id,那么匹配它的进程产生的包。
--gid-owner groupid
如果给出有效的group id,那么匹配它的进程产生的包。
--sid-owner seessionid
根据给出的会话组匹配该进程产生的包。
 
( 四) targets/jump    指由规则指定的操作,对与规则匹配的信息包执行什么动作。
1、accept
这个参数没有任何选项。指定  -j accept 即可。 
一旦满 足匹配不再去匹配表或链内定义的其他规则。但它还可能会匹配其他表和链内的规则。即在同一个表内匹配后就到上为止,不往下继续。
2、drop 
-j drop   当信息包与规则完全匹配时,将丢弃该 包。不对它做处理。并且不向发送者返回任何信息。也不向路由器返回信息。
3、reject
与drop相同的工作方式,不同的是,丢弃包后,会发送错误信息给发送方。
   iptables -A FORWARD -p icmp -s 192.168.10.100 -j REJECT    目标端口不可到达
   iptables -A FORWARD -p icmp -s 192.168.10.100 -j DROP      超时。
4、DNAT
用在prerouting链上。
做目的网络地址转换的。就是重写目的的IP地址。
如果一个包被匹配,那么和它属于同一个流的所有的包都会被自动转换。然后可以被路由到正确的主机和网络。
也就是如同防火墙的外部地址映射。把外部地址映射到内部地址上。
iptables -t nat   -A PREROUTING   -d 218.104.235.238 -p TCP  --dport 110,125    -j DNAT --to-destination  192.168.9.1 
//把所有访问218.104.235.238地址  110.125端口的包全部转发到 192.168.9.1上。
--to-destination   //目的地重写
5、SNAT
用在nat 表的postrouting链表。这个和DNAT相反。是做源地址转换。就是重写源地址IP。 常用在内部网到外部网的转换。
--to-source 
iptables -t nat POSTROUTING  -o eth0 -p tcp  -j SNAT --to-source 218.107.248.127  //从eth0接口往外发的数据包都把源地址重写为218.107.248.127
********************
   iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.9
   # 将所有的访问15.45.23.67:80端口的数据做DNAT发到192.168.1.9:80
   如果和192.168.1.9在同一内网的机器要访问15.45.23.67,防火墙还需要做设置,改变源IP为防火墙内网IP 192.168.1.1。否则数据包直接发给内网机器,对方将丢弃。
   iptables -t nat -A POSTROUTING -p tcp --dst 15.45.23.67 --dport 80 -j SNAT --to-source 192.168.1.1
   # 将所有的访问15.45.23.67:80端口的数据包源IP改为192.168.1.1
   如果防火墙也需要访问15.45.23.67:80,则需要在OUTPUT链中添加,因为防火墙自己发出的包不经过PREROUTING。
   iptables -t nat -A OUTPUT --dst 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.9
********************
6、MASQUERADE
masquerade 的作用和 SNAT的作用是一样的。 区别是,他不需要指定固定的转换后的IP地址。专门用来设计动态获取IP地址的连接的。
MASQUERADE的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT
如家里的ADSL上网,外网的IP地址不是固定的,你无法固定的设定NAT转换后的IP地址。这时就需要用masquerade来动态获取了。
iptables -t nat -A POSTROUTING  -s 192.168.1.0/24 -j masquerade      //即把192.168.1.0 这个网段的地址都重写为动态的外部IP地址。
7、REDIRECT 
只能在NAT表中的PREROUTING  OUTPUT 链中使用
在防火墙所在的机子内部转发包或流到另一个端口。比如,我们可以把所有去往端口HTTP的包REDIRECT到HTTP proxy(例如squid),当然这都发生在我们自己的主机内部。
--to-ports
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
不使用这个选项,目的端口不会被改变。
指定一个端口,如--to-ports 8080
指定端口范围,如--to-ports 8080-8090
8、RETURN
顾名思义,它使包返回上一层,顺序是:子链——>父链——>缺省的策略。具体地说,就是若包在子链中遇到了RETURN,则返回父链的下一条规则继续进行条件的比较,若是在父链(或称主链,比如INPUT)中遇到了RETURN,就要被缺省的策略(一般是ACCEPT或DROP)操作了。(译者注:这很象C语言中函数返回值的情况)
9、MIRROR
 颠倒IP头中的源地址与目的地址,再转发。
10、LOG
 在内核空间记录日志,dmesg等才能看。/var/log/messages
iptables -t filter -I FORWARD -s 192.168.10.0/24 -p tcp 
iptables -t filter -I INPUT  -p icmp -j --log-prefix "XXXXX"    --log-prefix "XXXXX" 是添加的信息。方便查找。
11、ULOG
 在用户空间记录日志。

最新文章

  1. C++-Qt【4】-CheckBox on QListView
  2. 触摸java常量池
  3. DBA数据库:MySQL简述
  4. bootstrap-滚动监听
  5. 由函数clock想到的
  6. linu流量监控
  7. delphi 基础之四 delphi 组织结构
  8. mysql数据库导入外键约束问题
  9. 如何在Linux下创建与解压zip, tar, tar.gz和tar.bz2文件
  10. String&amp;StringBuilder&amp;StringBuffer总结
  11. Bear + Reminders 是完美的Thing 3 的替代品
  12. Spring AOP不起作用原因
  13. asp.net乱码问题
  14. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)----&gt;第4节: recycler中获取对象
  15. 【搜索】POJ-3669 BFS
  16. 比特币 BTC本地测试节点
  17. Ubuntu14.04安装有道词典(openyoudao)
  18. February 1 2017 Week 5 Wednesday
  19. java collection(一)
  20. CDN 环境下获取用户IP方法

热门文章

  1. HUST 1017 Exact cover dance links
  2. QT数据库使用案列【联系人】-- 使用sqlite和QStringListModel
  3. 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
  4. Magento 重新安装的方法
  5. HDU-4612 Warm up 边双连通分量+缩点+最长链
  6. FZU 2176 easy problem (DFS序+树状数组)
  7. JVM 必备指南
  8. Java自定义缓冲区MyBufferedReader
  9. Android实例-利用WebBrowser实现浏览器(XE8+小米2)
  10. Cocos2d-x 3.x学习笔记(一):开始Cocos2d之旅