iptables防火墙内容全解

iptables 简介

Iptables 其实不是真正的防火墙,我们可以理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个框架名称:Netfilter。

Netfilter才是真正的安全框架,位于内核空间。Iptables其实是一个命令工具,位于用户空间,我们利用这个工具操作真正的框架netfilter。

Netfilter/iptables 组成linux平台下的包过滤防火墙,切实免费的,可以代替昂贵的商业防火墙解决方案,完成封包过滤,封包重定向,网络地址转化NAT等功能。

Netfilter是linux操作系统核心层内部的一个数据包处理模块,具有以下功能:

  • 网络地址转换NAT
  • 数据包内容修改
  • 数据包过滤的防火墙功能

所以说:虽然在linux下使用 service iptables start 启动iptables服务,但是准确来说,iptables并没有一个守护进程,所以并不上是真正意义上的服务,而应该是内核提供的功能。

Iptables的表和链

在这里插入图片描述

规则表

规则表中包含各种规则链,iptables管理着四个不同的规则表,其功能分别由独立的内核模块实现。各表解释如下:

表名 内核模块
filter表 主要用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。 包含INPUT、FORWAED、OUTPUT等三个规则链。 iptables_filter
nat表 主要用修改数据包IP地址、端口号等信息,也称网络地址转换。 包含PREROUTING、POSTROUTING、OUTPUT等三个规则链 iptables_nat
mangle表 主要用来修改数据包的TOS,TTL值,或者为数据包设置Mark标记,以实现流量整形,策略路由等高级应用。 包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD等五个规则链。 iptables_mangle
raw表 主要用来决定是否对数据包进行状态跟踪。设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能。 包含OUTPUT、PREROUTING两个规则链。 iptables_raw

注意:

  • 默认表是filter(没有指定表的时候就是filter表)。

  • 表的处理优先级:raw>mangle>nat>filter。

  • 在iptables规则表中,filter表和nat表用的比较多,而其他两个表用的相对来说比较少。所以后面我们大多是以filter表和nat表中的规则链做策略。

2、规则链

规则链的作用是容纳各种防火墙规则,规则分为五种,分别在不同的时机处理数据包。

表名 匹配对象 所在的表
INPUT链 匹配进入防火墙本机的ip包。 mangle,filter表(centos7中还有nat表)
OUTPUT链 匹配从防火墙本机出去的ip包。 raw,mangle,nat,filter表
FORWARD链 匹配经过防火墙主机的ip包(源地址和目标地址均不是防火墙本机ip) mangle,filter表
POSTROUTING链 在进行路由选择后处理数据包。用于源地址转换(SNAT) mangle,nat表
PREROUTING链 在进行路由选择前处理数据包。 可用于目标地址转换(DNAT) raw,mangle,nat表

注意:

  • 每个经过本防火墙的规则表的报文,都要将这张表的这条链上的所有规则匹配一遍,如果符合条件的规则,则执行对应的动作。

  • 其中INPUT和OUTPUT链主要用在“主机型防火墙”中,而FORWARD、POSTROUTING和PREROUTING链主要用在“网关防火墙”中。

数据包过滤的匹配流程

在这里插入图片描述

规则表之间的顺序

当数据包抵达防火墙时,将依次应用raw,mangle,net和filter表中对应链内的规则(如果有的话)。

规则链之间的顺序。

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

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

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

规则链内部各条防火墙规则之间的顺序

  • 当数据包经过规则链时,依次按照第一条规则,第二条规则…的顺序进行匹配和处理,链内的过滤遵循“匹配即停止”的原则,一旦找到一条匹配的规则,则不在检查本链中后续的规则。

防火墙的编写规则

Iptables常见的管理选项如下表所示:

在这里插入图片描述

iptables后常用语法

iptables

  • -t:指定规则表,默认为filter。
  • -I: 添加到链的首部位置,后跟规则链。
  • -A:添加到链的尾部位置,后跟规则链。
  • -s:指明匹配条件中的原地址(source)。
  • -j:指明匹配条件满足时,所对应的动作,例如,DROP丢弃、ACCEPT通过。

iptables常见的控制类型如下:

动作类型 解释
ACCEPT 允许数据包通过。
DROP 直接丢弃数据包。
REJECT 拒绝数据包通过。
SNAT 源地址转换,解决内网用户同一个公网地址上网的问题。
DNAT 目标地址转换。
MASQUERADE 是SNAT的一种特殊形式,适用于动态的,临时会变的IP上。
REDIRECT 在本机做端口映射。
LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。( “匹配即停止”规律的例外)

查看iptables规则中的字段(重!)

在这里插入图片描述

字段 解释说明
Policy ACCEPT 表示INPUT链默认动作是ACCEPT。
Pkts 对应规则匹配到的报文的个数。
Bytes 对应匹配到的报文包大小总和。
Target 规则对应的target,往往表示规则对应的动作,即规则匹配成功后需要采取的操作。
Prot 表示规则对应的协议。
Opt 表示规则对应的选项。
In 表示数据包由哪个接口流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
OUT 表示数据包由哪个接口流出。
Source 表示规则对应的源头地址,可以是一个IP或一个网段。
Destination 表示规则对应的目标地址。

注意:
有的源地址和目的地址显示是:anywhere;说明 IPtables默认为我们进行了名称解析,但是规则非常多时;这种解析效率很低,所以使用 -n选项,表示不对IP地址进行名称反解。

iptables规则的匹配条件

通用匹配

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

  • 协议匹配

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

列如:编写iptables拒绝通过icmp的数据包。

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

  • 地址匹配

编写iptables规则时使用“-s源地址”或“-d目标地址”的形式指定,用来检查数据包的源地址或目标地址。

列如:编写iptables拒绝转发192.168.1.0/24到202.106.123.0/24的数据包。

[root@localhost /]#iptables -A FORWARD -s 192.168.1.0/24 -d 202.106.123.0/24 -j DROP

  • 网络接口匹配

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

列如:拒绝从防火墙的eth1网卡接口ping防火墙主机。

[root@localhost /]#iptables -A INPUT -i eth1 -p icmp -j DROP

隐含匹配

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

  • 端口匹配

编写iptable规则时使用“–sport 源端口”或“–dport”的形式,针对的协议为TCP或UDP,用来检查数据包的源端口或目标端口。单个端口或者以“:”分隔的端口范围都是可以接受的,但不支持多个不连续的端口号。

列如:编写iptables规则允许FTP数据包通过,则需要允许20,21和用于被动模式的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

  • TCP标记匹配

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

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

[root@localhost /]#iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP

  • ICMP类型匹配

编写iptables规则时使用“–icmp-type ICMP类型”的形式,针对的协议为ICMP,用来检查ICMP数据包的类型。ICMP类型使用字符串或数字代码表示,如“Echo-quest”(代码为8),“Echo-Reply”(代码为0),“Destination-Unreachable”(代码为3),分别对应ICMP协议的请求,回显,目标不可达。

列如:若要禁止从其他主机ping防火墙本机,但允许防火墙本机ping其他主机,可执行以下操作。

[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

显示匹配

这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调用相应的模块。然后方可设置匹配条件。常见的显示匹配包括多端口匹配,IP范围匹配,MAC地址匹配,状态匹配。

  • 多端口匹配

编写iptables规则时使用“-m multiport --dport 端口列表”或“-m multiport --sport 端口列表”的形式,用来检查数据包的源端口,目标端口,多端口之间以逗号进行分隔。

列如:若允许本机开放25,80,110,143等端口,以便提供电子邮件服务,可执行如下操作。

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

  • IP地址范围匹配

编写iptables规则时使用“-m iprange --src-range IP范围”,“-m -iprange --dst-range IP地址范围”的形式,用来检查数据包的源地址,目标地址,其中IP范围采用“起始地址-结束地址”的形式表示。

列如:若要允许转发源地址IP位于192.168.4.21与192.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

  • MAC地址匹配

编写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

  • 状态匹配

编写iptables规则时使用“-m state --state 连接状态”的形式,基于iptables的状态跟踪机制用来检查数据包的连接状态。常见的连接状态包括NEW(如任何连接无关的),ESTABLISHED(相应请求或者一建立连接的),RELATED(与已有连接有相关性的,如FTP数据连接)。

列如:编写iptables规则,只开放本机的80端口服务,对于发送给本机的TCP应答数据包给予放行,其他入站数据包均拒绝,可执行如下操作。

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

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

猜你喜欢

转载自blog.csdn.net/qq_40741808/article/details/106695627
今日推荐