文章目录
- 一、安全技术和防火墙
- 1、安全技术
- 2、防火墙的分类
- 2.1 按保护范围划分
- 2.2 按实现方式划分
- 2.3 按网络协议划分
- 2.3.1 包过滤防火墙
- 2.3.2 应用层防火墙
- 二、Linux 防火墙的基本认识
- 1、Netfilter
- 2、防火墙工具介绍
- 2.1 Iptables
- 2.2 Firewalld
- 2.2.1 软件包
- 2.2.2 管理工具
- 2.3 Netfilter和Iptables的区别
- 3、Netfilter
- 三、Firewalld 服务
- 1、Firewalld 介绍
- 1.1 Firewalld zone 分类
- 1.2 预定义服务
- 1.3 Firewalld 三种配置方法
- 四、Iptables
- 1、Iptables的组成概述
- 1.1 Netfilter/Iptables关系
- 1.1.1 Netfilter
- 1.1.2 Iptables
- 2、Iptables 的表、链结构
- 2.1 规则表
- 2.2 规则链
- 2.3 规则
- 3、Iptables规则操作
- 3.1 基本语法
- 3.1.1 常见控制类型
- 3.1.2 常见的管理选项
- 3.2 查看规则表
- 3.3 添加新的规则
- 3.4 删除、清空规则
- 3.5 设置默认策略
- 3.6 通用匹配
- 3.7 隐含扩展
- 3.8 显示扩展模块
- 3.8.1 multiport扩展
- 3.8.2 iprange扩展
- 3.8.3 mac地址
- 3.8.4 string 字符串
- 3.8.5 time模块
- 3.8.6 connlimit扩展
- 3.8.7 state
- 3.8.8 limit限制流量
- 3.8.9 总结
- 3.9 规则优化
- 3.10 保存规则
- 3.10.1 持久保存规则
- 3.10.2 加载规则
- 3.10.3 开机自动重载规则
- 3.10.4 iptables-services
- 3.10.3 开机自动重载规则
- 3.10.4 iptables-services
一、安全技术和防火墙
1、安全技术
-
入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控系统一般采用旁路部署(默默的看着你)方式。
-
入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以 阻断,主动而有效的保护网络的安全,一般采用在线部署方式。(必经之路)
-
防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默 认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ (demilitarized zone)网络中.
-
防水墙:广泛意义上的防水墙:防水墙(Waterwall),与防火墙相对,是一种防止内部信息泄漏的安全产品。 网络、外设接口、存储介质和打印机构成信息泄漏的全部途径。防水墙针对这四种泄密途径,在事前、事 中、事后进行全面防护。其与防病毒产品、外部安全产品一起构成完整的网络安全体系。
2、防火墙的分类
2.1 按保护范围划分
- 主机防火墙:服务范围为当前一台主机
- 网络防火墙:服务范围为防火墙一侧的局域网
2.2 按实现方式划分
- 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:华为, 山石hillstone,天融信,启明星辰,绿盟,深信服, PaloAlto , fortinet, Cisco, Checkpoint, NetScreen(Juniper2004年40亿美元收购)等
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> Forefront
2.3 按网络协议划分
- 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
- 应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层
2.3.1 包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否 允许该数据包通过
-
优点:对用户来说透明,处理速度快且易于维护
-
缺点:无法检查应用层数据,如病毒等
2.3.2 应用层防火墙
应用层防火墙/代理服务型防火墙,也称为代理服务器(Proxy Server)
将所有跨越防火墙的网络通信链路分为两段
-
优点:在应用层对数据进行检查,比较安全
-
缺点:增加防火墙的负载
提示:现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用 层去检查
二、Linux 防火墙的基本认识
1、Netfilter
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中
Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作。
Netfilter官网文档
https://netfilter.org/documentation/
2、防火墙工具介绍
2.1 Iptables
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
iptables --version
#查看iptables版本信息
2.2 Firewalld
从CentOS 7 版开始引入了新的前端管理工具
2.2.1 软件包
-
firewalld
-
firewalld-config
2.2.2 管理工具
-
firewall-cmd 命令行工具
-
firewall-config 图形工作
2.3 Netfilter和Iptables的区别
Netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(KernelSpace,又称内核空间)的防火墙功能体系(filter是过滤器的意思,netfilter即网络层过滤);Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有网络地址转换(Network Address Translate)、数据包内容修改以及数据包过滤的防火墙功能。
Iptables:指的是用来管理Linux防火墙的命令程序,通常位于/sbin/iptables,属于“用户态”(UserSpace,又称用户空间)的防火墙管理体系(iptables: IP信息包过滤系统)。虽然我们使用service iptables start启动iptables服务,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
3、Netfilter
Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。
由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
提示:从 Linux kernel 4.2 版以后,Netfilter 在prerouting 前加了一个 ingress 勾子函数。可以使用这个新的入口挂钩来过滤来自第2层的流量,这个新挂钩比预路由要早,基本上是 tc 命令(流量控制工具)的替代品。
三、Firewalld 服务
1、Firewalld 介绍
firewalld是CentOS 7.0新推出的管理netfilter的用户空间软件工具,也被ubuntu18.04版以上所支持(apt install firewalld安装即可)
firewalld是配置和监控防火墙规则的系统守护进程。
归入zone顺序
- 先根据数据包中源地址,将其纳为某个zone
- 纳为网络接口所属zone
- 纳入默认zone,默认为public zone,管理员可以改为其它zone
- 网卡默认属于public zone,lo网络接口属于trusted zone
firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
- 已经存在了zone区域
- 使用firewall,就是将特定的流量关联到某个zone中
- 通过源网段关联zone
- 通过网卡关联zone区域
- 如果两者都没有关联的数据报文,那就会去default zone
- 进入到zone以后,开始匹配zone内的规则
1.1 Firewalld zone 分类
zone名称 | 默认配置 |
---|---|
trusted | 允许所有流量 |
home | 拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预 定义服务之外其它所有传入流量 |
internal | 和home相同 |
work | 拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量 |
public | 拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流 量,新加的网卡默认属于public zone |
external | 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。 |
dmz | 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量 |
block | 拒绝除和传出流量相关的所有传入流量 |
drop | 拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应) |
1.2 预定义服务
服务名称 | 配置 |
---|---|
ssh | Local SSH server. Traffic to 22/tcp |
dhcpv6- client | Local DHCPv6 client. Traffic to 546/udp on the fe80::/64 IPv6 network |
ipp- client | Local IPP printing. Traffic to 631/udp. |
samba- client | Local Windows file and print sharing client. Traffic to 137/udp and 138/udp. |
mdns | Multicast DNS (mDNS) local-link name resolution. Traffic to 5353/udp to the 224.0.0.251 (IPv4) or ff02::fb (IPv6) multicast addresses. |
firewalld预定义服务配置
-
firewall-cmd --get-services 查看预定义服务列表
-
/usr/lib/firewalld/services/*.xml预定义服务的配置
1.3 Firewalld 三种配置方法
- firewall-config 图形工具: 需安装 firewall-config包
- firewall-cmd 命令行工具: firewalld包,默认安装
- /etc/firewalld/ 配置文件,一般不建议,如:/etc/firewalld/zones/public.xml
四、Iptables
1、Iptables的组成概述
Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。
netfilter/iptables
- IP 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables组成。
- 主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理。
1.1 Netfilter/Iptables关系
1.1.1 Netfilter
- 属于“内核态”又称内核空间(kernel space)的防火墙功能体系。linux 好多东西都是内核态 用户态,那我们运维人员关注的是用户态, 内核我们关注不是很多,内核基本是我们开发人员关心的事情是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
1.1.2 Iptables
-
属于“用户态”(User Space, 又称为用户空间)的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。
-
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
2、Iptables 的表、链结构
- iptables由四个表table和五个链chain以及一些规则组成
2.1 规则表
- 四个表table:filter、nat、mangle、raw
优先级由高到低的顺序为
raw-->mangle-->nat-->filter
raw:主要用来决定是否对数据包进行状态跟踪,包含两个规则链,OUTPUT、PREROUTING
mangle : 修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
nat:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链,即PREROUTING、POSTROUTING、OUTPUT
注:在iptables 的四个规则表中,mangle 表 和raw表的应用相对较少
2.2 规则链
规则链上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了链,ip请求将这条链上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
-
INPUT:处理入站数据包,匹配目标IP为本机的数据包。
-
OUTPUT:处理出站数据包,一般不在此链上做配置。
-
FORWARD:处理转发数据包,匹配流经本机的数据包。
-
PREROUTING:在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。
-
POSTROUTING:在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。
内核中数据包的传输过程
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
- 如果数据包是进入本机的,数据包就会到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达。
- 如果数据包是要转发出去的,且内核允许转发,数据包就会,经过FORWARD链,然后到达POSTROUTING链输出。
三种报文流向
- 流入本机:PREROUTING --> INPUT–>用户空间进程
- 流出本机:用户空间进程 -->OUTPUT–> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
2.3 规则
- 规则表的作用:容纳各种规则链; 表的划分依据:防火墙规则的作用相似
- 规则链的作用:容纳各种防火墙规则;规则的作用:对数据包进行过滤或处理;链的分类依据:处理数据包的不同时机
总结:表里有链,链里有规则
3、Iptables规则操作
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
systemctl stop firewalld
#关闭firewalld防火墙
yum -y install iptables-services
#安装iptables
systemctl start iptables.service
#开启iptables服务
systemctl status iptables.service
#查看iptables服务状态
3.1 基本语法
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
其中,表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表;
管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等;
匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理;
控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。
注意:
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写
3.1.1 常见控制类型
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。
在 iptables 防火墙体系中,最常用的几种控制类型如下
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给出任何回应信息。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
SNAT:修改数据包的源地址。
DNAT:修改数据包的目的地址。
MASQUERADE:伪装成一个非固定公网IP地址。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
#防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助 动作,并没有真正处理数据包。
3.1.2 常见的管理选项
注:需要大写
管理选项 | 用法示例 |
---|---|
-A | 在指定链末尾追加一条 iptables -A INPUT(操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT(操作) |
-P | 指定默认规则 iptables -P OUTPUT ACCEPT(操作) |
-D | 删除 iptables -t nat -D INPUT 2(操作) |
-p | 服务名称 icmp tcp |
-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 -L --line-number |
-F | 清除链中所有规则 iptables -F(操作) |
-N | 新加自定义链 |
-X | 清空自定义链的规则,不影响其他链 iptables -X |
-Z | 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
3.2 查看规则表
- 查看已有的防火墙规则时,使用管理选项“-L”,结合“–line-numbers”选项还可显示各条规则在链内的顺序号。
iptables -vnL
#-L与 -vn 一起使用时,L要在最后面,否则会报错
iptables -vnL --line-numbers
#显示各条规则在链内的顺序号
说明
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
policy 表示当前链的默认策略,policy ACCEPT表示INPUT的链的默认动作为ACCEPT,换句话说就是,默认接受通过INPUT关卡的所有请求,所以我们在配置INPUT链的具体规则时,应该将需要拒绝的请求配置到规则中。
说白了就是”黑名单”机制,默认所有人都能通过,只有指定的人不能通过,当我们把INPUT链默认动作设置为接受(ACCEPT),就表示所有人都能通过这个关卡,此时就应该在具体的规则中指定需要拒绝的请求,就表示只有指定的人不能通过这个关卡,这就是黑名单机制
packets 表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包。
bytes 表示当前链默认策略匹配到的所有包的大小总和。
其实,可以把packets与bytes称作”计数器”,上图中的计数器记录了默认策略匹配到的报文数量与总大小,”计数器”只会在使用-v选项时,才会显示出来
- pkts:对应规则匹配到的报文的个数。
- bytes:对应匹配到的报文包的大小总和。
- target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。
- prot:表示规则对应的协议,是否只针对某些协议应用此规则。
- opt:表示规则对应的选项。
- in:表示数据包由哪个接口(网卡)流入,即从哪个网卡来。
- out:表示数据包将由哪个接口(网卡)流出,即到哪个网卡去。
- source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
- destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段
3.3 添加新的规则
- 添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。
在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则
iptables -t 表名 -A 链名 匹配条件 -j 动作
使用-s选项,指明”匹配条件”中的”源地址”,即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件,-s为source之意,表示源地址
iptables -t filter -A INPUT -s 192.168.10.12 -j DROP
#丢弃来自192.168.10.12的数据包
在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则
iptables -t 表名 -I 链名 匹配条件 -j 动作
iptables -t filter -I INPUT -s 192.168.10.12 -j ACCEPT
#允许IP地址192.168.10.12访问本机
在指定表的指定链的指定位置添加一条规则
iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
iptables -t filter -I INPUT 5 -s 192.168.10.12 -j REJECT
#在filter表的INPUT链的第5个位置插入一条规则,拒绝源地址为192.168.10.12的数据包
设置指定表的指定链的默认策略(默认动作),并非添加规则。
iptables -t 表名 -P 链名 动作
iptables -t filter -P FORWARD ACCEPT
#表示将filter表中FORWARD链的默认策略设置为ACCEPT
3.4 删除、清空规则
iptables -D INPUT 1
#删除链,并且指定链的序号
iptables -D INPUT -s 192.168.10.12 -j DROP
#删除链,并且指定源地址
iptables -F
#清除链中所有的规则
注意
- 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
- 按序号匹配删除时,确保规则序号小于等于已有规则数,否则报错
- 按内容匹配删数时,确保规则存在,否则报错
3.5 设置默认策略
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
iptables -P INPUT ACCEPT
#指定默认规则 ACCEPT
iptables -A INPUT -s 192.168.10.1 -j ACCEPT
#在INPUT链末尾加入自己
iptables -A INPUT -j DROP
#在INPUT链末尾拒绝所有,相当于白名单了
注意
- 当使用管理选项“-F”清空链时,默认策略不受影响。因此若要修改默认策略,必须通过管理选项“-P”重新进行设置。
- 默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别。
3.6 通用匹配
直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
协议匹配: -p表示协议名
地址匹配: -s表示源地址;-d表示目的地址(可以是IP、网段、域名、空(任何地址))
接口匹配: -i表示入站网卡、-o表示出站网卡
iptables -F
#清空规则,避免干扰
iptables -A INPUT -p icmp -s 192.168.10.12 -j REJECT
#不允许192.168.10.12使用icmp协议,其他不受影响
3.7 隐含扩展
#查看扩展帮助
man iptables-extensions
-
iptables 在使用 -p 选项指明了特定的协议,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
-
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。
-
端口匹配: --sport 源端口、–dport 目的端口(可以是个别端口、端口范围)
–sport和–dport 必须配合-p <协议类型>使用
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK 第二次握手
#错误包
--tcp-flags ALL ALL
--tcp_flags ALL NONE
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包
--sport :3000 匹配源端口是3000及以下的数据包
--sport 1000: 匹配源端口是1000及以上的数据包
注意: --sport和--dport 必须配合-p <协议类型>使用
端口可以使用的范围 0-65535
iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
#1000到3000全部被拒
ICMP
192.168.10.11能ping通192.168.10.12,192.168.10.12不能ping通192.168.10.11
类型匹配:–icmp-type ICMP类型(可以是字符串、数字代码)
- “Echo- Request” (代码为8)表示请求
- “Echo- Reply” (代码为0)表示回复
- “Dest ination-Unreachable” (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行 “ iptables -p icmp -h ” 命令,查看帮助信息
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
#禁止其它主机ping本机
3.8 显示扩展模块
- 显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
[-m matchname [per-match-options]]
3.8.1 multiport扩展
- 以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]...
#指定多个源端口 逗号隔开
[!] --destination-ports,--dports port[,port|,port:port]...
# 指定多个目标端口 逗号隔开
[!] --ports port[,port|,port:port]...
#多个源或目标端
iptables -A INPUT -s 192.168.10.12 -p tcp -m multiport --dports 22,80,3306 -j REJECT
#阻止ip地址来自192.168.10.12访问当前机器的20,80,3306端口
3.8.2 iprange扩展
- 指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
iptables -A INPUT -m iprange --src-range 192.168.10.12-192.168.10.14 -j REJECT
#指定源地址为192.168.10.12-192.168.10.14 这3个地址无法访问 当前主机
3.8.3 mac地址
- mac 模块可以指明源MAC地址,,
- 适用于:PREROUTING, FORWARD,INPUT chains
-m mac [!] --mac-source XX:XX:XX:XX:XX:XX
iptables -A INPUT -m mac --mac-source 00:0c:29:42:0c:18 -j REJECT
#拒绝mac地址00:0c:29:42:0c:18数据包
3.8.4 string 字符串
- 对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
3.8.5 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...] 星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
man iptables-extensions
3.8.6 connlimit扩展
-
根据每客户端IP做并发连接数数量匹配
-
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
#对于到达TCP端口80的连接数超过2个的情况,就拒绝访问
3.8.7 state
状态类型
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
格式
--state state
ipatables -A INPUT -m state --state NEW -j REJECT
#新用户不可以访问
ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
3.8.8 limit限制流量
--limit-burst number 前多少个包不限制
--limit [/second|/minute|/hour|/day]
iptables -A INPUT -p icmp -j REJECT
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
#icmp数据包前5个不限制, 每分钟允许通过10个数据包
#两条都要加
3.8.9 总结
1、多端口匹配:
-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
2、IP范围匹配:
-m iprange --src-range IP范围
iptables -A FORWARD -p udp -m iprange --src-range 192.168.10.100-192.168.10.200 -j DROP
#禁止转发源地址位于192.168.10.100-192.168.10.200的udp数据包
3、MAC地址匹配:
-m mac --mac-source MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止来自某MAC地址的数据包通过本机转发
4、状态匹配:
-m state --state 连接状态
常见的连接状态:
NEW :与任何连接无关的,还没开始连接
ESTABLISHED :响应请求或者已建立连接的,连接态
RELATED :与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用
INVALID:不能被识别属于哪个连接或没有任何状态
iptables -A FORWARD -m state --state NEW -P tcp ! --syn -j DROP
#禁止转发与正常TCP连接无关的非--syn请求数据包(如伪造的网络攻击数据包)
3.9 规则优化
- 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
- 谨慎放行入站的新请求
- 有特殊目的限制访问功能,要在放行规则之前加以拒绝
- 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
- 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
- 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
- 设置默认策略,建议白名单(只放行特定连接)
- iptables -P,不建议,容易出现“自杀现象”
- 规则的最后定义规则做为默认策略,推荐使用,放在最后一条
3.10 保存规则
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
3.10.1 持久保存规则
- CentOS 7,8
iptables-save > /PATH/TO/SOME_RULES_FILE
#文件路径需要自定义
- CentOS 6
service iptables save
#将规则覆盖保存至/etc/sysconfig/iptables文件中
3.10.2 加载规则
- CentOS 7,8 重新载入预存规则文件中规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
- CentOS 6
service iptables restart
#会自动从/etc/sysconfig/iptables 重新载入规则
3.10.3 开机自动重载规则
用脚本保存各个iptables命令;让此脚本开机后自动运行
.bashrc
在/etc/rc.d/rc.local文件添加
iptables-save > /opt/iptables
vim ~/.basrc
iptables-restore < /opt/iptables
3.10.4 iptables-services
yum -y install iptables-services
#安装软件包
cp /etc/sysconfig/iptables{,.bak}
#复制
/usr/libexec/iptables/iptables.init save
#保存现在的规则到文件中方法1
iptables-save > /etc/sysconfig/iptables
#保存现在的规则到文件中方法2
systemctl enable iptables.service
#开机启动
systemctl mask firewalld.service nftables.service
#禁用firewalld和nftables两个服务
ntOS 7,8 重新载入预存规则文件中规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
- CentOS 6
service iptables restart
#会自动从/etc/sysconfig/iptables 重新载入规则
3.10.3 开机自动重载规则
用脚本保存各个iptables命令;让此脚本开机后自动运行
.bashrc
在/etc/rc.d/rc.local文件添加
iptables-save > /opt/iptables
vim ~/.basrc
iptables-restore < /opt/iptables
3.10.4 iptables-services
yum -y install iptables-services
#安装软件包
cp /etc/sysconfig/iptables{,.bak}
#复制
/usr/libexec/iptables/iptables.init save
#保存现在的规则到文件中方法1
iptables-save > /etc/sysconfig/iptables
#保存现在的规则到文件中方法2
systemctl enable iptables.service
#开机启动
systemctl mask firewalld.service nftables.service
#禁用firewalld和nftables两个服务