一.网络安全技术
①入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控系统一般采用旁路部署(默默的看着你)方式。
②入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以 阻断,主动而有效的保护网络的安全,一般采用在线部署方式。
③防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默 认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ (demilitarized zone)网络中。
二.防火墙
2.1.防火墙分类
①按保护范围划分
主机防火墙:服务范围为当前一台主机。
网络防火墙:服务范围为防火墙一侧的局域网。
②按实现方式划分
硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,华为、深信服等。
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> Forefront。
③按网络协议划分
包过滤防火墙:只对osi模型下四层生效,速度快拆包少。
网络层防火墙:OSI模型下四层,又称为包过滤防火墙。
应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层。
- 硬件防⽕墙:通过硬件和软件的组合,基于硬件的防⽕墙保护整个内部网络安全。
- 软件防⽕墙:通过纯软件,单独使⽤软件系统来完成防⽕墙功能,保护安装它的系统。
Linux系统自带的软件防火墙:
- iptables:Centos 5/6 系统默认防火墙
- firewalld:Centos 7/8 系统默认防火墙
2.2.iptables四表五链
由软件包iptables提供的命令行工具。
工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包。
netfilter/iptables关系
netfilter
位于Linux内核中的包过滤功能体系
称为Linux防火墙的“内核态”(内核空间)
是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。iptables
位于/sbin/iptables
用来管理防火墙规则的工具称为Linux防火墙的“用户态”
它使插入、修改和删除数据包过滤表中的规则变得容易IPtable和netfilter共同组成了一个防火墙系统,iptables只是Linux防火墙的管理工具——命令行工具,或者也可以说是一个客户端的代理,netfilter是安全框架,并且真正实现防火墙功能的是 netfilter,它是Linux内核中的一部分。这两部分共同组成了包过滤防火墙,并且是免费使用,可以实现完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
firewalld和iptablesFirewalld和Iptables都不是防火墙,是防火墙管理工具,被称为防火墙的“用户态”。
Centos 7中默认管理防火墙规则的工具是firewalld。因为iptables是开源的,就安全系数来讲软件防火墙只能用于辅助硬件防火墙,无法做到真正的安全效果。此外软件防火墙也是需要占用硬件资源运行
#查看有没有安装
iptables --version
五表:security表、raw表、mangle表、nat表、filter表
五表的优先级(高->低):security -->raw-->mangle-->nat-->filter
五链:INPUT链、OUTPUT链、FORWARD链、POSTROUTING链、PREROUTING链
规则表的作用:容纳各种规则链。
规则链的作用:容纳各种防火墙规则,对数据包进行过滤或处理。
链的分类依据:处理数据包的不同时机。
总结:表里有链,链里有规则
五表
五链
规则链之间的匹配顺序
- 入站数据(来自外界的数据包,且目标地址是防火墙本机)∶ PREROUTING --> INPUT --> 本机的应用程序
- 出站数据(从防火墙本机向外部地址发送的数据包)∶ 本机的应用程序 --> OUTPUT --> POSTROUTING网络型防火墙∶
- 转发数据(需要经过防火墙转发的数据包)∶ PREROUTING --> FORWARD --> POSTROUTING
规则链内的匹配顺序
- 自上向下按顺序依次进行检查,找到相匹配的规则即停 止 (LoG策略例外, 表示记录相关日志)
- 若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
三种报文流向
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
注意:在设置iptables设置时,将iptables的默认值设置为ACCEPT,设置成DROP或REJECT,在清空iptables的所有规则时,会出现远程无法连接的问题 。
2.3.黑白名单
iptables默认设置是黑名单设置
黑名单:默认全部允许通过,添加谁才不允许谁通过。
白名单:默认全部不允许通过,添加谁允许谁通过。
在白名单中添加一条允许规则
2.4.iptables基本语法
iptables [-t 规则表] 管理选项 [规则链] [匹配条件] [-j 处理动作]
iptables -t filter -A INPUT -s 192.168.47.3 - DROP
管理选项 | 用法示例 |
-A | 向规则链中添加一条规则,在末尾追加(iptables -A INPUT (操作)) |
-I | 在规则链的指定位置插入一条规则,未指定序号默认作为第一条( iptables -I INPUT (操作)) |
-F | 清除链中所有规则【 iptables -F (操作)】 |
-P | 设置规则链的默认策略(指定默认规则 iptables -P OUTPUT ACCEPT (操作)) |
-D | 从规则链中删除一条规则(删除 iptables -t nat -D INPUT 2 (操作)) |
-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 |
-N | 创建一个新的自定义规则链 |
-X | 清空(删除)自定义链的规则,不影响其他链 (iptables -X) |
-Z | 清空规则链中所有规则的数据包和字节数统计(iptables -Z) |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
#允许来自192.168.1.0/24子网的数据包进入INPUT链
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
#删除允许来自192.168.1.0/24子网的数据包进入INPUT链的规则
iptables -D INPUT -s 192.168.1.0/24 -j ACCEPT
#在INPUT链的第2条规则之前插入一条允许来自192.168.1.0/24子网的数据包进入的规则
iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT
#将INPUT链中的第2条规则替换为拒绝来自192.168.1.0/24子网的数据包的规则
iptables -R INPUT 2 -s 192.168.1.0/24 -j DROP)
#列出INPUT链中的所有规则
iptables -L INPUT
#清空INPUT链中的所有规则
iptables -F INPUT
#清空INPUT链的数据包和字节数统计
iptables -Z INPUT
#将INPUT链的默认策略设置为DROP,即拒绝所有数据包
iptables -P INPUT DROP
#将FORWARD链重命名为NFORWARD
iptables -E FORWARD NFORWARD
#创建一个名为MYCHAIN的新规则链
iptables -N MYCHAIN
#删除名为MYCHAIN的自定义规则链
iptables -X MYCHAIN
指定匹配条件的选项 | 功能 |
-p | 指定要匹配的 协议类型,例如TCP、UDP、ICMP等 |
-s | 指定 源IP地址或地址范围 |
-d | 指定 目标IP地址或地址范围 |
-i <网络接口> | 指定 输入网络接口 |
-o <网络接口> | 指定 输出网络接口 |
-m | 指定 扩展模块,用于进一步定义匹配条件 |
- -icmp-type | 指定ICMP类型 |
- -sport | 指定源端口号或端口范围 |
- - dport | 指定目标端口号或端口 |
控制类型 | 作用 |
DROP | 直接丢弃数据包,不给出任何回应信息 |
REJECT | 拒绝数据包通过,会给数据发送端一个响应息 |
ACCEPT | 允许数据包通过(默认) |
SNAT | 修改数据包的源地址(源地址转换) |
DNAT | 修改数据包的目的地址(目的地址转换) |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则 LOG只是一种辅助动作,并没有真正处理数据包 |
控制类型需要使用 -j 跳转到某类型处理数据包。
2.5.查看规则
iptables -vnL #查看所有规则表的规则
-v 详细信息
-n 数字形式显示
-L 查看规则列表
iptables -vnL -t [规则表] #查看规则表的规则链,默认filter表
2.6.添加规则、删除、清空、替换规则
查看规则编号:
查看已有的防火墙规则时,使用管理选项“-L”,结合“--line-numbers”选项还可显示各条规则在链内的顺序号。例如,若要查看 filter 表 INPUT 链中的所有规则,并显示规则序号, 可以执行以下操作
iptables [-t表名] -n -L [链名] |[-- line-numbers]
或
iptables - [vn]L
#注意:不可以合写为-Ln
iptables -vnL --line-numbers #查看规则编号
添加:
添加规则的两个常用选项:
-A,在末尾追加规则。
-I,在指定位置前插入规则。如果不指定,则在首行插入。
添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。
例如,若要在 filter 表 INPUT 链的末尾添加一条防火墙规则,可以执行以下操作(其中 “-p 协议名”作为匹配条件)。如果仅仅只需要清空一条链的规则,还要保存其他链的规则,就要指定链来清除(-t)
例子:
iptables -t filter -A INPUT -p icmp -j REJECT或DROP或ACCEPT //不允许任何主机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
替换:
iptables -R <规则链> <规则编号> <新规则>
iptables -R INPUT 3 -p tcp --dport 22 -j ACCEPT
#替换INPUT链中第3条规则,将其内容改为允许TCP协议的SSH流量(端口22)通过iptables -A INPUT -s 192.168.91.101 -j DROP
iptables -R INPUT 1 -s 192.168.91.101 -j ACCEPTiptables -D INPUT 5
iptables -L INPUT --line-numbers
iptables -t filter -D INPUT -p icmp - j REJECT
删除:
iptables -D <规则链> <要删除的规则>
或者
iptables -D <规则链> n #n为规则编号
清空:
iptables -F #清空除默认策略外的所有规则
清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,若要清空 filter 表 INPUT
链中的所有规则,可以执行以下操作。
主意:
1.若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
2.按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
3.按内容匹配删数时,确保规则存在,否则报错
2.9.默认策略
默认策略是指当没有明确的匹配规则时,iptables 对进出系统的网络流量采取的默认处理方式。
有3种基本的默认策略:ACCEPT、DROP 和 REJECT。
ACCEPT:允许所有的数据包通过防火墙。
DROP:阻止所有的数据包通过防火墙。
REJECT:默认策略为 REJECT 与 DROP 类似,阻止所有的数据包通过防火墙。但不同的是,当数据包被拦截时,会向源主机发送一个拒绝响应消息。
查看:
iptables -L #查看当前 iptables 的默认策略
配置默认策略:
iptables -P INPUT <策略>
iptables -P OUTPUT <策略>
iptables -P FORWARD <策略>
INPUT 是针对进入系统的数据包,
OUTPUT 是针对离开系统的数据包,
FORWARD 是针对通过系统的数据包
策略可以是 ACCEPT、DROP 或 REJECT
# 允许SSH进入
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP和HTTPS流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
清空和删除:
无法直接清空或者删除默认策略,iptables -F也不行。
只能将ACCEPT改成DROP/REJECT,或者反过来,某种意义上,也等同于删除
2.10.隐藏扩展模块
iptables在使用-p 指定协议时,若指明特定协议后就无须再使用-m指明扩展模块的扩展机制,例如若已经指明是 -p tcp 协议则使用--dport及--sport等tcp模块内容时即可省略-m tcp。
man iptables-extensions #查看扩展帮助
端口匹配:
--sport
和--dport
必须配合-p <协议类型>
使用只能用于匹配连续的端口
--sport 源端口
--dport 目的端口
可以匹配单个端口,也可以匹配端口范围,以源端口匹配为例:
格式 | 含义 |
---|---|
–sport 1000 | 匹配源端口是1000的数据包 |
–sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
–sport 1000: | 匹配源端口是1000及以上的数据包 |
–sport :3000 | 匹配源端口是3000及以下的数据包 |
TCP模块
--tcp-flags TCP标志
TCP标志 | 功能 |
---|---|
SYN(同步) | 用于建立连接。 |
ACK(确认) | 用于确认收到的数据。 |
FIN(结束) | 用于关闭连接。 |
RST(复位) | 用于重置连接。 |
URG(紧急) | 用于指示数据中有紧急数据部分。 |
PSH(推送) | 用于强制接收方立即处理数据。 |
iptables允许通过来自ens33接口的,具有FIN、RST、ACK和SYN标志的TCP包
只有SYN标志的TCP包,拒绝建立连接
iptables -I INPUT -i ens33 -p tcp \--tcp-flags FIN,RST,ACK SYN -j ACCEPT
--sport 指明源端口,使用格式: --sport 端口或 端口1:端口2(端口1到端口2的连续端口范围指定)。
--dport 指明目的端口,使用格式: --dport 端口或 端口1:端口2(端口1到端口2的连续端口范围指定)。
ICMP模块
--icmp -type 0/3/8
代码 | 含义 |
---|---|
8 | “Echo- Request” 表示请求 |
0 | “Echo- Reply” 表示回复 |
3 | "Dest ination-Unreachable"表示目标不可达 |
#丢弃icmp的包,别人ping不通本机,本机也ping不通别人
iptables -A INPUT -p icmp -j DROP
#禁止其他主机ping本机
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#当本机ping不通其它主机时提示目标不可达,此时其它主机需要配置关于icmp协议的控制类型为REJECT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
--icmp-type 指定icmp的type值制定规则。type值:Echo- Request" (代码为8)、表示请求 "Echo- Reply" (代码为0)表示回复 、"Dest ination-Unreachable" (代码为3)表示目标不可达。
例如设置自己可以ping其他机器但是不允许其他机器ping自己。
2.11.显示扩展模块
扩展模块使用格式: -m {模块名} [选项]
multiport模块
multiport扩展 多端口
可用于匹配非连续的端口,以离散的方式匹配,最多支持15个端口。
iptables -A INPUT -s 192.168.2.101 -p tcp -m \
multiport --dports 22,80,3306 -j REJECT
#拒绝来自源IP地址为192.168.2.101的TCP流量,并且目标端口号为22、80和3306
--sports 端口1,端口2 ,等 使用,隔开最多指定15个不连续端口
--dports 端口1,端口2 ,等 使用,隔开最多指定15个不连续端口。
iprange模块
iprange扩展功能模块用于在防火墙规则中匹配特定的IP地址范围。
基本格式
-m iprange --src-range IP范围iptables -A INPUT -m ip range --src-range 192.168.91.101-192.168.91.103 -j REJECT
# 拒绝来自源IP地址范围为192.168.91.101到192.168.91.103的所有流量,并且应用于INPUT链(也就是进入服务器的流量)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数据包
iprange模块可以指定连续的(一般不是整个网络)ip地址范围。
--src-range 源地址范围或 目的地址范围,例如:10.0.0.0-10.0.0.15。
--dst-range 源地址范围或 目的地址范围,例如:10.0.0.0-10.0.0.15。
mac地址模块
mac模块用于匹配和处理MAC地址相关的防火墙规则,可以限制特定MAC地址的访问或过滤特定MAC地址的流量。
基本格式
-m mac --mac-source XX:XX:XX:XX:XX:XX #根据源MAC地址匹配
-m mac --mac-destination XX:XX:XX:XX:XX:XX#根据目标MAC地址匹配
指明源MAC地址,适用INPUT链,PREOUTING,POSTROUTING链。
--mac-source 源mac地址,只能指定源mac地址。
string字符串模块
string模块用于在数据包的内容中搜索指定的字符串,并根据匹配结果执行相应的操作。
基本格式
-m string --string 字符串 --algo bm/kmp
#bm kmp为字符串检测算法iptables -A INPUT -p tcp --dport 80 -m string --string "example" --algo bm -j DROP
#对于目标端口为80的TCP流量,在数据包的内容中搜索字符串"example"
#如果匹配成功,则使用DROP动作丢弃该数据包
可以使用string模块指定字符串范围。
--from offset 字符串开始查询的地方。
--to offset 字符串结束查询的地方 。
例如:iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "bilibili" -j REJECT
connlimit模块
connlimit扩展模块用于限制连接数量,根据活动连接数量的条件来控制数据包的流动。
基本格式
-m connlimit --connlimit-匹配选项 匹配条件
匹配选项 | 功能 |
---|---|
above n | 指定连接数量超过n个时触发匹配 |
upto n | 指定连接数量小于n个时触发匹配 |
equal n | 指定连接数量等于n个时触发匹配 |
maks | 指定连接数量的掩码来匹配连接数量 |
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
#对于TCP协议、目标端口为80的数据包,如果活动连接的数量超过10个,则拒绝该连接iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 --connlimit-mask 16 -j REJECT
#对于TCP协议、目标端口为22(SSH)的数据包
#如果同一子网的连接数量超过5个,拒绝连接据每客户端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
time模块
time模块用于根据时间条件匹配数据包,可以限制特定时间段内进出防火墙的数据包。
基本格式
-m time --匹配选项 匹配条件
匹配选项 | 含义 |
---|---|
- -timestart | 指定开始时间 |
- -timestop | 指定结束时间 |
- -datestart | 指定开始日期 |
- -datestop | 指定结束日期 |
- -days | Mon-Fri |
iptables -A INPUT -m time --timestart 08:00 --timestop 17:00 \
--datestart 2023-08-01 --datestop 2023-08-31 --days Mon-Fri -j ACCEPT#在2023年8月1日至2023年8月31日期间的每个工作日的08:00至17:00之间,接受(ACCEPT)输入的数据
#如果不在指定的日期和时间范围内或不是工作日,则不匹配该规则
stat模块
state模块用于匹配连接的状态,根据连接的状态来过滤数据包。
基本格式
--state state 连接状态
常见连接状态 含义
NEW 与任何连接无关的,还没开始连接
ESTABLISHED 响应请求或者已建立连接的,连接态
RELATED 与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED 配合使用
INVALID 不能被识别属于哪个连接或没有任何状态
UNTRACKED 未进行追踪的连接,如:raw表中关闭追踪
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
#对于输入的数据包,如果连接状态是NEW(新建连接)或ESTABLISHED(已建立连接),允许该数据包通过
stat模块可以根据连接状态控制数据包。
NEW:新发出的请求;第一次发出的请求。
ESTABLISHED:new之后的正常连接状态。
例如:ipatables -A INPUT -m state --state NEW -j REJECT
ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
控制流量模块
limit控制流量模块,可以控制通过的包数以及每分钟或每小时通过的包数。
--limit 10/minute(1分钟之内只允许10个包通过)
--limit-burs 数字 例如: --limit-burst 5(允许通过前5个包,5个包不受影响)
三.iptables保存规则
将写好的规则导入一个文件中 iptables-save >文件名。
永久保存保存规则的文件重新写入 iptables-restore <保存规则的文件名。
四.自定义链使用
①自定义链添加:iptables -N web(链名) 创建链
②自定义链改名:iptabels -E web(原来名称) (新名称) 自定义链改名
③创建自定义链规则:iptables -t filter -I web -p icmp -j REJECT 创建自定义规则,iptables的链中添加一条对应到自定义链中才能生效
④iptabales创建对应链规则然后跳转自定义链web:iptables -t filter -I INPUT -p icmp -j web
⑤删除自定义规则链:先删除iptables INPUT链中的对应关系,然后删除自定义链中的规则。