首页 > 代码库 > iptables防火墙介绍+实战

iptables防火墙介绍+实战

第1章 iptables防火墙简介

Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台非常低的硬件配置下跑的非常好。iptables+zebra+squid

Iptables是linux2.4及2.6内核中集成的服务。其功能与安全性比其老一辈ipfwadm,ipchains强大的多,Iptables主要工作在OSI七层的二、三四层,如果重新编译内核,Iptables也可以支持7层控制(squid代理+iptables)。

1.1 iptables企业应用场景

  主机防火墙(filter表的INPUT链)

  局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。

  端口及IP(一对一)映射(nat表的PREROUTING链),硬防的NAT功能。

1.2 iptables的工作流程

iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。

1.2.1 iptables工作流程小结

1、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。

2、如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。

3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。

4、防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。

1.3 基于安全基本优化

1.尽可能不给服务器配置外网IP,可以通过代理转发或者通过防火墙映射。

2.并发不是特别大情况再外网IP的环境,要开启iptables防火墙。

1.4 iptables的规则表和链

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

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

       Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。

1.4.1 规则表

  filter表——三个链:INPUT、FORWARD、OUTPUT

作用:过滤数据包  内核模块:iptables_filter.

  Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT

作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

  Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

  Raw表——两个链:OUTPUT、PREROUTING

作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw

1.4.2 规则链

  INPUT——进来的数据包应用此规则链中的策略

  OUTPUT——外出的数据包应用此规则链中的策略

  FORWARD——转发数据包时应用此规则链中的策略

  PREROUTING——对数据包作路由选择前应用此链中的规则

(记住!所有的数据包进来的时侯都先由这个链处理)

  POSTROUTING——对数据包作路由选择后应用此链中的规则

1.5 规则表之间的优先顺序

规则表之间的优先顺序:

Raw——mangle——nat——filter

规则链之间的优先顺序(分三种情况)

1.5.1 第一种情况:入站数据流向

    从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

1.5.2 第二冲情况:转发数据流向

       来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。

1.5.3 第三种情况:出站数据流向

     防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

1.6 iptables的基本语法

iptables [-t 表名] 命令选项 [链名][条件匹配] [-j 目标动作或跳转]

说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹配用于指定对符合什么样 条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

1.7 iptables命令管理控制选项

-A 在指定链的末尾添加(append)一条新的规则

-D  删除(delete)指定链中的某一条规则,可以按规则序号和内容删除

-I  在指定链中插入(insert)一条新的规则,默认在第一行添加

-R  修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换

-L  列出(list)指定链中所有的规则进行查看

-E  重命名用户定义的链,不改变链本身

-F  清空(flush)

-N  新建(new-chain)一条用户自己定义的规则链

-X  删除指定表中用户自定义的规则链(delete-chain)

-P  设置指定链的默认策略(policy)

-Z 将所有表的所有链的字节和数据包计数器清零

-n  使用数字形式(numeric)显示输出结果

-v  查看规则表详细信息(verbose)的信息

-V  查看版本(version)

-h  获取帮助(help)

1.8 防火墙处理数据包的四种方式

ACCEPT 允许数据包通过

DROP 直接丢弃数据包,不给任何回应信息

REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。

LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

第2章 实战

2.1 查看系列

2.1.1 启动并查看默认规则

[root@web01 ~]# /etc/init.d/iptables start

iptables: Applying firewall rules:                         [  OK  ]

[root@web01 ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22

REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination   

2.1.2 查看顺序

[root@web01 ~]# iptables -nL --line-number

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination        

1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          

4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22

5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination        

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination 

2.1.3 查看nat表

[root@web01 ~]# iptables -nL -t nat

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination        

 

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

2.2 参数

-A -I -D

iptables [-t table] -A chain rule-specification

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

iptables [-t table] -D chain rulenum   #<==根据规则号删除。

iptables [-t table] -D chain rule-specification

注释:

-t 指定表d(efault: `filter‘)

-A  #<==把规则添加到指定的链上,默认添加到最后一行。

-I  #<==插入规则,默认插入到第一行。

-D  #<==删除链上的规则

2.2.1 根据规则号删除

iptables -D INPUT 4 #<==4是规则号。

 

-F #<==清除一个链或所有链上的规则

-Z #<==链的记数器清零

-X #<==删除用户自定义的链。

实例:

实践:

[root@web02 ~]# iptables -Z

[root@web02 ~]# iptables -X

[root@web02 ~]# iptables -F

[root@web02 ~]# iptables -nL

2.3 封22端口命令

[root@web02 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

规则注释:

-p       #<==指定过滤的协议-p(tcp,udp,icmp,all)

--dport  #<==指定目标端口(用户请求的端口)。

-j       #<==对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)

--sport #<==指定源端口。

2.4 禁止10.0.0.253访问

[root@web01 ~]# iptables -I INPUT -p tcp -s 10.0.0.253 -i eth0 -j DROP

[root@web02 ~]# iptables -A INPUT -p tcp ! -s 10.0.0.2 -i eth0 -j DROP

-s       #<==指定源地址。 ! 取反。

-d       #<==指定目的地址。

-i       #<==进入的网络接口(eth0,eth1)。

-o       #<==出去的网络接口(eth0,eth1)。

2.5 匹配端口范围

iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP

iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT

iptables -I INPUT -p tcp --dport 18:80 -j DROP  #<==最佳

2.6 匹配ICMP类型

iptables -A INPUT -p icmp --icmp-type 8

实例:

iptables -A INPUT -p icmp --icmp-type 8 -j DROP

iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT

iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT

2.7 匹配网络状态

-m state --state

    NEW:已经或将启动新的连接

    ESTABLISHED:已建立的连接

    RELATED:正在启动的新连接

    INVALID:非法或无法识别的

#允许关联的状态包 ftp协议

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

2.8 限定时间系列

2.8.1 限制指定时间的允许通过数量及并发数

-m limit --limit n/{second/minute/hour}:

2.8.2 指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时

iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min -j DROP

2.8.3 --limit-burst [n]

在同一时间内允许通过的请求"n"为数字,不指定默认为5

iptables -I INPUT -s 10.0.0.0/24 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT

2.9 部署一个最安全的企业级防火墙(案例)

修改默认规则

iptables -P INPUT DROP 

iptables -P FORWARD DROP  

iptables -P OUTOP ACCEPT

iptables防火墙介绍+实战