Iptables防火墙(一)

1,Linux防火墙基础

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

Netfilteriptables都被称为防火墙,主要区别如下:

Netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不依程序或文件的形式存在,属于内核态(又称内核空间)的防火墙功能体系

Iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables,属于用户态(又称用户空间)的防火墙管理体系。

2.iptables防火墙中的表

Filter表:filter表用来对数据包进行过滤。对应的内核模块为iptable_filter。表内包含三个链:INPUTFORWARD,OUTPUT

Nat表:主要用来修改数据包的ip地址,端口号等信息。对应的内核模块为iptable_nat.表内包含三个链:PREROUTINGPOSTROUTINGOUTPUT.

Mangle表:mangle表主要用来修改数据包的TOStype of server,服务类型)。TTL(生存周期)值,或者为数据包设置Mark标记,以实现流量×××,策略路由等高级应用,manle表对应的内核模块为iptable_mangle。表内包含五个链:PREROUTINGPOSTROUTINGINPUTOUTPUTFORWARD

Raw表:raw表是自1.2.9以后版本的iptables新增的表,主要用来决定是否对数据包进行状态跟踪,raw表对应的内核模块为iptable_raw。表内包含两个链:OUTPUTPREROUTING

3.规则链

Iptables默认划分为五种不同的规则链

INPUT链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则

OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链汇总的规则。

FORWARD:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则。

PREROUTING:在对数据包作路由选择之前,应用此链中的规则

POSTROUTING:在对数据包作路由选择之后,应用此链中的规则

其中INPUT,OUTPUT链主要用在“主机型防火墙”中,即主要针对服务器本机进行保护的防火墙,而FORWARDPREROUTINGPOSTROUTING链多用在“网络型防火墙”中,例如使用linux防火墙作为网管服务器,在公司内网与internet之间进行安全控制。

4数据包过滤的匹配流程。

规则表之间的顺序;rawmanglenatfilter

规则链之间的顺序:规则链之间的应用顺序取决于数据包的流向。

入站数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链处理(是否修改数据包地址等),然后进行路由选择(判断该数据包应发送何处);如果数据包的目标地址时防火墙本机(访问本机httpd80端口)。那么该内核将其传递给INPUT链进行处理(决定是否通过等),通过以后再交给系统上层的应用程序进行处理(如httpd服务器)

转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING链进行处理,然后在进行路由选择,如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问qq服务器)。则内核将传递给FORWARD链进行处理(转发,丢弃,拦截)。最后交给POSTOUTING链(是否修改数据包的地址等)进行处理。

出站数据流向:防火墙本机向外部地址发送的数据包,首先被OUTPUT链进行处理。然后进行路由选择,再交给POSTOUTING链(是否修改数据包的地址等)进行处理

5.规则链内核各条防火墙之间的顺序

当数据包经过每条规则链时,依次按第一条规则,第二条规则….的顺序进行匹配和处理,链内的过滤遵循“匹配即停止的原则”。一旦找到一条相匹配的规则(log日志操作)则不在检查本链内后续的其他操作。如果对比完整个链,没找到,则按该规则链内默认的策略处理。

6.编写防火墙规则

Iptable命令语法:

Iptables[- t 表名]管理选项[链名][匹配条件][- j控制类型]

未指定表名时,将按照默认的使用filter表。

控制类型如下:

ACCPET:允许数据包通过

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

REJECT;拒绝数据包通过。必要时会给一些提示。

LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。防火墙规则的“匹配即停止”原则对于LOG操作来说是一个特例。因为LOG只是一种辅助动作,并没有真正的处理数据包、

Iptables的常用管理选项

-A

在指定链的末尾添加一条新的规则

-D

删除指定链中的某一条规则,可根据指定序号或具体内容

-I

在指定链中插入一条新的规则,未指定序号时,将默认作为第一条规则

-R

修改,替换指定链中的某一条规则,可指定序号或具体内容

-L

列出指定链中的所有的规则,若未指定链名。则列出表中的所有链

-P

设置指定链的默认策略

-n

使用数字形式显示输出结构,如显示ip地址而不是主机名

-v

查看规则列表时显示详细的信息

-h

查看命令的帮助信息- -help

--line number

查看规则表时,同时显示规则在链中的序号

注意事项(1)不指定表名时,默认指filter

2)不指定链名时,默认指表内的所有链

3)设置链的默认策略,不用指定匹配条件

例如:在filter表的INPUT链中插入一条规则,拒绝发给本机的ICMP协议的数据包

[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j REJECT

上述产生的结果是---其他主机无法ping通主机,但是会有提示。

spacer.gif

Iptables命令基本操作示例:

(1)添加新的规则

若要在filter表的INPUT链末尾添加一条防火墙规则。如下:

[root@localhost ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT

当使用管理选项”-I”时,允许同时指定序号,不指定序号时默认是第1

[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT

[root@localhost ~]# iptables -I INPUT 2 -p icmp -j DROP

(2)查看规则

使用管理选项“-L”。使用“- -line-number”还可以列出行号

[root@localhost ~]# iptables -L INPUT --line-number

Chain INPUT (policy ACCEPT)

numtargetprot opt sourcedestination

1ACCEPTicmp --anywhereanywhere

2DROPicmp --anywhereanywhere

3ACCEPTtcp--anywhereanywhere

4REJECTicmp --anywhereanywherereject-with icmp-port-unreachable 

5RH-Firewall-1-INPUTall--anywhereanywhere

当防火墙规则较多时,使用-n选项可以以数字形式显示地址和端口信息,减少地址解析环节,加速命令执行的速度

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

ACCEPTicmp --0.0.0.0/00.0.0.0/0

DROPicmp --0.0.0.0/00.0.0.0/0

ACCEPTtcp--0.0.0.0/00.0.0.0/0

REJECTicmp --0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable 

RH-Firewall-1-INPUTall--0.0.0.0/0 0.0.0.0/0

//nL可以一起写。

3)删除,清空规则

删除一条管理规则时,使用管理选项“-D”。(指定序号,因为只是删除一条)

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

ACCEPTicmp --0.0.0.0/00.0.0.0/0

DROPicmp --0.0.0.0/00.0.0.0/0

ACCEPTtcp--0.0.0.0/00.0.0.0/0

REJECTicmp --0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable 

RH-Firewall-1-INPUTall--0.0.0.0/00.0.0.0/0

[root@localhost ~]# iptables -D INPUT 1

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

DROPicmp --0.0.0.0/00.0.0.0/0

ACCEPTtcp--0.0.0.0/00.0.0.0/0

REJECTicmp --0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable 

RH-Firewall-1-INPUTall--0.0.0.0/00.0.0.0/0

清空指定链或表中所有防火墙规则。使用管理选项“-F”、

[root@localhost ~]# iptables -F INPUT

[root@localhost ~]# iptables -nL INPUT

Chain INPUT (policy ACCEPT)

targetprot opt sourcedestination

使用管理选项-F时,允许省略链名而清空指定表所有链的规则。

[root@localhost ~]# iptables -t filter -F

[root@localhost ~]# iptables -t raw -F

[root@localhost ~]# iptables -t mangle -F

[root@localhost ~]# iptables -t nat –F

4)设置默认策略

Iptables的各条链中,默认策略是规则匹配的最后一个环节-----当找不到任何一个能够区配的数据包时,则执行默认策略。默认策略的控制类型为ACCEPT(允许)。DROP(丢弃)这两种。注意:在选择协议的时候用的是p。在设置默认策略的时候选用的是P

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

[root@localhost ~]# iptables -P OUTPUT ACCEPT

【注意使用-F清空链时,默认的策略不受影响。它并不参与规则的排序。因此在设置之前之后并无区别】

6规则的匹配条件

匹配条件的设置分为三大类:1.通用匹配2.隐含匹配3.显式匹配

1.通用匹配也被称为常规匹配。这种匹配方式可以独立使用。不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配,地址匹配、网络接口匹配

1)协议匹配

编写iptables规则时使用“-p 协议名”的形式指定,用来检查数据包所使用的网络协议。

例如:若要丢弃通过icmp协议访问防火墙本机的数据包。允许转发除icmp协议意以外的数据包

[root@localhost ~]# iptables -I INPUT -p icmp -j DROP

[root@localhost ~]# iptables -I FORWARD -p ! icmp -j ACCEPT

[root@localhost ~]#

!表示取反

2)地址匹配

编写iptables规则时使用-s 源地址”,“-d 目标地址”的形式指定。Ip地址,网段等都是可以接受的。但不建议使用主机名,域名的方式。会降低效率

[root@localhost ~]# iptables -I OUTPUT -s 192.168.236.128 -j REJECT

[root@localhost ~]# iptables -I FORWARD -d 192.168.236.1 -j REJECT

[root@localhost ~]# iptables -I FORWARD -d 192.168.236.128 -j REJECT

[root@localhost ~]# iptables -I FORWARD -d 192.168.236.0/24 -j REJECT

[root@localhost ~]# iptables -I OUTPUT -s 192.168.236.0/24 -j REJECT

-------------------------------------------------网段形式也可以使用

当遇到小规模的网络扫描或攻击时。封ip是很方便的做法。例如 192.168.128.0这个网段老是频繁扫描。例如:

[root@localhost ~]# iptables -I INPUT -s 192.168.128.0/24 -j DROP

3)网络接口匹配

编写iptables规则时使用“-i 接口名”和“-o 接口名”的形式。用来检查数据包从防火墙的哪一个接口进入或发出。分别对应入站网卡(--in-interface)。出站网口(--out-interface

[root@localhost ~]# iptables -A INPUT -i eth1 -s 192.168.128.0/24 -j REJECT

[root@localhost ~]# iptables -A INPUT -i eth1 -s 192.168.128.1 -j DROP

[root@localhost ~]# iptables -A INPUT -i eth1 -j DROP

[root@localhost ~]# iptables -A OUTPUT -o eth1 -j DROP

2.隐含匹配

这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能由iptables在需要时自动(隐含)载入内核。常见的隐含匹配包括端口匹配,TCP标记匹配.ICMP类型匹配

1)端口匹配

编写iptables规则时使用“- -sport源端口”或“- - dport目标端口”的形式,针对的协议为TCPUDP,用来检查数据包的源端口(- -source-port)或目标端口(--destination-port)、单个端口号或者以冒号“:”分隔的端口范围都是可以接受的,但不连续的多个端口不能采用这种方式。例如,若要允许为网段192.168.4.0/24转发DNS查询数据包:

[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT

[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --dport 53 -j ACCEPT

在例如,构建vsftpd服务器时,若要开放2021端口,以及用于被动模式的端口范围24500~24600

[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT

2)TCP标记匹配

编写iptables规则时使用“—tcp-flags”检查范围被设置的标记“的形式针对的协议为TCP。用来检查数据包的标记位(--tcp-flags)。其中检查范围指出需要检查数据包的哪几个标记,”被设置的标记“则明确匹配对应值为1的标记,多个标记之间以逗号分隔

例如,若要拒绝从外网接口(eth 1)直接访问防火墙本机的TCP请求,但其他主机发给防火墙的TCP相应等数据包应允许。可以执行以下操作

spacer.gif

3)ICMP类型匹配

编写iptables规则时使用“- -icmp-type ICMP 类型”的形式。针对的协议为ICMP,用来检查ICMP数据包的类型(--icmp-type)、ICMP类型使用字符串或数字代码表示、

Echo-Request(代码为8)请求不可达

Echo-Reply(代码为0)回显

Descination-Unreachable(代码为3)目标不可达

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT

[root@localhost ~]# iptables -A INPUT -p icmp -j DROP

关于更多可用的ICMP协议类型。可以执行

spacer.gif

3.显示匹配

这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调出相应的模块,然后方可设置匹配条件。添加了带显式匹配条件的规则以后,可以执行“lsmod| grep xt_”命令查看到相关的内核扩展模块(如xt_multiportxt_iprangext_macxt_state)。常见的显式匹配方式包括多端口匹配,ip范围匹配。MAC地址匹配,状态匹配

1)多端口匹配

编写iptables规则时使用“-m multiport – dports 端口列表”。“-m multiport –sports 端口列表”的形式,用来检查数据包的源端口,目标端口、多个端口之间以逗号进行分隔。例如,若要允许本机开放25 .80 .110. 143端口。以便提供电子邮件服务

[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT

2IP 地址范围匹配

编写iptables规则时使用“-m iprange –src-range IP 范围”,“-m iprange - -dst-range IP 范围”的形式,用来检查数据包的源地址,目标地址,其中IP范围采用“起始地址-结束地址”的形式表示。例如,若要禁止转发源ip地址位于192.168.4.21192.168.4.28之间的TCP数据包,可以执行以下操作:

[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT

3MAC地址匹配

编写iptables规则时使用“-m mac - -mac-source MAC 地址”的形式用来检测数据包的源MAC地址,由于MAC地址本身的局限性,此类匹配条件一般只适用于内部结构

例如若要根据MAC地址封锁主机。禁止其访问本机的任何应用。可以执行以下操作:

[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP

4)状态匹配

编写iptables规则时使用“-m state –state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态。常见的连接状态包括NEW(与任何连接无关的),ESTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接有相关性的,如FTP数据连接)例如,若要禁止转发与正常TCP连接无关的飞–syn请求数据包(如伪造的一些网络攻击数据包)、

[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

在例如,若只开放本机的web服务(80端口)、但对发给本机的TCP应答数据包予以放行,其他入站数据包均丢弃,则对应的入站控制规则可参考

[root@localhost ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT

[root@localhost ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

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