目录
引言
在数字化世界中,网络安全已成为企业和个人无法忽视的重要议题。而防火墙,作为网络安全体系中的关键一环,扮演着保护计算机系统和网络免受未经授权访问的守门员角色。本文将深入探讨防火墙的基本概念、功能、分类以及如何有效配置与使用防火墙以提升整体网络安全水平。
一、安全技术与防火墙
(一)安全技术
入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控系统一般采用旁路部署(默默的看着你)方式。
入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以 阻断,主动而有效的保护网络的安全,一般采用在线部署方式。(必经之路)
防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默 认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ (demilitarized zone)网络中.
(二)防火墙的主要功能与分类
1.防火墙的主要功能
访问控制:防火墙能够基于IP地址、端口号、协议类型等参数制定规则,决定哪些流量可以进入或离开网络。
数据包过滤:通过分析数据包头信息(如源地址、目标地址、协议类型等),对数据包进行筛选和丢弃。
状态检查:现代防火墙具备状态检测功能,能够追踪连接状态,只允许合法会话的数据包通过,进一步增强安全性。
应用层过滤:深度包检测(DPI)技术使防火墙能解析到应用层,针对HTTP、FTP等应用协议内容进行安全检查。
NAT转换:网络地址转换功能,隐藏内部网络结构,提高网络匿名性和安全性。
2.防火墙的分类
按保护范围划分:
主机防火墙:服务范围为当前一台主机
网络防火墙:服务范围为防火墙一侧的局域网
按实现方式划分:
硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:华为, 山石hillstone,天融信,启明星辰,绿盟,深信服, PaloAlto , fortinet, Cisco, Checkpoint, NetScreen(Juniper2004年40亿美元收购)等
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> Forefront
按网络协议划分:
网络层防火墙:OSI模型下四层,又称为包过滤防火墙
应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层
包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否 允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等
应用层防火墙
应用层防火墙/代理服务型防火墙,也称为代理服务器(Proxy Server)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的"链接"来实现优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载
提示:现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用 层去检查
二、Linux防火墙的基本认识
在红帽 RHEL7 系统中 firewalld 服务取代了 iptables 服务,但依然可以使用 iptables 命令来管理内核的 netfilter。但其实Iptables服务与Firewalld 服务都不是真正的防火墙,它们都只是用来定义防火墙规则功能的"防火墙管理工具",将定义好的规则交由内核中的netfilter 即网络过滤器来读取,从而真正实现防火墙功能,所以其实在配置规则的思路上是完全一致的
(一)Netfilter
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中
Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作
Netfilter官网文档:https://netfilter.org/documentation/
(二)防火墙工具介绍
1.iptables
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
2.firewalld
从CentOS 7 版开始引入了新的前端管理工具
软件包:
firewalld
firewalld-config
管理工具:
firewall-cmd 命令行工具
firewall-config 图形工作
3.nftables
此软件是CentOS 8 新特性,Nftables最初在法国巴黎的Netfilter Workshop 2008上发表,然后由长期的netfilter核心团队成员和项目负责人Patrick McHardy于2009年3月发布。它在2013年末合并到Linux内核中,自2014年以来已在内核3.13中可用。它重用了netfilter框架的许多部分,例如连接跟踪和NAT功能。它还保留了命名法和基本iptables设计的几个部分,例如表,链和规则。就像iptables一样,表充当链的容器,并且链包含单独的规则,这些规则可以执行操作,例如丢弃数据包,移至下一个规则或跳至新链。
从用户的角度来看,nftables添加了一个名为nft的新工具,该工具替代了iptables,arptables和ebtables中的所有其他工具。从体系结构的角度来看,它还替换了内核中处理数据包过滤规则集运行时评估的那些部分。
三、iptables工具
(一)iptables的组成概述
Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。
netfilter/iptables:IP 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables组成。 主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理。
-netfilter/iptables关系: netfilter:
属于"内核态"又称内核空间(kernel space)的防火墙功能体系。linux 好多东西都是内核态 用户态,那我们运维人员关注的是用户态, 内核我们关注不是很多,内核基本是我们开发人员关心的事情是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables :
属于"用户态"(User Space, 又称为用户空间)的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。 netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
iptables 命令用于创建数据过滤与 NAT 规则,主流的 Linux 系统都会默认启用 iptables 命令,但其参数较多且规则策略相对比较复杂。
(二)规则链与策略
在 iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链。
举例来说:
小区门卫有两条的规则,将这两个规则可以合成一个规则链:
遇到外来车辆需要登记。
严禁快递小哥进入社区。
但是光有策略还不能保证社区的安全,需要告诉门卫 (iptables)这个策略(规则链)是作用于哪里的,并赋予安保人员可"登记",',对应到iptables命令中则常见的控制类型有:能的操作有这些,如:"允许""拒绝","不理他"
ACCEPT:允许通过.
LOG:记录日志信息,然后传给下一条规则继续匹配.
REJECT:拒绝通过,必要时会给出提示,
DROP:直接丢弃,不给出任何回应
其中 REJECT和 DROP 的操作都是将数据包拒绝,但REJECT 会再回复一条"您的信息我已收到,但被扔掉了"
可以简单看一下,通过ping命令测试REHECT的情况
而DROP则是不予响应
而规则链则依据处理数据包的位置不同而进行分类:
|-------------|---------------|
| PREROUTING | 在进行路由选择前处理数据包 |
| INPUT | 处理入站的数据包 |
| OUTPUT | 处理出站的数据包 |
| FORWARD | 处理转发的数据包 |
| POSTROUTING | 在进行路由选择后处理数据包 |
Iptables 中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
|---------|--------------------|
| raw表 | 确定是否对该数据包进行状态跟踪 |
| mangle表 | 为数据包设置标记 |
| nat表 | 修改数据包中的源、目标IP地址或端口 |
| filter表 | 确定是否放行该数据包(过滤) |
内核中数据包的传输过程
当一个数据包进入网卡可能是直接访问自己,或者是由本机转发,那么就会有两种数据流向
主要就是区分在INPUT与FORWARD阶段
cs
#PREROUTING阶段
'当数据包到达网络接口卡(NIC)时,首先会经过PREROUTING链。
在这个阶段,如果数据包的目的地址是本地主机上的其他IP地址(例如,通过NAT转换),它会被重定
向到正确的网络接口或者目的端口。'
#INPUT阶段
'如果数据包是要被本机接收的(即目的地是本机IP地址),则数据包会继续流经INPUT链。
INPUT链上设置的规则可以决定是否允许数据包进入系统的本地进程,例如接受来自外部网络的服务请求'
#FORWARD阶段
'若数据包既不是发送给本地系统也不是由本地系统发出,而是需要转发至其他网络(比如路由器功能),
数据包会通过FORWARD链。
在这个环节,可以根据策略来控制哪些数据包可以通过本机转发至其他网段。'
#OUTPUT阶段
'当本地系统生成一个要发送到外部网络的数据包时,该数据包会在离开本机之前经过OUTPUT链。
这里可以应用规则以影响所有从本地产生的出站流量。'
#POSTROUTING阶段
'最后,不论是本地生成的还是转发的数据包,在实际离开主机并进入网络之前都会经历POSTROUTING链。
此链主要用于NAT转换(源地址转换SNAT或目标地址转换DNAT)和其他输出前的数据包修改操作'
数据报文一共有三种流向
流入本机:PREROUTING --> INPUT-->用户空间进程(上层次协议栈)
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
(三)安装iptables与语法
1.安装iptables
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables-services,安装时注意软件包名称
systemctl stop firewalld
#关闭防火墙
yum install iptables-services -y
#下载iptables
systemctl enable --now iptables-services
#启动iptables并设置开机自启动
2.基本语法
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
例如:iptables -t filter -A INPUT -p imcp -j ACCEPT
有三点需要注意:
1.没有指定规则表则默认指 filter 表。
2.不指定规则链则指表内所有的规则链。
3.在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理。
语法总结
管理选项
管理选项 | 用法示例 |
---|---|
-A | 在指定链末尾追加一条 iptables -A INPUT (操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作) |
-P | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
-D | 删除 iptables -t nat -D INPUT 2 (操作) |
-R | 修改、替换某一条规则 iptables -t nat -R INPUT (操作) |
-L | 查看 iptables -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 | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
匹配选项
|-------------|--------------------------------|
| 管理选项 | 用法示例 |
| -p | 匹配服务名称 icmp tcp |
| -s | 匹配来源地址IP/MASK,加叹号"!"表示除这个 IP外。 |
| -d | 匹配目标地址 |
| -i 网卡名称 | 匹配从这块网卡流入的数据 |
| -o 网卡名称 | 匹配从这块网卡流出的数据 |
| --dport num | 匹配目标端口号 |
| --sport num | 匹配来源端口号 |
cs
#控制方式
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给出任何回 应信息。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。
SNAT:修改数据包的源地址。
DNAT:修改数据包的目的地址。
MASQUERADE:伪装成一个非固定公网IP地址。
在开始操作之前需要输入iptables -F清空规则列表,默认是清空filter表
查看规则列表,并清空默认规则
如果向查看nat表,就使用-t nat
(四)管理选项基本操作
首先指定防火墙服务器与客户机
|------------|-------------------|
| 防火墙服务器 | 192.168.83.30 |
| 客户端 | 182.168.83.40 |
1.添加规则
先来做一个简单的iptables规则
这条规则的意思是丢弃所有来自于192.168.83.40的数据包,这是时候,不论是使用任何协议去访问本机,都会将数据包丢弃。
也可以指定网段:192.168.83.0/24:指定对该网段的防火墙规则
可以看到,使用客户端访问的时候,都是一直在连接,直到超时,这是因为一直在向服务端发送请求,但是没有回包,导致超时。
iptables规则的匹配是从上往下匹配,如果在该规则链的下方去添加允许该地址访问还是会失败
使用客户端访问依然失败
可以使用-I在最上方添加一条规则,这样就可以实现访问了
指定完协议之后,只能接受指定的协议数据包,并返回数据包,其它协议的访问,依然会将数据包丢弃,导致访问失败
2.删除规则
除了使用-F清空规则外,还可以使用-D选项指定删除某一条规则
语法为 iptables -D 规则链 规则编号
可以使用 --line-number 查看规则编号
看到编号后,就可以指定删除某一条规则了
除了按编号删除规则外,也可按指定的内容进行删除
当然,这种做法显然没有按编号删除更方便,而且,如果当有两条指定部分一样的规则,会将两条规则都删除
3.替换规则
可以使用-R选项 ,指定将某一条防火墙规则的内容进行修改、替换
4.设置默认规则
在规则列表中可以看到表的信息,这里的 "INPUT" 链负责处理所有进入系统的网络数据包
而括号中的内容,则显示的是该表中的一些基础信息
"(policy ACCEPT)" 表示如果没有匹配到任何规则的数据包,默认策略是接受(ACCEPT)这些数据包。
" packets, bytes" 表示自系统启动以来,根据默认策略通过该链的数据包数量和字节数。
可以使用命令设置默认拒绝数据包
设置完默认拒绝之后,如果正在连接xhell等远程终端,会直接断开,这时候需要去主机设置规则,或者删除、清空规则,才可以连接上
一般在工作环境中,都会设置默认拒绝来添加允许的白名单
5.自定义链
在iptables中,除了预定义的五条链(INPUT、OUTPUT、FORWARD、PREROUTING和POSTROUTING)之外,还可以自定义规则链。自定义链允许你将相关的规则组织在一起,从而简化管理和提高可读性
首先使用-N选项,新建一条规则链
而后再给自定义链添加规则
在默认规则中设置的INPUT链是拒绝的,可以通过将规则链跳转,使其通过
当客户端使用imcp协议访问本机时,就可以通过rule进行访问了
6.删除自定义链
使用-X删除自定义链,在删除之前,需要将设置的自定义链的所有相关规则,包括INPUT链跳转的规则删除,否则会报错
7.清空链的计数器
要清空iptables链中的计数器(匹配到的数据包数量和总字节数),可以使用-Z选项
iptables -Z #清空所有链的所有计数器
iptables -Z INPUT #清空INPUT链的计数器
iptables -Z INPUT 规则编号 #清空特定规则的计数器
(五)规则基本操作
上面主要讲述了对链的一些管理的基本操作,还可以通过选项指定协议、网卡、以及数据包的流向,端口号等等进行操作。
1.指定协议
主要是针对tcp、udp、icmp这三种协议,使用-p选项
可以通过设置指定的协议,确定客户端以什么样的协议可以来访问本机
2.指定网卡
如果你的主机有两块网卡,可以指定其中一块网卡允许或拒绝访问、
假设现在允许客户端连接自己ens36的网卡,但是不能连接ens33的网卡
|---------|--------------|
| -i 网卡名称 | 匹配从这块网卡流入的数据 |
| -o 网卡名称 | 匹配从这块网卡流出的数据 |
-o主要设置在OUTPUT链中,用来指定网络接口(网卡)作为规则的输出方向。这意味着该规则将应用于通过指定网卡发送出去的数据包
OUTPUT链默认是允许所有数据包流出,可以通过设定来拒绝某块网卡的流出
现在是可以ping通两块网卡,可以控制其中一块网卡的数据包流出
3.指定IP地址
|----|--------------------------------|
| -s | 匹配来源地址IP/MASK,加叹号"!"表示除这个 IP外。 |
| -d | 匹配目标地址 |
-d一般设置在OUTPUT链
OUTPUT链的默认规则是允许所有数据包通过,可以设置目标地址的规则,来拒绝发送指定地址的数据包。拒绝之后就无法进行数据包回发,导致通连失败
4.指定端口号
指定端口号通常与 -p 参数(用于指定协议)一起使用,并结合 --dport 或 --sport 参数来设置目标端口或源端口。主要用于区分不同的访问方式进行允许、拒绝
|-------------|---------|
| --dport num | 匹配目标端口号 |
| --sport num | 匹配来源端口号 |
比如匹配目标端口,设置指定目标端口号为80端口可以访问(通常为HTTP服务),则其它服务则无法访问(例如ssh服务,该协议访问端口号为22)
也可以设置自己的回包,通过限制本机回包的端口号,来拒绝外来访问,通常设置在OUTOUT链
如果端口号连续,也可以设置端口号范围。例如:
iptables -A INPUT -p tcp -sport 22:80 -j ACCEPT
|-------------------|---------------------|
| --sport 1000 | 匹配源端口是1000的数据包 |
| --sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
| --sport :3000 | 匹配源端口是3000及以下的数据包 |
| --sport 1000 | 匹配源端口是1000及以上的数据包 |
(六)显示扩展
在iptables(Linux防火墙工具)的上下文中,显示扩展是指需要通过-m选项明确指定使用的模块来实现额外匹配功能的情况。这些扩展模块提供了更复杂或特定类型的网络数据包过滤条件
1.多端口匹配 (multiport)
在之前讲到的--sport于--dport中,只能指定端口号的范围,但不能指定特定的多个端口号,使用该选项就可以满足需求。
以离散方式定义多端口匹配,最多指定15个端口
使用客户机访问对应端口号的服务
2.多IP匹配(iprange)
指明连续的(但一般不是整个网络)ip地址范围
--src-range from[-to] 源IP地址范围
--dst-range from[-to] 目标IP地址范围
3.字符串匹配 (string)
可以通过对报文中的应用层数据做字符串模式匹配检测,来允许或者拒绝数据包,可以过滤某些违规的信息,从而拒绝访问
在服务端上建立两个资源文件
通过设置匹配的字符串来拒绝访问
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
4.time模块
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:设置一个开始日期,格式为年(YYYY)、月(MM)、日(DD)、时(hh)、分(mm)和秒(ss)。其中,年份是必需的,月份、日期、小时、分钟和秒数可以选填,默认不填则表示使用该层级的最大值(如只提供年份,则表示从这一年的第一天开始)。'T' 是时间与日期之间的分隔符。
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:同上,但这是结束日期。
--timestart hh:mm[:ss]:设置一个开始时间,精确到小时、分钟和秒。
--timestop hh:mm[:ss]:设置一个结束时间,同样精确到小时、分钟和秒。
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几,1 -- 7 分别表示星期一到星期日
需要注意的是:在设置时间是centos7默认使用的是UTC时间,与中国时间相差8个小时
现在是默认拒绝所有,可以通过iptables工具设置允许访问的时间
没有规定协议或者端口号,默认也是所有都可以访问,使用客户端访问进行验证
5.connlimit扩展
根据每客户端IP做并发连接数数量匹配
connlimit 是 iptables 防火墙规则集中的一种扩展模块,它允许管理员限制来自同一源 IP 地址的并发连接数。这意味着你可以设置一个规则来决定当来自某个 IP 地址的并发连接数超过特定阈值时,防火墙应该如何处理这些额外的连接请求。
connlimit 扩展模块的主要用途是防止拒绝服务攻击(DoS/DDoS),以及控制客户端对服务器资源的过度使用。通过使用这个模块,可以规定每个 IP 地址最多建立多少个并发连接到指定的服务或端口。
以下是一些 connlimit 模块中常用的参数:
--connlimit-above n:如果某个 IP 的现有连接数大于 n,则匹配该规则。
--connlimit-mask n:与 IP 地址进行逻辑与操作以确定一组地址,用于计算连接数。默认情况下,connlimit-mask 为 32,即针对单个 IP 地址计数。
cs
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
'这条规则表示,对于试图同时建立超过 50 个 TCP 连接到目标服务器 80 端口的单一 IP 地址,
其超出的连接请求将被防火墙丢弃。'
6.limit模块
它允许管理员限制在指定时间段内通过防火墙的数据包速率。这个模块可以用来防止突发的流量冲击或者对特定服务进行限速控制。
使用 limit 模块时,可以设置一个速率(单位可以是秒、分钟、小时等)以及在该时间间隔内的数据包数量阈值。当超过设定的速率时,超出部分的数据包将根据你的配置被丢弃或者其他方式处理。
cs
iptables -A INPUT -p tcp --dport 22 -m limit --limit 15/minute --limit-burst 30 -j ACCEPT
'这条规则表示,对于目标端口为 22 的 TCP 连接(这里是 SSH),系统会接受每分钟
最多 15 个新连接请求,并且在最初的一次突发情况下可以接受最多 30 个连续的数据
包(--limit-burst 参数)。一旦达到这个突发阈值,后续的数据包如果在接下来的一
分钟内超过每分钟 15 包的限制,则会被拒绝或按照链中的下一条规则处理。'
7.状态匹配 (state)
在iptables防火墙中,状态匹配(state)是一种非常重要的过滤机制。通过使用-m state模块,我们可以根据数据包的连接状态来制定规则,允许或拒绝特定状态的数据包通过。
|-----------------|------------------------------------------|
| NEW | 新连接请求,即尚未建立任何关联的TCP握手包。 |
| ESTABLISHED | 已经成功建立并处于活跃状态的连接。 |
| RELATED | 与现有连接相关的数据包,例如FTP协议中的辅助连接或其他服务可能产生的额外数据包 |
| INVALID | 无效、不完整的或者格式错误的数据包。 |
| UNTRACKED | 未进行追踪的连接,如:raw表中关闭追踪 |
首先使一个用户对本级建立连接,(例如:客户端使用ssh协议远程登录本机)
INPUT链是默认允许通过的情况下,不需要输入iptables -A INPUT -j ACCEPT
这个时候再去使用state模块
cs
# 允许已建立的和相关的连接通过防火墙:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 拒绝所有新建连接的入站请求,但保留允许响应出去的连接:
iptables -A INPUT -m state --state NEW -j DROP
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
而后将所有允许通过的规则删除
这时正在访问的连接不会断开,而新的访问将会被拒绝
需要注意的是:如果开启此模块,需要将/proc/sys/net/netfilter/nf_conntrack_max的默认数值65535增大。
否则,当用户访问超过这个数值时,会无法访问,日志中出现table full,dropping packet的报错
这表示系统的连接跟踪表已满,无法继续记录新的网络连接或数据包
(七)保存规则与优化
1.规则保存
防火墙规则设置完毕,重启之后就会自动删除,不会保存,所以需要将规则保存
iptables规则保存通常涉及两个方面:临时保存当前活动的规则和永久保存以确保重启后规则依然有效。
临时保存当前活动规则
要查看当前生效的iptables规则并将其输出到一个文件中,可以使用 iptables-save 命令:
输入:iptables-save > /path/to/rules_backup_file(自定义文件路径)
#这将把当前所有链(INPUT、OUTPUT、FORWARD等)的规则保存到指定的文件中。
此时看到的都是nat、raw等表的规则
开机后,将设置的规则自动删除,使用-vnL看到的规则都是防火墙默认规则
永久保存规则
将iptables-restore </data/iptables重定向命令保存到开机自动加载的文件当中,例如:
对于全局生效(所有用户):编辑 /etc/profile 或 /etc/profile.d/*.sh文件。
对于仅当前用户生效:编辑 ~/.bashrc 或 ~/.bash_profile 文件。
或则将规则写在配置文件当中
编辑防火墙配置文件,并将规则写入文件,如 /etc/sysconfig/iptables 和 /etc/sysconfig/ip6tables (如果是IPv6规则)。
2.规则优化
-
安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
-
谨慎放行入站的新请求
-
有特殊目的限制访问功能,要在放行规则之前加以拒绝
-
同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
-
不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
-
应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
-
设置默认策略,建议白名单(只放行特定连接)