目录
一、安全技术与防火墙
1、安全技术概念
2、防火墙
2.1 防火墙概念
2.2 防火墙分类
2.3 linux的防火墙Netfilter
2.4 防火墙工具介绍
2.5 netfilter 和 iptables 的关系
二、iptables
1、概念
2、五表五链
2.1 五个table表
2.2 五个chain链
2.3 内核中数据包的传输过程
三、iptables 相关操作
1、iptables 工具安装及开启
2、iptables 基本语法
2.1 iptables 基本语法格式
2.2 iptables语法总结图
2.3 iptables 管理选项
2.4 iptables 通用匹配
2.5 iptables 控制类型
3、iptables 基本用法
3.1 查看iptables规则表
3.2 新增iptables规则
3.3 修改、替换规则
3.4 删除规则
3.5 设置默认策略(黑白名单)
3.6 设置回环网卡允许访问规则
3.7 自定义链
3.7.1 自定义链的语法格式
3.7.2 新建自定义链添加规则并使用
3.7.3 重命名自定义链
3.7.4 删除自定义链
3.8 通用匹配
3.9 隐含扩展模块
3.9.1 TCP模块
3.9.2 ICMP模块
3.10 显示扩展模块
3.10.1 multiport扩展(混合端口)
3.10.2 iprange扩展
3.10.3 mac地址
3.10.4 string字符串
3.10.5 time模块
3.10.6 connlimit扩展
3.10.7 state扩展
3.11 保存规则
3.12 规则优化
一、安全技术与防火墙
1、安全技术概念
- 入侵检测系统(Intrusion Detection Systems)
特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控系统一般采用旁路部署(默默的看着你)方式
- 入侵防御系统(Intrusion Prevention System)
以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以 阻断,主动而有效的保护网络的安全,一般采用在线部署方式(必经之路)
- 防火墙( FireWall )
隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默 认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ (demilitarized zone)网络中
- 防水墙(Waterwall)
与防火墙相对,是一种防止内部信息泄漏的安全产品。 网络、外设接口、存储介质和打印机构成信息泄漏的全部途径。防水墙针对这四种泄密途径,在事前、事 中、事后进行全面防护。其与防病毒产品、外部安全产品一起构成完整的网络安全体系
2、防火墙
2.1 防火墙概念
防火墙是一种网络安全设备或软件,用于监控和控制网络流量,根据事先设定的规则来决定允许或者阻止数据包的传输。其主要目的是保护计算机网络免受未经授权的访问或损害,并确保网络的安全性、完整性和可用性。防火墙可以在网络层、传输层或应用层进行操作,并可用于保护个人计算机、企业网络或数据中心等各种规模的网络环境。通过配置防火墙规则,管理员可以限制哪些网络流量被允许进入或离开网络,以及允许的流量类型和目的地
2.2 防火墙分类
按照部署位置分类:
- 网络层防火墙:通常部署在网络边界,检查和过滤进出网络的流量
- 主机防火墙:安装在主机上,用于保护单个主机或设备
- 云防火墙:专门设计用于云环境的防火墙解决方案,保护云端应用和数据的安全
按照工作原理分类:
- 有状态防火墙:根据数据包的状态信息来做决策
- 无状态防火墙:只根据单个数据包的信息来做决策
按照过滤方式分类:
- 基于包过滤的防火墙:网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否 允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等
- 基于应用层的防火墙:应用层防火墙/代理服务型防火墙,也称为代理服务器(Proxy Server)。将所有跨越防火墙的网络通信链路分为两段,内外网用户的访问都是通过代理服务器上的“链接”来实现
优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载
注意:现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用层去检查
按照功能分类:
- 传统防火墙:基于网络层的防火墙
- 应用层防火墙:能够检查应用层数据的防火墙
- 代理防火墙:通过代理服务器来转发流量,提供更高级的安全功能
按照技术分类:
- 静态包过滤防火墙:基于预定义的规则进行数据包过滤
- 动态包过滤防火墙:根据实时流量和行为进行动态调整和过滤
2.3 linux的防火墙Netfilter
Linux 防火墙是由 Netfilter 组件提供的,Netfilter 工作在内核空间,集成在 linux 内核中
Netfilter 是 Linux 2.4.x 之后新一代的 Linux 防火墙机制,是 linux 内核的一个子系统。Netfilter 采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter 与 IP 协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作
2.4 防火墙工具介绍
- iptables:iptables是Linux中最常用的防火墙工具之一。它基于内核的Netfilter框架,可以配置规则集来过滤、转发和修改网络数据包。iptables提供了广泛的功能和灵活性,可以根据源IP地址、目标IP地址、端口号等多个参数进行过滤
- firewalld:firewalld是Red Hat系列Linux发行版中默认的防火墙管理工具。它使用了D-Bus接口和动态防火墙规则,支持更高级的网络配置。firewalld通过定义“区域”和“服务”来管理网络连接,并且可以实时更新规则而无需重启防火墙
- nftables:nftables是Netfilter框架的下一代替代品。它提供了更简洁和高效的语法,支持类似于iptables的过滤、NAT和连接跟踪功能。nftables的目标是取代iptables,并提供更好的性能和可扩展性
2.5 netfilter 和 iptables 的关系
- netfilter
①属于的“内核态”(Kernel Space, 又称为内核空间)的防火墙功能体系
②是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集
- iptables
①属于“用户态”(User Space,又称为用户空间)的防火墙管理体系
②是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下
- 两者之间关系
iptable 和 netfilter 共同组成了一个防火墙系统,iptables 只是 Linux 防火墙的管理工具——命令行工具,或者也可以说是一个客户端的代理,netfilter 是安全框架,并且真正实现防火墙功能的是 netfilter,它是Linux内核中的一部分。这两部分共同组成了包过滤防火墙,并且是免费使用,可以实现完成封包过滤、封包重定向和网络地址转换(NAT)等功能
二、iptables
1、概念
IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置
防火墙在做数据包过滤时决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。由软件包 iptables 提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
2、五表五链
iptables由五个表table和五个链chain以及一些规则组成。表中有链,链中有规则。iptables使用表来组织规则,链是规则的容器,用于按顺序处理数据包
2.1 五个table表
五个表table:filter、nat、mangle、raw、security(用的很少,了解即可)
table表 | 说明 |
---|---|
raw | 跟踪数据包,确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING |
mangle | 标记数据包,修改数据包内容,用来做流量整形,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING |
nat | 负责网络地址转换,用来修改数据包中的源、目标IP地址或端口(通信五元素)。包含三个规则链,OUTPUT、 PREROUTING、 POSTROUTING |
filter | 负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、 FORWARD、 OUTPUT |
security | 用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 (了解) |
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
2.2 五个chain链
五个链chain:input、output、forward、postrouting、prerouting
chain链 | 说明 |
---|---|
input | 处理入站数据包,匹配目标IP为本机的数据包 |
output | 处理出站数据包,一般不在此链上做配置 |
forward | 处理转发数据包,匹配流经本机的数据包 |
prerouting | 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上 |
postrouting | 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网 |
2.3 内核中数据包的传输过程
① 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
② 如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
三种报文流向:
- 流入本机:PREROUTING --> INPUT-->用户空间进程
- 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
三、iptables 相关操作
1、iptables 工具安装及开启
默认Linux系统已安装iptables,若无请安装
[root@localhost ~]#yum install iptables iptables-services.x86_64 -y
关闭firewalld防火墙和核心防护,开启iptables服务
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#systemctl start iptables.service
[root@localhost ~]#systemctl status iptables.service
2、iptables 基本语法
2.1 iptables 基本语法格式
#iptables 指定表 怎么在链中插入规则 指定链 规则
iptables [-t 表名] -管理选项 [链表] [通用规则匹配] [-j 控制类型]
#如,-t指定filter表 -A指定INPUT链 -s指定要匹配的数据包的源IP地址为172.16.12.12 -j指定控制类型为DROP即直接丢弃数据包,不给出任何回应信息
iptables -t filter -A INPUT -s 172.16.12.12 -j DROP
注:
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 控制类型使用大写字母,其余均为小写
2.2 iptables语法总结图
2.3 iptables 管理选项
在使用iptables进行防火墙管理时,可以使用各种选项来配置规则、查看规则、添加/删除规则以及保存/加载规则等。以下是一些常用的iptables防火墙管理选项的介绍
管理选项 | 说明 |
---|---|
-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 | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
2.4 iptables 通用匹配
直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
匹配的条件 | 作用 |
---|---|
-p | 指定要匹配的数据包的协议类型 |
-s | 指定要匹配的数据包的源IP地址 |
-d | 指定要匹配的数据包的目的IP地址 |
-i | 指定数据包进入本机的网络接口(入站网卡) |
-o | 指定数据包离开本机做使用的网络接口(出站网卡) |
--sport | 指定源端口号 |
--dport | 指定目的端口号 |
2.5 iptables 控制类型
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables 防火墙体系中,最常用的几种控制类型如下
控制类型 | 说明 |
---|---|
ACCEPT | 允许数据包通过(默认) |
DROP | 直接丢弃数据包,不给出任何回应信息 |
REJECT | 拒绝数据包通过,会给数据发送端一个响应信息 |
SNAT | 修改数据包的源地址 |
DNAT | 修改数据包的目的地址 |
MASQUERADE | 伪装成一个非固定公网IP地址 |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包 |
3、iptables 基本用法
3.1 查看iptables规则表
查看已有的防火墙规则时,使用管理选项“-L”,结合“--line-numbers”选项还可显示各条规则在链内的顺序号
iptables [-t表名] -v -n -L [链名] [-- line-numbers]
#-v:详细信息 -n:规则 -L: 规则列表 ( L必须写在最后 )
[root@localhost ~]# iptables -vnL #查看全部规则
[root@localhost ~]# iptables -t filter -vnL INPUT 2 #指定查看filter表INPUT链第二条规则
[root@localhost ~]# iptables -vnL --line-numbers #查看全部规则的编号
3.2 新增iptables规则
添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。注意:-A代表最底部插入,-I默认首行插入,-I 数字则代表插入第数字条
#在INPUT链中插入一条新的规则,未指定序号,默认加在第一条
[root@localhost ~]#iptables -I INPUT -s 172.16.12.12 -j ACCEPT
#指定序号2,即新的规则加在第2条的位置
[root@localhost ~]#iptables -I INPUT 2 -s 172.16.12.13 -j DROP
#在INPUT链的末尾加上新的规则
[root@localhost ~]#iptables -A INPUT -s 172.16.12.14 -j REJECT
3.3 修改、替换规则
iptables -t 表名 -R 链名 编号 规则
[root@localhost ~]#iptables -R INPUT 3 -s 172.16.12.0/24 -j ACCEPT
3.4 删除规则
#删除指定链的序号的规则
[root@localhost ~]#iptables -D INPUT 1
#指定链并且指定源地址删除
[root@localhost ~]#iptables -D INPUT -s 172.16.12.13 -j DROP
#清除链中所有的规则
[root@localhost ~]#iptables -F
3.5 设置默认策略(黑白名单)
iptables 的各条链中,默认策略是规则匹配的最后一个环节,当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种,没有REJECT(拒绝)
即可通过设置默认策略来实现iptables防火墙的黑白名单操作,在iptables防火墙中,可以使用黑名单和白名单来控制网络流量的访问权限。黑名单和白名单是两种不同的策略,用于指定哪些IP地址或IP地址段被允许或禁止通过防火墙
- 黑名单:默认全部允许通过,添加谁才不允许谁通过。
- 白名单:默认全部不允许通过,添加谁允许谁通过。
方法一 :通过设置DROP规则,默认拒绝所有,然后设置允许访问的主机到iptables规则中,即为白名单
#指定规则DROP,默认拒绝所有
[root@localhost ~]#iptables -P INPUT DROP
#添加允许172.16.12.12远程主机访问的规则
[root@localhost ~]# iptables -A INPUT -s 172.16.12.12 -j ACCEPT
[root@localhost ~]# iptables -vnL
方法二:先在INPUT链尾添加DROP,然后在DROP规则前任意插入允许的规则,除在DROP规则前的规则允许外拒绝所有,即为白名单
#先在INPUT链末尾 拒绝所有
[root@localhost ~]#iptables -A INPUT -j DROP
#然后在DROP规则上插入新的允许规则,想要允许什么就插入什么,相当于白名单
[root@localhost ~]#iptables -I INPUT -s 172.16.12.12 -j ACCEPT
[root@localhost ~]#iptables -I INPUT -s 172.16.12.12 -j ACCEPT
[root@localhost ~]# iptables -vnL
注:
iptables规则表当中的规则是从上至下依次执行的,执行过允许的规则后,最后执行拒绝所有
3.6 设置回环网卡允许访问规则
当设置了172.16.12.0网段的客户端无法访问,那么其本身172.16.12.10也无法ping通自己,如何解决这个问题?
#-i 指定入站网卡 lo(回环网卡)允许自己ping通
[root@localhost ~]#iptables -I INPUT -i lo -j ACCEPT
3.7 自定义链
自定义链是iptables中的一种功能,它允许用户创建自己的链来组织和管理规则。自定义链可以帮助简化规则集,使其更易于管理。通过将相关规则放入一个自定义链中,可以提高可读性并降低错误发生的可能性。此外,自定义链还可以在多个规则之间共享相同的操作,从而减少冗余
3.7.1 自定义链的语法格式
iptables 选项 CUSTOM_CHAIN_NAME
选项 | 说明 |
---|---|
-N | 自定义一条新的规则链 |
-E | 重命名自定义链 :引用计数不为0的自定义链,也就是被使用的自定义链,不能够被重命名,也不能被删除 |
-X | 删除自定义的空的规则链 |
3.7.2 新建自定义链添加规则并使用
#新建自定义链
[root@localhost ~]#iptables -N dh
#给自定义链dh添加规则
[root@localhost ~]#iptables -A dh -p tcp --dport 8080 -j ACCEPT
#使用自定义链,绑定INPUT链,即运行INPUT链的同时运行自定义链
[root@localhost ~]#iptables -A INPUT -s 172.16.12.12 -j dh
3.7.3 重命名自定义链
#重命名自定义链
[root@localhost ~]#iptables -E dh web
3.7.4 删除自定义链
#当引用计数为0才可以删除,也就是还没有使用自定义链才可以使用这一条命令删除
[root@localhost ~]#iptables -X web
#需要先删除自定义web链中的规则,再删除INPUT链中的关于web的规则,最后删除自定义链web
[root@localhost ~]#iptables -D web 1
[root@localhost ~]#iptables -D INPUT 1
[root@localhost ~]#iptables -X web
3.8 通用匹配
基本匹配条件:不需要加载模块,由 iptables/netfilter 提供
#直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件
协议匹配: -p 协议名
地址匹配: -s 源地址
-d 目的地址 #可以是IP、网段、域名、空(任何地址)
接口匹配: -i 入站网卡
-o 出站网卡
#拒绝172.16.12.12主机使用imcp协议到本机
[root@localhost ~]#iptables -A INPUT -p icmp -s 172.16.12.12 -j DROP
3.9 隐含扩展模块
iptables防火墙中的隐含扩展是指一些特殊的扩展模块,它们不需要显式加载,而是隐含在iptables中。这些隐含扩展包括一些常见的功能,如状态跟踪(state tracking)、网络地址转换(Network Address Translation,NAT)和数据包过滤等。
iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。 端口匹配: --sport 源端口、--dport 目的端口,可以是个别端口、端口范围
#查看扩展帮助
man iptables-extensions
#查看有哪些扩展模块
rpm -ql iptables
3.9.1 TCP模块
TCP模块允许iptables根据TCP连接的状态进行过滤和处理
--sport port | 匹配报文源端口,可为端口连续范围 |
--dport port | 匹配报文目标端口,可为连续范围 |
--tcp-flags mask comp | mask 需检查的标志位列表,用 , 分隔 例如 SYN,ACK,FIN,RST |
--sport 1000 #匹配源端口是1000的数据包
--sport 1000:3000 #匹配源端口是1000-3000的数据包
--sport :3000 #匹配源端口是3000及以下的数据包
--sport 1000: #匹配源端口是1000及以上的数据包
#注: --sport和--dport 必须配合-p <协议类型>使用
#端口可以使用的范围 0-65535
#tcp端口22到80全部被拒绝172.16.12.12主机访问
[root@localhost ~]#iptables -A INPUT -p tcp --dport 22:80 -s 172.16.12.12 -j REJECT
#拒绝172.16.12.0网段访问80端口
[root@localhost ~]#iptables -A INPUT -p -s 172.16.12.0/24 --dport 80 -j REJECT
#丢弃SYN请求包,放行其他包
[root@localhost ~]#iptables -I INPUT -i ens33 -p tcp ! --syn -j REJECT
3.9.2 ICMP模块
ICMP模块允许iptables根据ICMP协议的类型和代码进行过滤和处理
类型匹配:--icmp-type ICMP类型
可以是字符串、数字代码
"Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)表示回复
"Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
要求:如何禁止其它客户端ping主机,而允许主机ping其他客户端?
其他客户端:172.16.12.12等 主机:172.16.12.10
方法一:
#拒绝源地址172.16.12.12的icmp协议类型为8的包到达主机172.16.12.10的INPUT口
[root@localhost ~]#iptables -A INPUT -s 172.16.12.12 -p icmp --icmp-type 8 -j REJECT
方法二:
#172.16.12.10主机给其他客户端发送0个数据包
[root@localhost ~]# iptables -A OUTPUT -d 172.16.12.12 -p icmp --icmp-type 0 -j REJECT
3.10 显示扩展模块
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
3.10.1 multiport扩展(混合端口)
以离散方式定义多端口匹配,最多指定15个端口
#指定多个源端口 逗号隔开
[!] --source-ports,--sports port[,port|,port:port]...
#指定多个目标端口 逗号隔开
[!] --destination-ports,--dports port[,port|,port:port]...
#多个源或目标端
[!] --ports port[,port|,port:port]...
#阻止ip地址来自172.16.12.12访问当前机器的tcp 22和80端口
[root@localhost ~]#iptables -A INPUT -s 172.16.12.12 -p tcp -m multiport --dport 22,80 -j REJECT
3.10.2 iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围
#拒绝172.16.12.12-172.16.12.14的所有流量
[root@localhost ~]#iptables -A INPUT -m iprange --src-range 172.16.12.12-172.16.12.14 -j REJECT
3.10.3 mac地址
mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains
-m mac [!] --mac-source XX:XX:XX:XX:XX:XX
[root@localhost ~]#iptables -A INPUT -m mac --mac-source 00:0c:29:1e:c9:3f -j REJECT
3.10.4 string字符串
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
准备工作:
[root@localhost html]#systemctl start httpd
[root@localhost ~]#cd /var/www/html
[root@localhost html]#echo "hello" > he.html
[root@localhost html]#echo "world" > wo.html
当出现特定字符时就不显示网页内容:
#http协议即tcp协议,源端口为80,使用字符模块,利用bm算法从第62个字节开始检查字符串为hello
#注意请求的包不带字符,回复的包带字符所以要output
[root@localhost html]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "hello" -j REJECT
3.10.5 time模块
iptables防火墙中的time模块允许您根据当前时间来匹配数据包。这个模块通常用于实现基于时间的访问控制,比如只允许在特定时间段内访问某些服务或资源。注意:这里时间需要使用格林威治时间,date -u可以查看
--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指定本地时区(默认)
[root@localhost ~]# date -u
[root@localhost ~]#iptables -A INPUT -s 172.16.12.12 -m time --timestart 11:00 --timestop 12:00 -j REJECT
[root@localhost ~]# date -u
[root@localhost ~]#iptables -A INPUT -s 172.16.12.12 -m time --timestart 11:00 --timestop 11:30 -j REJECT
3.10.6 connlimit扩展
iptables防火墙中的connlimit扩展模块允许您限制连接数,以防止某个服务被过多的连接请求所淹没。这个扩展模块通常用于防止DDoS(分布式拒绝服务)攻击或其他类型的连接泛滥
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
Dos攻击:当同一个IP地址同一时间老是访问服务器,就会占用服务器的硬件资源导致其他客户无法访问到服务器那么该如何解决呢?
#如果同一个地址同时访问大于2次以上,就拒绝它,也就是同一地址同一时间只能访问两次
[root@localhost ~]#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
3.10.7 state扩展
state模块是iptables防火墙中的一个重要模块,它用于根据连接的状态进行过滤和处理规则。它根据数据包的状态(如新建、已建立、相关、无效)来确定是否接受、拒绝或进一步处理数据包
状态类型 | 说明 |
---|---|
NEW | 新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求 |
ESTABLISHED | NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态 |
RELATED | 新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系 |
INVALID | 无效的连接,如flag标记不正确 |
UNTRACKED | 未进行追踪的连接,如:raw表中关闭追踪 |
-m state --state <state1,state2,...>
在上面的格式中,<state1,state2,...> 是一个逗号分隔的连接状态列表,用于指定要匹配的连接状态。
实现功能老用户可以访问,新用户不可以访问
iptables -AINPUT -m state --state ESTABLISHED -j ACCEPT #已在ping的可以继续ping,停了也不可以通了,xshell也不可以再连
iptables -AINPUT -m state --state NEW -j REJET #新用户拒绝
#拒绝新用户访问,老用户只要不退出就可以一直访问
[root@localhost ~]#iptables -A INPUT -m state --state NEW -j REJECT
#172.16.12.10主机可访问172.16.12.12主机所有服务,但172.16.12.12主机无法访问172.16.12.10主机的所有服务
[root@localhost ~]#iptables -A INPUT -s 172.16.12.12 -m state --state NEW -j REJECT
拓展:
故障:发现ping不通,查看服务器的日志发现是table full,dropping packet错误,如何解决?
原因:启用了的 iptables state 模块用户访问有问题,需要查看日志 table full drop pket
根本是有一个内核选项的默认值过低, 即netfilter/nf_conntrack_max,默认值为65536,需要把这个值调大一点,即可避免table full,dropping packet错误
[root@localhost ~]#echo "1000000" > /proc/sys/net/netfilter/nf_conntrack_max
[root@localhost ~]#cat /proc/sys/net/netfilter/nf_conntrack_max
3.11 保存规则
使用 iptables 命令定义的规则,手动删除之前,其生效期限为 kernel 存活期限
持久保存规则:
CentOS 7,8
#文件路径自定义
iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 6
#将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save
加载规则:
CentOS 7,8 重新载入预存规则文件中规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
#再重新导回来
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
CentOS 6
#会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart
开机自动重载规则:
方法一:使用iptables-save
开机自启后原本的iptables规则无法自动保存,需要在开机自启前用脚本保存各个iptables命令;让此脚本开机后自动运行
[root@localhost ~]#iptables-save > /opt/iptables
[root@localhost ~]#vim ~/.basrc #仅当前用户有效
iptables-restore < /opt/iptables
或者
[root@localhost ~]#vim /etc/profile #对当前系统所有用户有效
iptables-restore < /opt/iptables
或者
[root@localhost ~]#vim /etc/rc.d/rc.local #对当前系统所有用户有效
iptables-restore < /opt/iptables
[root@localhost ~]#chmod +x /etc/rc.d/rc.local
方法二:使用iptables-services软件
#安装iptables-services工具
[root@centos7 ~]#yum -y install iptables-services
#iptables{,.bak} iptables 备份成 iptables.bak
[root@centos7 ~]#cp /etc/sysconfig/iptables{,.bak}
#保存现在的规则到文件中方法一
[root@centos7 ~]#/usr/libexec/iptables/iptables.init save
#保存现在的规则到文件中方法二
[root@centos7 ~]#iptables-save > /etc/sysconfig/iptables
#开机启动
[root@centos7 ~]#systemctl enable iptables.service
3.12 规则优化
- 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
- 谨慎放行入站的新请求
- 有特殊目的限制访问功能,要在放行规则之前加以拒绝
- 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
- 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
- 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
- 设置默认策略,建议白名单(只放行特定连接)
①iptables -P,不建议,容易出现“自杀现象”
②规则的最后定义规则做为默认策略,推荐使用,放在最后一条