iptables积累

转自:http://wang0.blog.51cto.com/8619050/1405786

一、防火墙

   防火墙分为网络防火墙和应用层防火墙

   1、网络防火墙

   网络防火墙就是一个位于计算机和它所连接的网络之间的防火墙。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。

   2、应用层防火墙

   应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。

   因为应用层防火墙的算法会更复杂,过虑更为严格,所以在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。

Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(网络层防火墙)。

二、iptables的表链结构

   1、iptables简介

   平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫做防火墙,它是基于软件方式工作的网络防火墙。iptables工作于用户空间,是防火墙的规则编写工具,使用iptables编写规则并且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个能够让规则生效的网络架构,工作于内核空间。

   2、iptables的表、链结构

   iptables是由四表五链组成的,想要配置iptables必须先了解这四表五链

wKioL1MypqyyDy1OAAI9TmpOfdk629.jpg

一个规则可以出现在多个表中,谁先谁后呢?所以在这四个表中是存在优先级关系的:

1)四表

   优先级:raw表  >  mangle表 >  nat表  >  filter表

   ①、raw表

RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。

       RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。

       raw内含有两个链:PREROUTING和OUTPUT

   ②、mangle表

       mangle表一般是对数据包进行修改用的

       比如在网络的转发过程中,数据包要从X到Z,中间夹了一个Y,当数据从X到Y的时候,Y要运行拆包,看是不是自己的,如果是就收下了,如果不就是重新封装,把源IP改为自己的,而不再是X的了,再进行转发。

       mangle表中含五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

   ③、nat表

       用于nat功能(端口映射,地址映射等)

       主要用来处理一些将要到达本机路由和将要离开本机路由的数据包,修改数据包中的源、目标IP地址或端口;其对应的模块为iptable_nat。

       nat表内含三个链:PREROUTING、POSTROUTING、OUTPUT

   ④、filter表

       一看名字就知道是用来做过滤用的。filter表是iptables的默认表,如果在设置规则时,不指定表,则默认就是在filter表上操作

       filter表内含三个链:INPUT、FORWARD、OUTPUT

   2)五链

       这五条链其实就是针对防火墙策略的规则

   ①、PREROUTING

       路由前,数据包在经过防火墙前应做如何处理

   ②、INPUT

       在数据包进行进入本机前就做何处理,目标是本机,不是网络内的主机

   ③、OUTPUT

       在数据包离开本机时做何处理,源是本机,目标是其它主机

   ④、FORWARD

       对于转发数据包做如何处理,因为本机可能是一台代理服务器,网络内的其它主机在与互联网通信时都需要经过这台服务器的转发

   ⑤、POSTROUTING

       在数据包离开防火墙时做如何处理

   INPUT、OUTPUT链主要用在“主机型防火墙”中,即主要针对服务器本机进行保护的防火墙;而FORWARD、PREROUTING、POSTROUTING链多用在“网络型防火墙”中,

三、iptables数据包的过滤流程

   为了更直观的表现数据包的过滤流程,请参考第二步及下图

wKiom1MysozxkuL0AAJOKwKvWIM068.jpg

四、iptables使用规则

   iptables规则=检查条件+处理机制

   1)检查条件

       (1)IP:源IP,目标IP

       (2)Protocal:TCP、UDP、ICMP

               TCP:源端口、目标端口、Flags

               UDP:源端口、目标端口

               ICMP:ICMP-TYPE

       TCP Flags:基于标记的TCP包匹配经常被用于过滤试图打开新连接的TCP数据包,共有六个标志位,UDP没有

       ①、URG

           如为1,则表示本数据包中含有紧急数据

       ②、ACK

           确认标志们

       ③、PSH

           PUSH操作,所谓PUSH操作就是批数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队

       ④、RST

           表示连接复位请求,用来复位那些产生错误的连接;当PST=1时,表示出现严重错误,必须释放连接,然后再重新建立

       ⑤、SYN

           表示同步序号,用来建立连接。

           SYN=1,ACK=0 表示连接请求

           SYN=1,ACK=1 表示连接请求被响应

       ⑥、FIN

           表示数据已经发送完毕,希望释放连接

   2)处理机制、动作     -j target

       ACCEPT:将包放行,进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链

       DENY:拒绝,委婉式的拒绝

       DROP:丢弃数据包,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序

       REJECT:阻拦该数据包,并通知对方(ICMP消息)

       SNAT:改定数据包源IP

       DNAT:改定数据包目标IP

       RETURN:结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

       REDIRECT:将数据包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则

       LOG:记录日志

五、iptables语法

  1)创建一条自定义的规则链

1
iptables [-t table] -N chain

  2)删除一条自定义的规则链,必须为空链

1
iptables [-t table] -X [chain]

3)修改自定义链名

1
iptables [-t table] -E old-chain-name  new-chain-name

4)为链指定默认策略,指定默认规则

1
iptables [-t table] -P chain target

5)iptables [-t talbe] {-F|-L|-Z} [chain[rulenum]][options...]

   -F:flush,清空链中的规则,不指链则清空表中的所有规则,规则有编号,自上而下从1开始

   -L:list,列出表中的所有规则

       -n:只和-L一块用,数字格式显示IP和PORT

       -v:verbose,以详细格式显示    

-vvv

       -x:exactly,精确值,不执行单位换算

       --line-numbers:显示各规则的行号

   -Z:zero,清零,把规则的计数器清零

   6)iptables [-t table] {-A|-D} chain rule-specification

   -A:append,附加一条规则,添加到现在规则链的最下面(-I:默认添加到最前面)
rule-specification

       匹配条件 -j 处理机制

       (1)通用匹配:

           -s:source,匹配源地址,可以是IP,也可以是网络地址;可以使用!操作符取反

           -d:匹配目标地址,可以是IP,也可以是网络地址;可以使用!操作符取反

           -p:匹配协议,通常只使用{TCP|UDP|ICMP}三者之一

           -i:数据报文流入接口;通常只用于INPUT、FORWARD和PREROUTING

           -o:数据报文流出接口;通常只用于OUTPUT、FORWARD和POSTROUTING

       (2)扩展匹配:

        ①隐含扩展:使用-p{tcp|udp|icmp}指定某特定服务后,自动能够对协议进行扩展

           -p tcp

               --dport m[-n]:匹配的目标端口,可以是连续的多个端口  

               --sport m[-n]:匹配的源端口,可以是连续的多个端口

               --tcpflags           (6个标志们:URG、PSH、RST、SYN、ACK、FIN)

                   --tcp-flags rst,syn,ack,fin syn = --syn

                   ALL,NONE

           -p udp     udp没有标志位,所以只有源端口和目标端口可选

               --dport

               --sport

           -p icmp

               --icmp-type

                 8:ping 请求

                 0:ping响应

         ②显示扩展:必须要明确指定的扩展模块

           -m 扩展模块名称 --专用选项1 --专用选项2

           multiport:多端口匹配,一次指定多个(15个以内)离散端口

               --source-ports, --sports

               --destination-ports,  --dports

               --ports

           iprange:ip地址范围

               [!] --src-range from[-to]

               [!] --dst-range from[-to]

           time:指定时间范围

               datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

               datestop

               timestart hh:mm[:ss]

               timestop hh:mm[:ss]

               [!]--weekdays day[,day...]

           string:字符串匹配

               --algo{bm|kmp}:字符匹配查找时使用算法

               --string "STRING":要查找的字符串

               --hex-string "HEX-STRING":要查找的字符,先编码成16进制格式

           connlimit:第IP对指定服务的最大并发连接数

               [!]--connlimit-above [n]

           limit:报文速率控制

               --limit #[/second|/minute|/hour|/day]

               --limit-burst #

           state:状态匹配

               ip_conntrack,nf_conntrack

               --state

                   NEW

                   ESTABLISHED

                   RELATED

                   INVALID

  -D 删除规则

1
iptables [-t table] -D chain rulenum

  -I 插入规则

1
iptables [-t table] -I chain [rulenum] rule-specification

-R 替换指定规则

1
iptables [-t table] -Rchain rulenum rule-specification

-S 只显示指定链上的规则添加命令


转自:https://hacpai.com/article/1447587668001


iptables 是 linux 的防火墙大家都知道,但它能干的东西可能大大超乎你的想象,它可以进行 ttl 的修改,nat 的转换,甚至于负载均衡,本来想写点什么的但是那个 iptables 的使用手册已经写的太 TM 的完善了,那我就找个防火墙的配置讲解一下把:


Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere                    
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:sieve-filter
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:dc
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:pharos
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    


 


先讲讲 chain,chain 就是要执行的防火墙操作的列表


上面有三个 CHAIN 的分组 分别是 INPUT,FORWARD,OUTPUT,分别代表的是 INPUT:Ip 包发往本机的时候要进行的防火墙操作;FORWARD 目的地不是本机的时候,要进行的防火墙的操作;OUTPUT 就是本机发出的包需要进行的防火墙的操作


还有两条 chain 没有在上述的表格中显示,分别为 prerounting,postrounting,顾名思义,就是 进入本机 路由变换前进行的防火墙操作,进行路由转换操作后进行的防火墙操作


chain 还可以自定义新增 chain,自定义的 chain 由系统定义的 chain 里跳入,执行完后跳回原来的 chain。


关于 chain 的执行连接过程如下(偷的一张图,作者大大借用下):


 

在上面的图中绿色部分的就是 iptables 的表,表有什么用呢?


表就是对系统每个 chain 的更细的划分,表一共有 3 张:mangle,nat,filter.mangle 表主要处理 ttl,tos,mark 等信息,nat 主要处理 ip、端口转换的信息,filter 顾名思义就是过滤器,用作防火墙

举个栗子,prerounting chain 在 nat 表 里的部分 就是在 prerounting 的阶段对 nat 信息进行配置

好了,有了上面的基础只是,我们就能看懂刚刚列出的表格了 ~

先看 input chain


1)Chain INPUT (policy ACCEPT)
2)target     prot opt source               destination         
3)ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
4)ACCEPT     icmp --  anywhere             anywhere                    
5)ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
6)ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http


第一行 写了 chain 的名字,policy Accept 的意思是如果 Chain 中的所有条目都没有命中并执行,则默认 Accept,放行

第三行 的意思是 匹配 连接的状态(什么是连接的状态?翻那个手册把.....)若连接的状态被防火墙判断为 related 或者 established 的话,就 Accept 放行。

related 指代某个已经放行的通讯相关联的端口通讯(怎么判断相关联?我也不太清楚....)

establish 的意思是已经建立连接的话那么就放行(何为已经建立连接?就是本地发出去一堆信息,远程有回应信息   或者 远程发一堆信息 本地有回应信息)

第四行 不讲

第五行 如果是连接到 ssh 端口的 状态为 NEW 的连接,则放行(状态为 NEW 的意思是,发出去一堆信息,还没有收到回应  或者 收到一堆信息,还没有回应)

第六行 不讲

接着看 output chain

1)Chain OUTPUT (policy ACCEPT)
2)target     prot opt source               destination     

第一行标明了如果没有匹配的规则,则放行,也就是说 本地总是可以发信息到外面,一旦发出去,那么连接就变成了 new 只要对方有回应 连接就变成 establish,在 input 的列表里 establish 是放行的

综上,这个防火墙的规则可以定义为,只要本地发起的连接,都能通过防火墙,正常通讯,特定放行的几个端口 ssh 之类的 允许外部发起访问,并放行,其余情况都禁止。好了,讲完了,更多的知识去看那个手册把....


转自:http://blog.chinaunix.net/uid-20545038-id-1648538.html

1、iptables或IP6tables下一共有三个表:Filter、NAT和mangle。
 
1)filter
filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作。
    FORWARD链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,
    INPUT恰恰针对那些目的地是本地的包;
    OUTPUT是用来过滤所有本地生成的包。 
 
2)nat
nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。 
    PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话;
    OUTPUT链改变本地产生的包的目的地址;
    POSTROUTING链在包就要离开防火墙之前改变其源地址;
 
3)mangle
这个表主要用来mangle数据包。
我们可以改变不同的包及包头的内容,比如 TTL,TOS或MARK。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。
       PREROUTING在包进入防火墙之后、路由判断之前改变包;
       POSTROUTING是在所有路由判断之后,改变包;
       OUTPUT在确定包的目的之前更改数据包;
       INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包;
       FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包。
注意,mangle表不能做任何NAT,它只是改变数据包的 TTL,TOS或MARK,而不是其源目地址。NAT是在nat表中操作的。
 
------------------------------------------------
------------------------------------------------
 
2、数据包通过各个链的顺序
  1)以本地为目标(就是我们自己的机子了)的包
    A、在线路上传输(比如,Internet); 
    B、进入接口 (比如, eth0); 
    C、mangle PREROUTING 这个链用来mangle数据包,比如改变TOS等;
    D、 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,某些情况下包会溜过去; 
    E、路由判断,比如,包是发往本地的,还是要转发的;
    F、mangle INPUT 在路由之后,被送往本地程序之前,mangle数据包;
    G filter INPUT 所有以本地为目的的包都要经过这个链;
    H、到达本地程序了(比如,服务程序或客户程序)
 
 2)以本地为源的包
    A、本地程序(比如,服务程序或客户程序);
    B、路由判断,要使用源地址,外出接口,还有其他一些信息;  
    C、mangle OUTPUT 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦; 
    D、nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作; 
    E、filter OUTPUT 对本地发出的包过滤;
    F、mangle POSTROUTING 这条链主要在包DNAT之后(注:作者把这一次DNAT称作实际的路由,虽然
      在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿
      去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。
      有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包;
    G、nat POSTROUTING在这里做SNAT。不要在这里做过滤,有些包是会漏掉,即使你用了DROP策略;
    H、离开接口(比如: eth0);
    I、在线路上传输(比如,Internet);
 
 3)被转发的包
    A、在线路上传输(比如,Internet);
    B、进入接口(比如, eth0);
    C、mangle PREROUTING mangle数据包,,比如改变TOS等; 
    D、nat PREROUTING 这个链主要用来做DNAT。(不要在这个链做过虑操作),稍后会做SNAT; 
    E、路由判断,比如,包是发往本地的,还是要转发的; 
    F、mangle FORWARD 包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这
      里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后,在最后一次
      更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目
      的地,如丢弃包); 
    G、filter FORWARD 包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这
      些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到
      外网的。在你自己书写规则时,要考虑到这一点;  
    H、mangle POSTROUTING 这个链也是针对一些特殊类型的包(注:参考第6步,可以发现,在转发包
      时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目的地址的操作完成
      之后做的,但这时包还在本地上; 
    I、nat POSTROUTING 这个链就是用来做SNAT的,当然也包括Masquerade(伪装);但不要在这儿做
      过滤,因为某些包即使不满足条件也会通过;
    J、离开接口(比如: eth0); 
    K、又在线路上传输了(比如,LAN) 
 
    综上,凡是有mangle表出现的地方,mangle上的链表总是要优先于另外两个表中的处理链。
    在第一个路由判断处,不是发往本地的包,我们会发送它穿过 FORWARD链;若包的目的地是本地监听的IP地址,我们就会发送这个包穿过INPUT链,最后到达本地。
    值得注意的是在做NAT的过程中,发往本机的包的目的地址可能会在PREROUTING链里被改变。这个操作发生在第一次路由之前,所以在地址被改变之后,才能对包进行路由。所有的包都会经过上述某一条路径。如果你把一个包DNAT回它原来的网络,这个包会继续走完相应路径上剩下的链,直到它被发送回原来的网络。

转自:http://blog.csdn.net/cindy_cheng/article/details/51525184

Netfilter/iptables可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行,被认为是Linux中实现包过滤功能的第四代应用程序。在接下来的这个《深入浅出Netfilter/iptables防火墙框架》系列中,51CTO安全/linux专家李洋将对Netfilter/iptables进行详尽的、条理的介绍。本文是基础篇,先介绍Netfilter/iptables框架的原理。


Linux系统管理员们都接触过Netfilter/iptables,这是Linux系统自带的免费防火墙,功能十分强大。在接下来的这个《深入浅出Netfilter/iptables防火墙框架》系列中,51CTO安全/Linux专家李洋将对Netfilter/iptables进行详尽的、条理的介绍。本文是基础篇,先介绍Netfilter/iptables框架的原理。

1、Netfilter/iptables框架简介

Netfilter/iptables可以对流入和流出的信息进行细化控制,且可以在一台低配置机器上很好地运行,被认为是Linux中实现包过滤功能的第四代应用程序。Netfilter/iptables包含在Linux 2.4以后的内核中,可以实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。Netfilter/iptables从ipchains和ipwadfm(IP防火墙管理)演化而来,功能更加强大。

这里所说的iptables是ipchains的后继工具,但具有更强的可扩展性。内核模块可以注册一个新的规则表(table),并要求数据包流经指定的规则表。这种数据包选择用于实现数据报过滤(filter表),网络地址转换(NAT表)及数据报处理(mangle表)。Linux 2.4内核及其以上版本提供的这三种数据报处理功能都基于netfilter的钩子函数和IP表,都是相互间独立的模块,完美地集成到了由netfilter提供的框架中,如图1所示。netfilter主要提供了如下三项功能:

  1. 包过滤:filter表格不会对数据报进行修改,而只对数据报进行过滤。iptables优于ipchains的一个方面就是它更为小巧和快速。它是通过钩子函数NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
  2. NAT:NAT表格监听三个netfilter钩子函数:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING实现对需要转发数据报的源地址进行地址转换,而NF_IP_POST_ROUTING则对需要转发的数据报目的地址进行地址转换。对于本地数据报目的地址的转换,则由NF_IP_LOCAL_OUT来实现。
  3. 数据报处理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT钩子中进行注册。使用mangle表,可以实现对数据报的修改或给数据报附上一些外带数据。当前mangle表支持修改TOS位及设置skb的nfmard字段。

Netfilter/Iptables框架结构示意图
图1 Netfilter/Iptables框架结构示意图

根据实际情况,灵活运用Netfilter/iptables框架,生成相应的防火墙规则可以方便、高效地阻断部分网络攻击以及非法数据报(参见图2所示的工作原理)。然而,由于配置了防火墙,可能引起诸如FTP、QQ、MSN等协议和软件无法使用或者某些功能无法正常使用,也有可能引起RPC(远程过程调用)无法执行,这需要用户根据实际情况来配置相应的服务代理程序来开启这些服务。需要特别提醒注意的是,防火墙也可能被内部攻击,其并不是万能的,还需要综合使用其他防护手段。内部人员由于无法通过Telnet浏览邮件或使用FTP向外发送信息,个别人会对防火墙不满进而可能对其进行攻击和破坏。而且,攻击的目标常常是防火墙或防火墙运行的操作系统,这极大地危害了防火墙系统甚至是关键信息系统的安全。

Netfilter/Iptables框架工作原理示意
图2 Netfilter/Iptables框架工作原理示意


2、iptables基本原理

通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令,规则控制信息包的过滤。通过使用Netfilter/iptables系统提供的特殊命令iptables,建立这些规则,并将其添加到内核空间的特定信息包过滤表内的链中。关于添加/除去/编辑规则的命令的一般语法如下:

iptables [-t table] command [match] [target]

不难看出,一条iptables规则包含如下4个基本元素:

  1. 命令
  2. 匹配
  3. 目标

1) 表(table)

[-t table]选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三种可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter用作默认表。filter表用于一般的信息包过滤,包含INPUT、OUTPUT和FORWAR链。nat表用于要转发的信息包,它包含PREROUTING、OUTPUT和POSTROUTING链。如果信息包及其头内进行了任何更改,则使用mangle表。该表包含一些规则来标记用于高级路由的信息包以及PREROUTING和OUTPUT链。

2) 命令(command)

command部分是iptables命令的最重要部分,它告诉iptables命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则。主要有如表1所示的命令。

表1 iptables常用命令

命    令说    明
-A或--append该命令将一条规则附加到链的末尾
-D或--delete通过用-D指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则
-P或--policy该命令设置链的默认目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略
-N或--new-chain用命令中所指定的名称创建一个新链
-F或--flush如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除
-L或--list列出指定链中的所有规则
-R或--replace替换指定链中一条匹配的规则
-X或--delete-chain删除指定用户的的定义链,若没有指定链,则删除所有的用户链
-C或--check检查数据包是否与指定链的规则相匹配
-Z或--zero将指定链中所有规则的byte计数器清零

3) 匹配(match)

iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用匹配和特定于协议的匹配。这里,将研究可用于采用任何协议的信息包的通用匹配。下面是一些重要的且常用的通用匹配及其说明,如表2所示。

表2 通用匹配说明

通用匹配说    明
-p或--protocol该通用协议匹配用于检查某些特定协议。协议示例有TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及ALL(用于所有协议)。ALL是默认匹配。可以使用!符号表示不与该项匹配
-s 或 --source该源匹配用于根据信息包的源IP地址来与它们匹配。该匹配还允许对某一范围内的IP地址进行匹配,可以使用!符号,表示不与该项匹配。默认源匹配与所有IP地址匹配
-d 或 --destination该目的地匹配用于根据信息包的目的地IP地址来与它们匹配。该匹配还允许对某一范围内IP地址进行匹配,可以使用!符号表示不与该项匹配
--sport指定匹配规则的源端口或端口范围
--dport指定匹配规则的目的端口或端口范围
-i匹配单独的网络接口或某种类型的接口设置过滤规则

4) 目标(target)

前面已经讲过,目标是由规则指定的操作,对与那些规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。下面是常用的一些目标及其示例和说明,如表3所示。

表3 目标项说明

目 标 项说    明
ACCEPT当信息包与具有ACCEPT目标的规则完全匹配时,会被接受(允许它前往目的地)
DROP当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP
REJECT该目标的工作方式与DROP目标相同,但它比DROP好。和DROP不同,REJECT不会在服务器和客户机上留下死套接字。另外,REJECT将错误消息发回给信息包的发送方。该目标被指定为-j REJECT
RETURN在规则中设置的RETURN目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如INPUT之类的主链,则使用该链的默认策略处理信息包。它被指定为-jump RETURN
LOG表示将包的有关信息记录入日志
TOS表示改写数据包的TOS值


转自:http://www.mamicode.com/info-detail-170679.html

们要讲防火墙,首先要了解什么是防火墙,其实防火墙就是设定一些规则来管制过滤进入到我们网 络内的主机IP数据包的一种机制!它可以限制你的文件传输服务 (FTP)可以限制主机可以通过的服务;还可以限制主机对外联等等。。。防火墙分为硬件防火墙和软件防火墙。我们下边说的为软件防火墙。

我们要知道,防火墙的规则是建立在内核上的,内核有提供Netfilter包过滤机制,netfilter的机制内核自建的,那我们又该如何操纵它呢?Linux6.x上为我们提供了iptables这个工具来实现对防火墙规则的设定,并提交给Netfilter来执行。iptables:用户空间的工具。写规则,并自动发往netfilter,netfilter:接收并生效规则。

[root@station153 ~]# rpm -ql iptables  查看安装生成的文件

/bin/iptables-xml-1.4.7

/etc/rc.d/init.d/iptables iptables对应的启动服务

/etc/sysconfig/iptables-config 对应的开机要配置参数

/lib64/libip4tc.so.0-1.4.7  iptables所需的库文件

/lib64/xtables/libipt_CLUSTERIP.so

/sbin/iptables-1.4.7    iptables的启动程序

/sbin/iptables-restore-1.4.7   iptables的重载规则程序

/sbin/iptables-save-1.4.7        iptables的保存规则的程序

/usr/share/doc/iptables-1.4.7    iptables相关文档

/usr/share/man/man8/iptables-1.4.7.8.gz   man文档

要学习防火墙首先我们要了解数据包进来出去的过程。

数据包在进入到我们的网卡没有经过路由决策时有PREROUTING链,在经过路由决策后可以经过INPUT链进入到本机应用层或者通过转发经由FORWARD链直接出去而不进入本机应用层,出去还需要经过POSTROUTING链,而进入本机后出来到达路由决策前具有OUTPUT链。

bubuko.com,布布扣

链是数据包流向经过的路径,那么我们如何使用这些链呢,防火墙规则里有多个表,而我们的链就是放在表里的规则上的。

规则的功能分为以下4种:

    filter: 过滤功能,定义是否允许通过防火墙,INPUT,OUTPUT,FORWARD都需要用到过滤的功能

    nat: 地址转换,启用connection_track模块;PREROUTING,POSTROUTINIG,FORWARD都需要用到转换的功能

    mangle: 用于对数据包相关字段的修改;PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING都可以用到

    raw: 目标是关闭nat表上启用的连接追踪功能;PREROUTING, OUTPUT都需要用到此功能

bubuko.com,布布扣

基本语法:

  iptables [-t TABLE]  COMAND CHAIN    CRETIRIA    -j TARGET

   iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标


匹配条件:

 TABLE

默认是filter

filter

过滤功能,定义是否允许通过防火墙

nat

地址转换,需要启用connection_track模块

mangle

用于对数据包相关字段的修改

raw

目标是关闭nat表上启用的连接追踪功能

 链

 

INPUT

进入本机路由后

OUTPUT

本机出来路由前

PREROUTING

进入本机路由前

POSTROUTING

出去

FORWARD

转发

 链规则

 

-A

新增一条规则,该规则增加在原规则后边,

-I

:插入一条新规则,如果没有指定规则顺序,则此规则变成第一条规则,其他规则依次为2-N         

-D

删除规则

-R

替换规则

-L

查询,list

-n:以数字格式显示主机地址和端口

-v:详细格式,vv,vvv

--line-numbers:显示规则编号

-x:exactly,不要对计数器的计数结果做单位换算,而显示其精确值。

注意:千万不要iptables -t net  -L -n  查看net 会启动链接追踪功能,

-N

new 自定义一个链,只可被调用 iptables [-t table] -N chain

-X

delete,删除自定义空链 iptables [-t table] -N chain

-E

重命名自定义链。iptables [-t table] -E old_name  new_name

-Z

zero,计数器归零。

-P

policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;

 通用匹配

 

-s 地址

指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;--src, --source

-d 地址

指定报文目标IP地址匹配的范围;  --dst, --destination

-p 协议

指定匹配报文的协议类型,一般有三种tcp, udp和icmp以及all

-i  INTERFACE

数据报文流入的接口;PREROUTING, INPUT, FORWARD 例如:eth0 ,lo 等需要与INPUT链配合

-o INTERFACE

数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING  需要于OUTPUT配合

-n

不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!

-j

 目标,后边接操作,主要操作有:接受(ACCEPT),丢弃(DROP),拒绝(REJECT),记录(LOG)。。。

ACCEPT

接受

DROP

丢弃

REJECT

拒绝

LOG

如果要记录日志,需要写在其他策略前边

SNAT

修改数据包报头来源,接受返回的数据在路由前就需要转换报头,否则会送往转换主机的内部去。

DNAT

修改数据包报头的目标项目:主要是架设服务器使用,当访问给出的外部公网地址时,可以转换为内部的服务器地址。相当于SNAT的反传送。

PNAT 

MASQERADE

主要用于ADSL拨号上网,可以自动寻找公网IP。代理。

RETURN

目标,在自定义链中无法匹配报文时,将其返回

扩展匹配

隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,需要-m指定那个模块,也可以直接使用扩展专用选项;

-p [-m] tcp:

   --sport PORT[-PORT]: 指定源端口,端口可以是连续的范围port-port

   --dport PORT[-PORT]: 指定目标端口,端口可以是连续的范围port-port

   --tcp-flags 要检查的标志位列表(逗号分隔),必须为1的标志位列表(逗号分隔)

           例如:--tcp-flags syn,ack,rst,syn

-p [-m] udp:

   --sport PORT[-PORT]: 指定源端口,端口可以是连续的范围port-port

   --dport PORT[-PORT]: 指定目标端口,端口可以是连续的范围port-port

-p [-m] icmp:

   --icmp-type:后边必须要接ICMP的数据包类型,也可以使用代号。

      0: echo-reply, ping响应

      8: echo-request, ping请求

-p all

  三种xie

-m 

显式扩展:必须明确说明使用哪个模块进行扩展,需要-m指定那个模块,而后才能使用其扩展专用选项;

multiport

多端口匹配!可取反
   [!] --source-ports,或 --soprt port[,prot:port]
   --destination-ports,或 --dports
   --ports
例子: 
        # iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT 
        # iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT

iprange

匹配指定范围内的地址,!可取反

   [!] --src-range IP[-IP]

   [!] --dst-range IP[-IP]

例子:

       # iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT

       # iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

string

字符串匹配,能够检测报文应用层中的字符串
字符匹配算法:kmp,bm
专用选项:
   --algo {kmp|bm}
   --string "STRING"
   --hex-string  "HEX_STRING" :HEX_STRING为编码成16进制格式的字串
例子:
      # iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP

time

基于时间做访问控制
专用选项:
   --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
   --datestop
   --timestart hh:mm[:ss]
   --timestop hh:mm[:ss]
   --weekdays day[,day]
例子:
       # iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT 

connlimit

连接数限制,对每IP所能够发起并发连接数做限制;
专用选项:
   [!]--connlimit-above N        小于N的连接数允许,大于拒绝
例子:
       #iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit

速率限制,

专用选项:

   --limit n[/second|/minute|/hour|/day]

   --limit-burst n   一次多放几个

例子:

       # iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

state

 --state  
状态检查
连接追踪中的状态检查:
   NEW:新建立一个会话
   ESTABLISHED:已建立的连接
   RELATED:有关联关系的连接
   INVALID:无法识别的连接
   /proc/sys/net/nf_conntrack_max:调整连接追踪功能所能容纳的连接的最大数目
   /proc/net/nf_conntrack:当前追踪的所有连接
   /proc/sys/net/netfilter/*:不同协议或连接类型追踪时的属性
放行被动模式下的FTP服务:
   1,装在模块/lib/modules/KERNER_VERSION/kernel/net/netfilter/
      模块:nf_conntrack_ftp
   2,放行请求报文:
      (1)放行NEW状态对21端口请求的报文
      (2)放行ESTABLISHED以及RELATED状态的报文
   3,旅行相应报文:
      (1)放行ESTABLISHED以及RELATED状态的报文

mac

网卡硬件地址:
选项参数:--mac-source 来源诸暨的MAC
例子:
   #iptables -A INPUT -m mac 




查看iptables的规则:

iptables [-t tables] [-L] [-nv] 

[root@www~]# iptables -L -nv  
  
Chain INPUT (policy ACCEPT 131K packets, 15M bytes)                                 Chain表示这就是INPUT链,policy是默认规则ACCEPT接受   
 
pkts bytes target prot opt in out source destination 
   
   
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)                                    Chain表示这就是OUTPUT链,policy是默认规则ACCEPT接受    

pkts bytes target prot opt in out source destination  
  
  
Chain OUTPUT (policy ACCEPT 7962 packets, 1472K bytes)                              Chain表示这就是FORWARD链,policy是默认规则ACCEPT接受  
  
pkts bytes target prot opt in out source destination


  -L -v选项各项含义:     

pkts

bytes  

target

  prot 

 opt 

   in      

   out  

source  

 destination

 包数 

字节数 

 目标

   协议

 

 流入的接口

流出的接口

   源地址

目标地址


设置iptables的默认策略

iptables [-t tables] -P [INPUT|OUTPUT|FORWARD] [ACCEPT|DROP|REJECT]

[root@www ~]# iptables -P FORWARD DROP

[root@www ~]# iptables -L -n    

Chain INPUT (policy ACCEPT)    

target prot opt source destination  
  
  
Chain FORWARD (policy DROP)                                FORWARD的默认策略变为DROP  
 
target prot opt source destination  
  
  
Chain OUTPUT (policy ACCEPT)    

target prot opt source destination


创建一条新的规则链基于IP

iptables [-AI 链名] [-io 网络接口] [-p 协议]  [-s 来源 IP/网域] [-d 目标 IP/网域] -j [ACCEPT|DROP|REJECT|LOG]

例子:我们创建一条拒绝192.168.1.111的IP通过eth0网口来访问本机  
bubuko.com,布布扣    


创建一条新的规则链基于端口

iptables [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源 IP/网域] [--sport 端口范围] [-d 目标 IP/网域] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]

例子:我们创建一条不许tcp协议网段为172.16.0.0的来访问本机的80端口。

iptables -A INPUT -p tcp -s 172.16.0.0/16 -d 192.168.1.123 --dport 80 -j DROP

bubuko.com,布布扣

也可以基于数据包类型:-p imcp

iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT

常用的有 0: echo-reply, ping响应 、 8: echo-request, ping请求

拒绝被别人ping的话可以:

[root@www~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP       拒绝ping插入第一条   
 
[root@www~]# iptables -L -nv 
   
Chain INPUT (policy DROP 0 packets, 0 bytes)    

pkts bytes target prot opt in out source destination  
  
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8   
 
0 0 DROP all -- eth0 * 192.168.1.111 192.168.1.123   
 
0 0 DROP tcp -- * * 172.16.0.0/16 192.168.1.123 tcp dpt:80  
  
628 46744 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22   
 
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED   
 
 
Chain FORWARD (policy DROP 0 packets, 0 bytes) 
   
pkts bytes target prot opt in out source destination 

   
Chain OUTPUT (policy ACCEPT 17 packets, 1564 bytes)  
  
pkts bytes target prot opt in out source destination


创建一条新规则基于状态

iptables -A INPUT [-m state] [--state 状态]

例子:创建一条规则,进入本机已建立的会话和与会话有关联关系的给与放行,其他的全拒绝

iptables -A INPUT -m state  --state RELATED,ESTABLISHED -j ACCEPT

当然如果你在远程连接本机的话,你需要先放行自己的SSH会话,再将默认INPUT设为DROP,最后放行上边这条规则。

[root@www~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT    

[root@www~]# iptables -P INPUT DROP

bubuko.com,布布扣


创建一条自定义防火墙规则。

iptables [-t table] -N Chain

自定义链只可被应用。

iptables -t filter -N WEBChain

并被tcp 80端口出去的调用此规则。规则是拒绝192.168.1.123从tcp 80端口出去。

bubuko.com,布布扣



做SNAT转发,修改数据包来源报头:主要应付内部主机连接外网的方式

内部请求出去时:客户端所发出的封包表头中,来源会是172.16.18.5,然后传送到 NAT 这部主机; NAT 这部主机的内部接口 (172.16.18.6) 接收到这个封包后,会主动分析表头数据, 因为表头数据显示目的并非本机,所以开始经 过路由, 将此封包转到公网 IP 处(192.168.1.123); 主机透过 iptables 的 NAT table 内的 Postrouting 链将封包表头的来源伪装成为本机公网IP ,并且将两个不同来源 (172.16.18.5 及 公网IP) 的封包对应写入暂存内存当中, 然后将此封包传送出去了;

接受返回数据包时:在 Internet 上面的主机接到这个封包时,会将响应数据传送给那个公网IP的主机;当 NAT 服务器收到来自 Internet 的数据后,会分析该数据包的序号,并比对刚刚记录到内存当中的数据, 由于发现该封包为后端主机之前传送出去的,因此在 NAT Prerouting 链中,会将目标 IP 修改成为后端主机(172.16.18.5),然后发现目标已经不是本机, 所以开始透过路由分析封包流向;将数据传送到172.16.18.6 这个内部接口,然后再传送到最终目标主机上去!

bubuko.com,布布扣


做DNAT转发:内部作为服务器让外部网络访问。也就是目标地址转化

外部主机想要连接到目的端的WEB服务,则必须要连接到我们的 NAT 服务器上; 我们的 NAT 服务器设定 port 80转发 ,所以当 NAT 服务器接到这个封包后(源地址192.168.1.34|目标地址192.168.1.123), 会将目标地址在PREROUTING转为172.16.18.5,源地址不变 ,且将该封包相关信息记录下来,等待内部服务器的响应;172.16.18.5 会响应数据给192.168.1.34 ,当这个响应经过POSTROUTING时伪装源地址为192.168.1.123,目标地址不变(192.168.1.34)传送出去!

bubuko.com,布布扣


RAW表    

RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了. RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。 实际测试发现filter链仍然处理一些NOTRACK的包,但没有进行connect tracking,所以filter链条里必须将UNTRACKED状态的包放行

iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。

  所以解決方法一般有两个:

  (1) 加大 ip_conntrack_max 值
  
  
  vi /etc/sysctl.conf
  
  net.ipv4.ip_conntrack_max = 393216
  
  net.ipv4.netfilter.ip_conntrack_max = 393216
  
  
  (2): 降低 ip_conntrack timeout时间
  
  vi /etc/sysctl.conf
  
  net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
  
  net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
  
  net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
  
  net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120


写防火墙规则时要注意:

(1)服务端:先进后出

(2)客户端:先出后进

(3)客户端端口是随机的,因此大多数场景下无须限定

iptables --> 语法检查 --> netfilter

规则立即生效

切记:先添加放行自己会话

规则文件:/etc/sysconfig/iptables (iptables文件可能不存在)

    保存启用中的规则于规则文件中:

    1、# iptables-save > /etc/sysconfig/iptables

    2、# service iptables save

    生效规则文件中的规则:

    1、# iptables-restore < /etc/sysconfig/iptables

    2、# service iptables restart

执行的操作:清空现有规则,读取并生效规则文件中的规则


防火墙简单设计:

(1)规则清零:清除所有已有规则 (iptables -F)

(2)设置默认策略:INPUT自定义链为DROP ,其他的默认ACCEPT.

(3)信任本机:由于lo对本机来说是相当重要的,因此lo必须设置为信任设备

(4)回应数据包:让本机发出的请求的相应包可以进入本机。(ESTABLISHED,RELATED)

(5)信任用户:给出你需要信任的用户,也可以没有。

写一个bash脚本来执行自己的防火墙规则

#vim iptablescript.sh

#!/bin/bash
#

#1,清除规则
iptables -F
iptables -Z

#2,设置默认策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#3,制定各项规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 172.16.0.0/16  -j ACCEPT

#4,写入防火墙配置文件。
service iptables save
#或者 iptables-save > /etc/sysconfig/iptables(文件可能不存在)

#一个简单的防御防火墙

*ftp服务21号端口开启时开放RELATED关联时,必须装载nf_conntrack_ftp 

转自:http://theneverland.blog.51cto.com/10714090/1739970/

一、防火墙简述

防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网(US5606668(A)1993-12-15)。它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。

所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。

在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络。换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信。

概括一句话:防火墙是一种工作于主机或网络的边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,并对能够被规则匹配到报文作出相应处理的隔离工具。



二、netfilter/iptables

netfilter/iptables是在linux2.4+内核版本上特有的包过滤型防火墙。其中netfilte位于内核空间,iptables位于用户空间,二者通过ip_tables模块来完成封包过滤、封包重定向和网络地址转换(NAT)等一系列的功能。


wKiom1ap5O6wJZY0AAH2JVh9afc246.png


1、iptables的基础概念

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

内置链有:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

每个表的对应链如下:

filter:INPUT、FORWARD、OUTPUT

nat:PREROUTING,INPUT(CentOS7+)、OUTPUT、POSTROUTING

mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

raw:PREOUTING、



2、iptables传输数据包的过程

wKioL1ap60GA2fvWAAQCLgnnIf4987.png

a、当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

b、如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

c、如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。


简单的报文流向:

流入本机:PREROUTING-->INPUT

由本机流出:OUTPUT-->POSTROUTING

转发:PREROUTING-->FORWARD-->POSTROUTING



三、iptables命令

规则格式:iptables [-t tables] COMMAND chain [rules]|[-m matchname [per-match-options]] -j targetname [per-target-options]

table:表选项

COMMAND:对链的操作命令

chain:链名

rules:匹配的条件

matchname:显示扩展加载的模块名

per-match-options:扩展模块的选项

targetname:处理动作

per-target-options:处理动作的选项


1、table

其选项有filter、nat、raw、mangle,不同的表对应不同的功能,常用的表为filter和nat,默认为filter表。


2、COMMAND

-L:list,显示当前链上的所有规则

  -n:以数字格式显示地址和端口号

  -v:显示详细信息

  -x:显示计数器结果的精确数值(每条规则都有2个计数器,分别用来计算报文个数和报文大小之和,需和-v一起使用)

  --line-number:显示规则的序号

1
2
3
4
5
6
7
8
9
10
[root@localhost ~] # iptables -L -n -x -v --line-number
Chain INPUT (policy ACCEPT 349 packets, 32318 bytes)
num      pkts      bytes target     prot opt  in      out      source                destination         
1         119     9996 DROP       all  --  *      *       172.16.7.20          172.16.7.22         
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num      pkts      bytes target     prot opt  in      out      source                destination         
 
Chain OUTPUT (policy ACCEPT 192 packets, 17840 bytes)
num      pkts      bytes target     prot opt  in      out      source                destination


-N:new,新建一条自定义链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~] # iptables -N TEST
[root@localhost ~] # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
DROP       all  --  172.16.7.20          172.16.7.22         
 
Chain FORWARD (policy ACCEPT)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination         
 
Chain TEST (0 references)
target     prot opt  source                destination


-X:delete,删除自定义的规则链,不指明则清空所有自定义链

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # iptables -X TEST
[root@localhost ~] # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
DROP       all  --  172.16.7.20          172.16.7.22         
 
Chain FORWARD (policy ACCEPT)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-P:policy,设置默认链的策略;对filter表来说其默认策略有:ACCEPT、DROP、REJECT(使用ssh登录时注意不能乱改)

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # iptables -P FORWARD DROP
[root@localhost ~] # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
DROP       all  --  172.16.7.20          172.16.7.22         
 
Chain FORWARD (policy DROP)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-E:重命名自定义链


-A:append,追加一条规则

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
DROP       all  --  172.16.7.20          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 
 
Chain FORWARD (policy DROP)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-I:insert,插入一条规则,不指明位置时默认为第一条

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~] # iptables -I INPUT -s 172.16.7.21 -d 172.16.7.22 -p 22 -j ACCEPT
[root@localhost ~] # iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
ACCEPT     22   --  172.16.7.21          172.16.7.22         
DROP       all  --  172.16.7.20          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 
 
Chain FORWARD (policy DROP)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-D:delete,删除一条规则

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~] # iptables -D INPUT 1
[root@localhost ~] # iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
DROP       all  --  172.16.7.20          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 
 
Chain FORWARD (policy DROP)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-R:replace,替换指定的链上的规则

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~] # iptables -R INPUT 1 -s 172.16.7.21 -d 172.16.7.22 -p 22 -j ACCEPT
[root@localhost ~] # iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
ACCEPT     22   --  172.16.7.21          172.16.7.22         
REJECT     all  --  172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 
 
Chain FORWARD (policy DROP)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-F:flush,清空指定的链上的规则,不指明则清空全部

1
2
3
4
5
6
7
8
9
10
[root@localhost ~] # iptables -F INPUT 
[root@localhost ~] # iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt  source                destination         
 
Chain FORWARD (policy DROP)
target     prot opt  source                destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt  source                destination


-Z:zero,将规则的计数器置零

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~] # iptables -Z
[root@localhost ~] # iptables -L -v
Chain INPUT (policy ACCEPT 8 packets, 590 bytes)
  pkts bytes target     prot opt  in      out      source                destination         
     0     0 REJECT     all  --  any    any     172.16.7.21          172.16.7.22         reject-with icmp-port-unreachable 
 
Chain FORWARD (policy DROP 0 packets, 0 bytes)
  pkts bytes target     prot opt  in      out      source                destination         
 
Chain OUTPUT (policy ACCEPT 4 packets, 400 bytes)
  pkts bytes target     prot opt  in      out      source                destination


3、chain

链分为内置链和自定义链。

内置链有5种,分别为PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,对应于netfilter上的hook函数。

自定义链是对内置链的扩展和补充,可以实现更加灵活的规则管理机制。


在添加规则时,一般从实现的功能和报文流经的路径2方面考虑。与此同时,链上的规则次序也是检查的次序,其中隐含着一定的应用法则:

a、同类规则(访问同一应用),匹配范围小的放上面

b、不同类的规则(访问不同应用),匹配到报文频率较大的放在上面

c、将那些可由一条规则描述的多个规则合并起来

d、设置默认策略


4、rules

a、基本匹配条件:不需要加载额外模块,由iptables/netfilter自行提供

[!] -s, --source  address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围

[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围

[!] -p, --protocol protocol:检查报文的中IP地址的端口是否符合此处指定的地址或范围

protocol:tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all"

1
2
[root@localhost ~] # iptables -A INPUT -s 172.16.7.20 -d 172.16.7.22 -p icmp -j DROP      
#将172.16.7.20主机p发送给172.16.7.22主机的icmp包全部丢弃,即禁ping


[!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;

[!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;

b、扩展匹配条件:需要事先加载扩展模块,才能生效。其分为隐式扩展和显式扩展。


隐式扩展:是对协议的扩展,不需要手动加载模块,只要用-p指明了协议,即自动表明了要扩展的模块,常用的有tcp、udp、icmp。

a、tcp:

[!] --source-port,--sport port[:port]:匹配报文的源端口;可以是端口范围         

[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围


b、udp:

[!] --source-port,--sport port[:port]:匹配报文的源端口;可以是端口范围 

[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围


c、icmp:

[!] --icmp-type {type[/code]|typename}:匹配icmp报文的类型

     echo-request:8(请求报文)

     echo-reply:0(回应报文)

1
2
[root@localhost ~] # iptables -A OUTPUT -d 172.16.7.20 -s 172.16.7.22 -p icmp --icmp-type 0 -j REJECT
#拒绝所有从172.16.7.22主机出来到172.16.7.20主机的icmp的回复报文


显示扩展:必须要手动加载才能实现多种功能的模块。

a、multiport扩展

以离散方式定义多端口匹配,最多指定15个端口

[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口

[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口

[!] --ports port[,port|,port:port]...:指明多个端口

1
2
[root@localhost ~] # iptables -A INPUT -s 172.16.7.20 -d 172.16.7.22 -p tcp -m multiport --dports 20,22 -j REJECT
#在INPUT链上拒绝所有从172.16.7.20主机发送到172.16.7.22主机的需要调用20(ftp)和22(ssh)端口的tcp报文。


b、iprange扩展

指明连续的(但一般不是整个网络)ip地址范围

[!] --src-range from[-to]:源IP地址范围

[!] --dst-range from[-to]:目标IP地址范围

1
2
[root@localhost ~] # iptables -A INPUT -m iprange --src-range 172.16.7.20-172.16.7.100 -d 172.16.7.22 -j REJECT
##在INPUT链上拒绝所有从172.16.7.20主机到172.16.7.100主机范围地址内的主机发送到172.16.7.22主机的所有报文。


c、string扩展

对报文中的应用层数据做字符串模式匹配检测

--algo {bm|kmp}:字符串匹配检测算法

[!] --string pattern:要检测的字符串模式

[!] --hex-string pattern:要检测的字符串模式,16进制格式

1
2
[root@localhost ~] # iptables -A OUTPUT -m string --algo bm --string 1989 -j REJECT
#拒绝所有包含字符1989的报文从OUTPUT链上发出去


d、time扩展(与逻辑)

根据将报文到达的时间

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

--kerneltz:使用内核上的时区,而非默认的UTC

1
2
[root@localhost ~] # iptables -A INPUT -d 172.16.7.22 -m time --timestart 8:00 --timestop 17:30 -j REJECT
#在8:00-17:30时间内,拒绝所有到达172.16.7.22主机的报文


e、connlimit扩展

根据每客户端单IP做并发连接数量匹配

--connlimit-upto n:连接的数量小于等于n时匹配(CentOS7新增选项)

--connlimit-above n:连接的数量大于n时匹配

1
2
[root@localhost ~] # iptables -A INPUT -s 172.16.7.20 -d 172.16.7.22 -m connlimit --connlimit-above 2  -j REJECT
#从172.16.7.20主机发送到172.16.7.22主机的报文同时最多不能超过2个,否则拒绝


f、limit扩展

基于收发报文的速率做匹配

令牌桶过滤器:

--limit rate[/second|/minute|/hour|/day]:平均允许

--limit-burst number:峰值允许(第一次)

1
2
[root@localhost ~] # iptables -A INPUT -d 172.16.7.22 -t icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
#发送到172.16.7.22主机的icmp发送请求每分钟不超过3个,峰值最大为5个


g、state扩展(conntrack)

根据”连接追踪机制“去检查连接的状态

conntrack机制:追踪本机上的请求和响应之间的关系;状态有以下几种:

NEW:新发出请求;连接追踪模版中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求

ESTABLISHED:NEW状态之后,连接追踪模版中为其建立的条目失效之前期间内所进行的通信状态

RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系(第一次)nf_conntrack_ftp)

INVALID:无效的连接

UNTRACKED:未进行追踪的连接


[!] --state state

1
2
3
4
[root@localhost ~] # iptables -A INPUT -d 172.16.7.22 -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
#只允许状态为NEW和ESTABLISHED的tcp包到达172.16.7.22的主机
[root@localhost ~] # iptables -A OUTPUT -s 172.16.7.22 -p tcp -m state --state ESTABLISHED -j ACCEPT
#只允许状态为ESTABLISHED的tcp包从172.16.7.22的主机输出


5、target

target=-j targetname [per-target-options]

表示对该匹配条件的处理动作,常用的有以下几种:

ACCEPT:接受数据包

DROP:丢弃数据包

REJECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息

REDIRECT:端口重定向

RETURN:返回调用链

SNAT:源地址转换,即改变数据包的源地址

DNAT:目标地址转换,即改变数据包的目的地址

MASQUERADE:IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT

LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错

MARK:进行防火墙标志



四、iptables的nat应用

1、nat简介

NAT:Network Address Translation,即网络地址转换。它是一个IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet地址和私有IP地址的使用。


2、nat的类型

常见的NAT有SNAT、DNAT和PNAT。

SNAT:source nat,即源地址转换。用于让本地网络中的主机通过某一特定的地址访问外部网络,主要在POSTROUTING和OUTPUT上。

DNAT:destination nat,即目标地址转换。用于让本地网络中的某一主机的某服务开放给外部网络的用户访问时,主要在PREROUTING上


3、nat的相关命令

作为iptables的功能表之一,nat的要点主要在于处理动作上:

a、SNAT

--to-source [ipaddr[-ipaddr]][:port[-port]]

--random

1
2
[root@localhost ~] # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.7.22
#任何从192.168.1.0/24发来的包在经过本机转发出去时都会把包的源IP改为172.16.7.22(需在内核启动转发功能)


b、DNAT

--to-destination [ipaddr[-ipaddr]][:port[-port]]

1
2
[root@localhost ~] # iptables -t nat -A PREROUTING -d 172.16.7.22 -j DNAT --to-destination 172.16.7.20
#将发送到172.16.7.22主机的包直接转发给172.16.7.20主机


c、MASQUERADE

1
2
[root@localhost ~] # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
#将从192.168.1.0/24网段的包的源地址自动转换地址后从本机转发出去


转自:http://blog.csdn.net/andy_yf/article/details/7730525

防火墙的简介
防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。它通过访问控制机制,确定哪些内部服务允许外部访问,以及允许哪些外部请求可以访问内部服务。它可以根据网络传输的类型决定IP包是否可以传进或传出内部网。
防火墙通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序进行一一比较,直到满足其中的一条规则为止,然后依据控制机制做出相应的动作。如果都不满足,则将数据包丢弃,从而保护网络的安全。
防火墙可以被认为是这样一对机制:一种机制是拦阻传输流通行,另一种机制是允许传输流通过。一些防火墙偏重拦阻传输流的通行,而另一些防火墙则偏重允许传输流通过。

通过使用防火墙可以实现以下功能:可以保护易受攻击的服务;控制内外网之间网络系统的访问;集中管理内网的安全性,降低管理成本;提高网络的保密性和私有性;记录网络的使用状态,为安全规划和网络维护提供依据。(图1)

图片1

防火墙的分类
防火墙技术根据防范的方式和侧重点的不同而分为很多种类型,但总体来讲可分为包过滤防火墙和代理服务器两种类型。

防火墙的工作原理
1.包过滤防火墙工作原理(图2)
图片2

2.代理服务型防火墙工作原理
代理服务型防火墙是在应用层上实现防火墙功能的。它能提供部分与传输有关的状态,能完全提供与应用相关的状态和部分传输的信息,它还能处理和管理信息。

iptables简介
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

iptables基础
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

Iptables表、链、规则(图3)
图片3

iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。(图4)
图片4

iptables命令格式

iptables的命令格式较为复杂,一般的格式如下:
iptables [-t table] 命令 [chain] [rules] [-j target]
table——指定表明
命令——对链的操作命令
chain——链名
rules——规则
target——动作如何进行
1.表选项
表选项用于指定命令应用于哪个iptables内置表,iptables内置包括filter表、nat表、mangle表和raw表。
2.命令选项iptables命令格式

命令                     说明
-P或–policy  <链名>     定义默认策略
-L或–list  <链名>     查看iptables规则列表
-A或—append  <链名>     在规则列表的最后增加1条规则
-I或–insert  <链名>     在指定的位置插入1条规则
-D或–delete  <链名>     从规则列表中删除1条规则
-R或–replace  <链名>     替换规则列表中的某条规则
-F或–flush  <链名>     删除表中所有规则
-Z或–zero  <链名>     将表中数据包计数器和流量计数器归零

3.匹配选项
匹配                                     说明
-i或–in-interface  <网络接口名>     指定数据包从哪个网络接口进入,如ppp0、eth0和eth1等
-o或–out-interface  <网络接口名>     指定数据包从哪块网络接口输出,如ppp0、eth0和eth1等
-p或—proto协议类型  < 协议类型>     指定数据包匹配的协议,如TCP、UDP和ICMP等
-s或–source  <源地址或子网>             指定数据包匹配的源地址
–sport <源端口号>                     指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
-d或–destination  <目标地址或子网>     指定数据包匹配的目标地址
–dport目标端口号                     指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口

4.动作选项
动作        说明
ACCEPT        接受数据包
DROP        丢弃数据包
REDIRECT   与DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息。
SNAT        源地址转换,即改变数据包的源地址
DNAT        目标地址转换,即改变数据包的目的地址
MASQUERADE IP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT
LOG        日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错

iptables命令格式(图5)
图片5

iptables过滤条件(图6)
图片6

iptables的语法

1.定义默认策略
当数据包不符合链中任一条规则时,iptables将根据该链预先定义的默认策略来处理数据包,默认策略的定义格式如下。
iptables  [-t表名] <-P> <链名> <动作> ?参数说明如下。
[-t表名]:指默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
<-P>:定义默认策略。
<链名>:指默认策略将应用于哪个链,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING。
<动作>:处理数据包的动作,可以使用ACCEPT(接受数据包)和DROP(丢弃数据包)。

2.查看iptables规则
查看iptables规则的命令格式为:
iptables  [-t表名] <-L> [链名]
参数说明如下。
[-t表名]:指查看哪个表的规则列表,表名用可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认查看filter表的规则列表。
<-L>:查看指定表和指定链的规则列表。
[链名]:指查看指定表中哪个链的规则列表,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING,如果不指明哪个链,则将查看某个表中所有链的规则列表。

3.增加、插入、删除和替换规则
相关规则定义的格式为:
iptables  [-t表名]  <-A | I | D | R> 链名 [规则编号] [-i | o 网卡名称] [-p 协议类型] [-s 源IP地址 | 源子网] [--sport 源端口号] [-d目标IP地址 | 目标子网] [--dport目标端口号] <-j动作>
参数说明如下。
[-t表名]:定义默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
-A:新增加一条规则,该规则将会增加到规则列表的最后一行,该参数不能使用规则编号。
-I:插入一条规则,原本该位置上的规则将会往后顺序移动,如果没有指定规则编号,则在第一条规则前插入。
-D:从规则列表中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。
-R:替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号。
<链名>:指定查看指定表中哪个链的规则列表,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING。
[规则编号]:规则编号用于插入、删除和替换规则时用,编号是按照规则列表的顺序排列,规则列表中第一条规则的编号为1。
[-i | o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出。网卡名称可以使用ppp0、eth0和eth1等。
[-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP和ICMP等。
[-s 源IP地址 | 源子网]:源主机的IP地址或子网地址。
[--sport 源端口号]:数据包的IP的源端口号。
[-d目标IP地址 | 目标子网]:目标主机的IP地址或子网地址。
[--dport目标端口号]:数据包的IP的目标端口号。
<-j动作>:处理数据包的动作,各个动作的详细说明可以参考前面的说明。

4.清除规则和计数器
在新建规则时,往往需要清除原有的、旧的规则,以免它们影 ?响新设定的规则。如果规则比较多,一条条删除就会十分麻烦, ?这时可以使用iptables提供的清除规则参数达到快速删除所有的规 ?则的目的。
定义参数的格式为:
iptables  [-t表名] <-F | Z>
参数说明如下。
[-t表名]:指定默认策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定使用哪个表,iptables就默认使用filter表。
-F:删除指定表中所有规则。
-Z:将指定表中的数据包计数器和流量计数器归零。

NAT的定义
NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址的使用。

NAT的类型

静态NAT(Static NAT)
静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。

动态地址NAT(Pooled NAT)
动态地址NAT是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。
动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。

网络地址端口转换NAPT(Port-Level NAT)
NAPT是把内部地址映射到外部网络的一个IP地址的不同端口上。
最熟悉的一种转换方式。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。

iptables实例

禁止客户机访问不健康网站
【例1】添加iptables规则禁止用户访问域名为www.sexy.com的网站。
iptables -I FORWARD -d www.sexy.com -j DROP
【例2】添加iptables规则禁止用户访问IP地址为20.20.20.20的网站。
iptables -I FORWARD -d 20.20.20.20 -j DROP

禁止某些客户机上网
【例1】添加iptables规则禁止IP地址为192.168.1.X的客户机上网。
iptables -I FORWARD -s 192.168.1.X -j DROP
【例2】添加iptables规则禁止192.168.1.0子网里所有的客户机上网。
iptables -I FORWARD -s 192.168.1.0/24 -j DROP

禁止客户机访问某些服务
【例1】禁止192.168.1.0子网里所有的客户机使用FTP协议下载。
iptables -I FORWARD -s 192.168.1.0/24 -p tcp –dport 21 -j DROP
【例2】禁止192.168.1.0子网里所有的客户机使用Telnet协议连接远程计算机。
iptables -I FORWARD -s 192.168.1.0/24 -p tcp –dport 23 -j DROP

强制访问指定的站点
【例】强制所有的客户机访问192.168.1.x这台Web服务器。
iptables -t nat -I PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.x:80

禁止使用ICMP协议
【例】禁止Internet上的计算机通过ICMP协议ping到NAT服务器的ppp0接口,但允许内网的客户机通过ICMP协议ping的计算机。
iptables -I INPUT -i ppp0 -p icmp -j DROP

发布内部网络服务器
【例1】发布内网10.0.0.3主机的Web服务,Internet用户通过访问防火墙的IP地址即可访问该主机的Web服务。
iptables -t nat -I PREROUTING -p tcp –dport 80 -j DNAT –to-destination 10.0.0.3:80
【例2】发布内网10.0.0.3主机的终端服务(使用的是TCP协议的3389端口),Internet用户通过访问防火墙的IP地址访问该机的终端服务。
iptables -t nat -I PREROUTING -p tcp –dport 3389 -j DNAT –to-destination 10.0.0.3:3389

案例详解
【案例1】做为客户端/终端的基本配置 ?DNS PING LO
【案例2】做为服务端的基本配置:SSH  DNS WWW FTP EMAIL (图7)
图片7
【案例3】做为网关的基本配置:SSH  DNS WWW FTP EMAIL NAT )SNAT DNAT)限速 (图8)
图片8
【案例4】状态检测(图9)
图片9


iptables超全详解

前提基础:

当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。

iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。

iptables中定义有5条链,说白了就是上面说的5个钩子函数,因为每个钩子函数中可以定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包

iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw-->mangle-->nat-->filter

一条链上可定义不同功能的规则,检查数据包时将根据上面的优先级顺序检查

wKiom1fD9SHiFulVAAFG31wO9vs466.png

(图片来源网络)

小结一下~~~

wKioL1fD-LzQLXN1AACb9oWWVug429.png

数据包先经过PREOUTING,由该链确定数据包的走向:

    1、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;

    2、若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥

主机发送数据包时,流程则是⑤--->⑥

iptables安装配置

linux一般默认都已经安装iptables,只需要开启服务即可

1
service iptables start

iptables规则书写

基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作]

说明支持的链
raw一般是为了不再让iptables对数据包进行跟踪,提高性能PREROUTING、OUTPUT
mangle对数据包进行修改五个链都可以
nat进行地址转换PREROUTING、OUTPUT、POSTROUTING
filter(默认)对包进行过滤INPUT、FORWARD、OUTPUT

常用操作命令

说明
-A在指定链尾部添加规则
-D删除匹配的规则
-R替换匹配的规则
-I

在指定位置插入规则

例:iptables -I INPUT 1 --dport 80 -j ACCEPT

(将规则插入到filter表INPUT链中的第一位上)

-L/S列出指定链或所有链的规则
-F

删除指定链或所有链的规则

-N

创建用户自定义链

例:iptables -N allowed

-X

删除指定的用户自定义链

-P

为指定链设置默认规则策略,对自定义链不起作

例:iptables -P OUTPUT DROP

-Z将指定链或所有链的计数器清零
-E

更改自定义链的名称

例:iptables -E allowed disallowed

-n

ip地址和端口号以数字方式显示

例:iptables -Ln

常见规则匹配器说明
-p tcp|udp|icmp|all匹配协议,all会匹配所有协议
-s addr[/mask]匹配源地址
-d addr[/mask]匹配目标地址
--sport port1[:port2]匹配源端口(可指定连续的端口)
--dport port1[:port2]匹配目的端口(可指定连续的端口)
-o interface

匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。

例:iptables -A FORWARD -o eth0

-i interface

匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。

--icmp-type 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型)
--tcp-flags mask comp

匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。

例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT

(表示匹配SYN和ACK标记的数据包)

目标动作说明
ACCEPT允许数据包通过
DROP丢弃数据包
REJECT丢弃数据包,并且将拒绝信息发送给发送方
SNAT

源地址转换(在nat表上)

例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 

DNAT

目标地址转换(在nat表上)

例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102

REDIRECT

目标端口转换(在nat表上)

例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80

MARK

将数据包打上标记

例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60

注意要点:

    1、目标地址转换一般在PREROUTING链上操作

    2、源地址转换一般在POSTROUTING链上操作

 

保存和恢复iptables规则

    使用iptables-save可以保存到特定文件中

1
    iptables-save > /etc/sysconfig/iptables_save

    使用iptables-restore可以恢复规则

1
    iptables-restore< /etc/sysconfig/iptables_save

iptables的进阶使用

   1、limit限制流量:

        -m limit --limit-burst 15        #设置一开始匹配的最���数据包数量

        -m limit --limit 1000/s            #设置最大平均匹配速率

        -m limit --limit 5/m --limit-burst 15     #表示一开始能匹配的数据包数量为15个,每匹配到一个,   

                                                                    limit-burst的值减1,所以匹配到15个时,该值为0,以后每过   

                                                                    12s,limit-burst的值会加1,表示又能匹配1个数据包

例子:

1
2
iptables -A INPUT -i eth0 -m limit --limit 5 /m  --limit-burst 15 -j ACCEPT 
iptables -A INPUT -i eth0 -j DROP

    注意要点:

        1、--limit-burst的值要比--limit的大

        2、limit本身没有丢弃数据包的功能,因此,需要第二条规则一起才能实现限速的功能

    2、time :在特定时间内匹配

-m time 说明
--monthdays day1[,day2]在每个月的特定天匹配
--timestart hh:mm:ss在每天的指定时间开始匹配
--timestop hh:mm:ss在每天的指定时间停止匹配
--weekdays day1[,day2]在每个星期的指定工作日匹配,值可以是1-7

例子:

1
2
iptables -A INPUT -i eth0 -m  time  --weekdays 1,2,3,4 -jACCEPT
iptables -A INPUT -i eth0 -j DROP

    3、ttl:匹配符合规则的ttl值的数据包

参数说明
--ttl-eq 100匹配TTL值为100的数据包
--ttl-gt 100匹配TTL值大于100的数据包
--ttl-lt 100匹配TTL值小于100的数据包

例子:

1
iptables -A OUTPUT -m ttl --ttl- eq  100 -j ACCEPT

    4、multiport:匹配离散的多个端口

参数说明
--sports port1[,port2,port3]匹配源端口
--dports port1[,port2,port3]匹配目的端口
--ports port1[,port2,port3]匹配源端口或目的端口

例子:

1
iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP

   

    5、state:匹配指定的状态数据包

参数说明
--state valuevalue可以为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知连接)

例子:

1
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

    6、mark:匹配带有指定mark值的数据包

参数说明
--mark value匹配mark标记为value的数据包

例子:

1
iptables -t mangle -A INPUT -m mark --mark 1 -j DROP

    7、mac:匹配特定的mac地址

例子:

1
iptables -A FORWARD -m mac --mac- source  00:0C:24:FA:19:80 -j DROP



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值