Linux 防火墙之iptables

目录

一、iptable概述

1.1 netfilter/iptables关系

1.2 iptables 的四表五链

1.2.1 四表

1.2.2 五链

1.2.3 表链结构示意图

1.2.4 规则链之间的匹配顺序

1.2.5 规则链内的匹配顺序

1.2.6 数据包在规则表、链间的匹配流程

二、iptables 配置

2.1 iptables 安装

2.2 iptables 命令

2.3 常见控制类型

2.4 管理选项

2.5 添加新的规则

2.6 查看规则列表

2.7 删除、清空规则

2.8 设置默认策略

三、规则匹配条件

3.1 通用匹配

3.2 隐含匹配

4.3 显示匹配

4.4 状态匹配


一、iptable概述

Linux系统的防火墙: IP 信息包过滤系统,它实际上由两个组件 netfilteriptables 组成。

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

netfilter/iptables:IP 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables 组成。
 

1.1 netfilter/iptables关系

netfilter : 属于“内核态”( Kernel Space, 又称为内核空间 ) 的防火墙功能体系。 是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。

iptables: 属于“用户态”( User Space,又称为用户空间 ) 的防火墙管理体系。 是一种用来管理Linux防火墙的命令程序,它使插入,修改和删除数据包过滤表中的规则变得容易,通常位于 /sbin/iptables 目录下。

netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙其中内置了 raw、mangle 、nat 和 filter 四个规则表。

表中所有规则配置后,立即生效,不需要重启服务。
 

1.2 iptables 的四表五链

1.2.1 四表

raw :主要用来决定是否对数据包进行状态跟踪包含两个规则链,OUTPUT、PREROUTING

mangle :修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING

nat :负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链:oUTPUT、PEROUTTNG、POSTROUTING

filter :负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链:PREROUTTNG、POSTROUTING、OUTPUT

注 :在iptables的四个规则表中,mangle表和raw表的应用相对较少

1.2.2 五链

INPUT :处理入站数据包,匹配目标 IP 为本机的数据包。

OUTPUT :处理出站数据包,一般不在此链上做配置。

FORWARD :处理转发数据包,匹配流经本机的数据包。

PREROUTING链 :在进行路由选择前处理数据包,用来修改目的地址,用来做 DNAT。相当于把内网中的 80 端口映射到路由器外网端口上。

POSTROUTING链 :在进行路由选择后处理数据包,用来修改源地址,用来做 SNAT。相当于内网通过路由器 NAT 转换功能实现内网主机通过一个公网IP地址上网。
 

1.2.3 表链结构示意图

优先顺序 :规则表应用顺序 : raw → mangle → nat → filter

1.2.4 规则链之间的匹配顺序


入站数据:PREROUTING→INPUT

出站数据:OUTPUT→POSTROUTING

转发数据:PREROUTING→FORWARD→POSTROUTING

主机型防火墙
数据包直接进入到防火墙所在的服务器的内部某一个应用程序当中,是不是我只是路过服务器吧,是直接进入到服务
入站数据 ( 来自外界的数据包,且目标地址是防火墙本机 ) :PREROUTING --> INPUT -->本机的应用程序
出站数据 ( 从防火墙本机向外部地址发送的数据包 ) :本机的应用程序–>OUTPUT–>POSTROUTING

网络型防火墙
转发数据 ( 需要经过防火墙转发的数据包 ) :PREROUTING --> FORWARD --> POSTROUTING

1.2.5 规则链内的匹配顺序


自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)要么放行要么丢弃

若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)

注 :按第一条规则…第二条规则的顺序进行匹配处理,遵循"匹配即停止"的原则,一旦找到一条匹配规则将不再检查后续的其他规则,如果一直找不到匹配的规则,就按默认规则处理。

默认规则用 iptables -L 查看,规则链后面出现 ( policy ACCEPT ) 即是默认放行

默认策略不参与链内规则的顺序编排

-F 清空链时,默认策略不受影响

1.2.6 数据包在规则表、链间的匹配流程

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

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

入站 prerouting input 应用程序 output postrouting
 

二、iptables 配置

2.1 iptables 安装

Centos 7 默认使用 firewalld 防火墙,没有安装iptables, 若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables

systemctl stop firewalld. service				#关闭firewalld防火墙

systemctl disable firewalld. service			#取消firewalld防火墙开机自启动


yum -y install iptables iptables-services		#安装iptables和iptables-services


systemctl start iptables.service				#启动iptables-services

systemctl enable iptables.service               #设置iptables开机启动

2.2 iptables 命令

命令格式:

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

表名、链名用来指定iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表

管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等

匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理

控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等

注意事项 :

  1. 不指定表名时,默认指filter表

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

  3. 除非设置链的默认策略,否则必须指定匹配条件

  4. 选项、链名、控制类型使用大写字母,其余均为小写

2.3 常见控制类型

控制类型作用
ACCEPT允许数据包通过
DROP直接丢弃数据包,不给出任何回应消息
REJECT拒绝数据包通过,会给数据发送端一个响应信息
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
SNAT修改数据包的源地址
DNAT修改数据包的目的地址
MASQUERADE伪装成—个非固定公网IP地址


1.防火墙规则的 " 匹配即停止 " 对于 LOG 操作来说是一个特例,因为LOG只是一种辅助动作,并没
有真正处理数据包

2.需要大写

2.4 管理选项

管理选项用法示例
-A在指定链末尾追加一条iptables -A INPUT(操作)
-l在指定链中插入一条新的,未指定序号默认作为第一条iptables -l INPUT(操作)
-p指定默认规则iptables -P OUTPUT ACCEPT(操作)
-D删除iptables -t nat -D INPUT(操作)
-R修改、替换某一条规则iptables -t nat -R INPUT(操作)
-L查看iptables -t nat -L(查看)
-n所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不 是服务名)iptables -L -n,iptables -nL,iptables -vnL(查看)
-v查看时显示更详细信息,常跟-L一起使用(查看)
-line-number规则带编号 iptables -t nat -L -n --line-number / iptables -t nat -I --line-number
-F清除链中所有规则iptables -F(操作)
-X清空自定义链的规则,不影响其他链iptables -x
-Z清空链的计数器(匹配到的数据包的大小和总和) iptables -Z
-S查看链的所有规则或者某个链的规则/某个具体规则后面跟编号

2.5 添加新的规则

添加新的防火墙规则时,使用管理选项 “ -A ”、“ -I ” ,前者用来追加规则,后者用来插入规则。

#示例,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中 “-p 协议名”作为匹配条件)。
iptables -t filter -A INPUT -p icmp -j REJECT       ###不允许任何主机ping本主机
iptables -I  INPUT 2 -p tcp --dport 22 -j ACCEPT       ###允许主机ssh端口通过我的
 
#其他
iptables -t filter -A INPUT -p tcp -j ACCEPT    ###允许任何主机tcp
iptables -I INPUT -p udp -j ACCEPT        ###允许任何主机udp

2.6 查看规则列表

查看已有的防火墙规则时,使用管理选项 “ -L ” ,结合 “ --line-numbers ” 选项还可显示各条规则在链内的顺序号。例如,若要查看 filter 表 INPUT 链中的所有规则,并显示规则序号, 可以执行以下操作

iptables [-t表名] -n -L [链名] 

2.7 删除、清空规则

删除一条防火墙规则时,使用管理选项"-D"。例如,若要删除filter表INPUT链中的第五条规则,可以执行以下操作

iptables [-t 表名] -F [链名]

iptables -D INPUT 5

iptables -L INPUT --line-numbers

iptables -t filter -D INPUT -P icmp - j REJECT

清空指定链或表中的所有防火墙规则,使用管理选项"-F”。例如,若要清空filter表INPUT链中的所有规则,可以执行以下操作

iptables -F  INPUT

iptables -nL INPUT

使用管理选项"-F”时,允许省略链名而清空指定表所有链的规则。例如,执行以下操作分别用来清空 filter表、nat表、mangle表

iptables -F

iptables -t nat -F

iptables -t mangle -F

注意

  1. 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条

  2. 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错

  3. 按内容匹配删数时,确保规则存在,否则报错

2.8 设置默认策略


iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。例如,执行以下操作可以将 filter 表中 FORWARD 链的默认策略设为丢弃, OUTPUT 链的默认策略设为允许
 

iptables [ -t 表名 ] -P  < 链名 >   < 控制类型 >
iptables -P INPUT DROP      输入后没显示  清除所有规则之后生效,因为下面只剩下DROP  添加远程端口22
 
iptables -P FORWARD DROP
#一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单
 
 
iptables -t filter -P FORWARD DROP

iptables -P OUTPUT ACCEPT
 

三、规则匹配条件

3.1 通用匹配

在编写防火墙规则时,匹配条件的设置起着决定性的作用。只有清晰、准确地设置好匹配条件,防火墙才知道要对符合什么条件的数据包进行处理,避免"误杀"。对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效。根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配 、隐含匹配、显式匹配

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

协议匹配
编写iptables规则时使用"-p 协议名"的形式指定,用来检查数据包所使用的网络协议(–protocol),如tcp、udp、icmp和 all(针对所有IP数据包)等,可用的协议类型存放于Linux系统的/etc/procotols文件中。例如,若要丢弃通过icmp 协议访问防火墙本机的数据包,允许转发经过防火墙的除 icmp协议之外的数据包,可以执行以下操作
 

通用匹配:可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件

协议匹配:-p协议名
 
地址匹配:-s源地址、-d目的地址          #可以是IP、网段、域名、空(任何地址)
 
接口匹配:-i入站网卡、-o出站网卡
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT    ###感叹号”!"表示取反

3.2 隐含匹配

要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。端口匹配:

–sport源端口–dport目的端口

#可以是个别端口、端口范围
 
--sport 1000      匹配源端口是1000的数据包
 
--sport 1000:3000 匹配源端口是1000-3000的数据包
 
--sport :3000     匹配源端口是3000及以下的数据包
 
--sport 1000:     匹配源端口是1000及以上的数据包
 
注意:--sport和--dport必须配合-p <协议类型> 使用

TCP标记匹配:–tcp-flags TCP标记

 iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
 ###丢弃SYN请求包,放行其他包

ICMP类型匹配: --icmp-type ICMP类型 ###可以是字符串、数字代码

"Echo-Request"(代码为8)表示请求
 
"Echo- Reply"(代码为0)表示回显
 
"Destination-Unreachable"(代码为3)表示目标不可达
 
关于其它可用的ICMP协议类型,可以执行"iptables -p icmp -h"命令,查看帮助信息
iptables -A INPUT -p icmp --icmp-type 8 -j DROP      #禁止其它主机ping本机
iptables -A INPUT -P icmp --icmp-type 0 -j ACCEPT    #允许本机ping其它主机                              先拒绝: iptables  -A   INPUT -p icmp -j  DROP

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT                                                                        #当本机ping不通其它主机时提示目标不可达

#此时其它主机需要配置关于icmp协议的控制类型为REJECT
iptables -A INPUT -p icmp -j  REJECT

4.3 显示匹配

要求以"-m扩展模块”的形式明确指出类型,包括多端口、MAc地址、IP范围、数据包状态等条件

多端口匹配:

-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表

iptables -A INPUT -P tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT

IP范围匹配:

-m iprange --src- range IP范围

iptables -A FORWARD -P udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
#禁止转发源地址位于192.168.80.100-192.168.80.200的udp数据包

MAC地址匹配:

-m mac -- -mac- source MAC地址

iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发

4.4 状态匹配

-m    state   --state连接状态

常见的连接状态:

NEW:与任何连接无关的,还没开始连接。

ESTABLISHED :响应请求或者已建立连接的,连接态。

RELATED:与已有连接有相关性的( 如 FTP 主被动模式的数据连接 ),衍生态,一般与ESTABLISHEBD配合使用。

INVALID:不能被识别属于哪个连接或没有任何状态。

iptables -A FORWARD -m state --state NEW -P tcp ! --syn -j DROP
#禁止转发与正常TCP连接无关的非–syn请求数据包(如伪造的网络攻击数据包)
 

iptables -I INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -P udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -P tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
对进来的包的状态进行检测。已经建立tcp连接的包以及该连接相关的包允许通过。
比如我和你做生意,我们谈成了生意,到了支付的时候,就可以直接调用与这笔生意相关的支付功能
iptables -P INPUT DROP


版权声明:本文为m0_59579177原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。