Linux防火墙
- 一、概述
- 二、iptables
- 2.1、规则链与策略
- 2.2、工作流程
- 2.3、命令格式
- 2.4、命令参数
- 2.5、匹配标准
- 2.6、常用案例
- 2.6.1、检查是否安装iptables
- 2.6.2、(可选)安装iptables-persistent
- 2.6.3、查看当前规则
- 2.6.4、设置默认策略
- 2.6.5、允许特定流量
- 2.6.6、允许特定IP地址
- 2.6.7、删除规则
- 2.6.8、保存规则
- 2.6.9、还原规则
- 2.6.10、清空所有规则
- 2.6.11、查看特定链的规则
- 2.6.12、记录日志
- 2.6.13、限制连接速率
- 2.6.14、查看规则详细信息
- 2.6.15、保存和恢复规则
- 2.6.16、使用systemctl管理服务
- 2.6.17、禁止访问22端口
- 2.6.18、禁止某IP访问
- 2.6.19、禁止网段连入
- 2.6.20、允许指定网段连入
- 2.6.21、指定多个端口
- 2.6.22、匹配ICMP类型(禁止被ping)
- 2.6.23、匹配网络状态(TCP/IP连接状态)
- 2.6.24、限制并发及速率
- 2.6.25、限制并发及速率防火墙规则的保存与恢复
- 三、firewalld
一、概述
防火墙虽然有软件或硬件之分但是主要功能还是依据策略对外部请求进行过滤,成为公网与内网之间的保护屏障,防火墙会监督每一个数据包并判断是否有相应的匹配策略规则,知道满足其中一条策略规则为止,而防火墙规则策略可以是基于来源地址、请求动作或协议来定制的,最终仅让合法的用户请求流入到内网中,其余的均被丢弃。

在红帽RHEL7系统中firewalld服务取代了iptables服务,但依然可以使用iptables命令来管理内核的netfilter。其实Iptables服务Firewalld服务都不是真正的防火墙,它们都只是用来定义防火墙规则功能的“防火墙管理工具”,将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能,所以其实在配置规则的思路上是完全一致的。
二、iptables
iptables命令用于创建数据过滤与NAT规则,主流的Linux系统都会默认启用iptables命令,但其参数较多且规则策略相对比较复杂。
2.1、规则链与策略
在iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链。
举例来说:小区门卫有两条的规则,将这两个规则可以合成一个规则链:
-遇到外来车辆需要登记。
-严禁快递小哥进入社区。
但是光有策略还不能保证社区的安全,我们需要告诉门卫(iptables)这个策略(规则链)是作用于哪里的,并赋予安保人员可能的操作有这些,如:“允许”,“登记”,“拒绝”,“不理他”,对应到ptables命令中则常见的控制类型有:
- ACCEPT:允许通过
- LOG:记录日志信息,然后传给下一条规则继续匹配.
- REJECT:拒绝通过,必要时会给出提示,
- DROP:直接丢弃,不给出任何回应
其中REJECT和DROP的操作都是将数据包拒绝,但REJECT会再回复一条“您的信息我已收到,但被扔掉了”。
而规则链则依据处理数据包的位置不同而进行分类:
- PREROUTING:在进行路由选择前处理数据包
- INPUT:处理入站的数据包
- OUTPUT:处理出站的数据包
- FORWARD:处理转发的数据包
- POSTROUTING:在进行路由选择后处理数据包
Iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
- raw表:确定是否对该数据包进行状态跟踪
- mangle表:为数据包设置标记
- nat表:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)

规则表的先后顺序:raw→mangle-→nat→filter
规则链的先后顺序:
- 入站顺序:PREROUTING→INPUT
- 出站顺序:OUTPUT→POSTROUTING
- 转发顺序:PREROUTING→FORWARD→POSTROUTING
还有三点注意事项:
- 没有指定规则表则默认指filter表。
- 不指定规则链则指表内所有的规则链。
- 在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项则按链的默认状态处理。
FILTER表:
| filter表 | 主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。filter表是iptables默认使用的表。这个表定义了三个链(chains)。企业工作场景:主机防火墙 |
|---|---|
| INPUT | 负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包 |
| FORWARD | 负责转发流经主机的数据包。起转发的作用,和Nat关系很大。 |
| OUTPUT | 处理所有有源地址是本机地址的数据包。通俗的将,就是处理从主机发出去的数据包。 |
NAT表:
| nat表 | 负责网络地址转换,即来源与目的的ip地址和port的转换。应用:和主机本身无关。一般用于局域网共享上网或者特殊的端口转换服务相关。 NAT功能一般企业工作场景: 1.用于做企业路由(zebra)或网关(iptables),共享上完(postrouting)。 2.做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务。 3.web,单个端口的映射,直接映射80端口。 这个表定义了三个链,nat功能就相当于网络的acl控制,和网络交换机acl类似。 |
|---|
MANGLE表:
| mangle表 | 负责修改数据包中特殊的路由标记,如TTL、TOS、MARK等。这个表定义了五个链(chains) |
|---|---|
| INPUT | |
| FORWARD | |
| OUTPUT | |
| PREROUTING | |
| POSTROUTING |
RAW表:
| raw表 | raw 表是 iptables 中用于处理特殊类型的数据包的表,它可以决定是否对数据包进行连接跟踪(connection tracking),即是否记录数据包的状态信息。连接跟踪是一种消耗资源的操作,如果我们想要提高性能或者避免某些问题,我们可以使用 raw 表来让某些数据包跳过连接跟踪。raw 表只包含两个链:PREROUTING 和 OUTPUT。raw 表是 iptables 中优先级最高的表,它会在其他任何表之前执行。这个表定义了2个链。 |
|---|---|
| PREROUTING | |
| OUTPUT |
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。
所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
我们现在用的比较多个功能有3个:
- filter 定义允许或者不允许的
- .nat 定义地址转换的
- .mangle功能:修改报文原数据
我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
小扩展:
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
2.2、工作流程

iptables 是属于用户空间的东西,他的作用是定义规则。这些规则由处于内核态的netfilter来读取并执行。而放在内核态的地方,必须要指定放入内核态的位置,即必须是 TCP/IP 的协议栈经过的地方。 linux 中一共有 5 个位置:
- 数据包从内核态流入用户态 input链
- 数据包从用户态流入内核态 output链
- 在内核态中:从一个接口流入另一个接口 forward链
- 进入本机的网络接口 prerouting
- 流出本机的网络接口 postrouting
chain遍历优先级:
6. 收到目的地为本机的包: prerouting -> input
7. 收到目的地为其他主机的包:prerouting -> forword -> postrouting
8. 本机产生的包:output -> postrouting
如果收到一个目的地为本机的包:首先会经过 prerouting 链上的 raw、mangle、nat 表;然后再经过 input 链上 mangle、filter、security、nat 表。最终到达本机的某个 socket
2.3、命令格式
iptables命令用于管理防火墙的规则策略,格式为:
iptables [-t table] COMMAND [chain] [CRETIRIA] [-j ACTION]
-t table 表名:可选3个 filter nat mangle
COMMAND 选项:定义如何对规则进行管理
chain 链名:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA 条件:指定匹配标准
-j ACTION 控制类型:指定如何进行处理
比如:
不允许172.16.0.0/16的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
2.4、命令参数
常用参数:
| 参数 | 作用 |
|---|---|
-P | 设置默认策略:iptables -P INPUT (DROP | ACCEPT) |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-s | 匹配来源地址IP/MASK,加叹号!表示除这个IP外 |
-d | 匹配目标地址 |
-i 网卡名称 | 匹配从这快网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如tcp,upd,icmp |
-dport num | 匹配目标端口号 |
-sport num | 匹配来源端口号 |
2.4.1、链管理命令(立即生效)
-P:等价于--policy设置默认策略的(设定默认门是关着的还是开着的)
# 默认策略一般只有两种:
iptables -P INPUT (DROP|ACCEPT) #默认是关的/默认是开的
#比如:
iptables -P INPUT DROP
#这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
-F:等价于--flush,清空规则链的(注意每个链的管理权限)
iptables -t nat -F PREROUTING #清空nat表的PREROUTING链
iptables -t nat -F #清空nat表的所有链
-N:等价于--new,支持用户新建一个链
iptables -N inbound_tcp_web
#表示附在tcp表上用于检查web的
-X:等价于--delete-chain用于删除用户自定义的空链
iptables -X inbound_tcp_web
#使用方法跟-N相同,但是在删除之前必须要将里面的链给清空
-E:等价于--rename-chain用来给用户自定义的链重命名
iptables -E oldname newname
-Z:等价于--zero清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
iptables -Z
2.4.2、规则管理命令
-A:追加,在当前链的最后新增一个规则
iptables -A chain firewall-rule
# 允许22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-I num:插入,把当前规则插入为第几条
# 如果-I后面没有指定具体的规则链位置,那么它默认会将新规则插入到规则链的开头
iptables -A chain firewall-rule
# 允许22端口
iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
-R num:Replays替换/修改第几条规则
# 允许22端口
iptables -R INPUT 3 -p tcp --dport 22 -j ACCEPT
-D num:删除,明确指定删除第几条规则
iptables -D INPUT 3
2.4.3、查看管理命令
-L:等价于--List列出指定链的所有规则
# 列出 chain 或者所有 chain(当未指定 chain 名称时)中的 第 rulenum 条规则或者所有规则(当未指定 rulenum 时)。不过要注意,如果未指定 chain 则不能带 rulenum 参数。
iptables -L [chain [rulenum]]
# 如果在 -L 后再加上 –line-numbers,则表示在每条规则前面显示序号。如:
iptables -L --line-numbers
附加子命令:
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名-v:显示详细信息-vv:显示详细信息-vvv:显示详细信息,越多越详细x:在计数器上显示精确值,不做单位换算--line-numbers:显示规则的行号-t nat:显示所有的关卡信息
2.5、匹配标准
2.5.1、通用匹配(源地址目标地址的匹配)
-s:表示匹配源地址,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
# 而且地址可以取反,加一个“!”表示除了哪个IP之外
# 例如:-s 192.168.1.101 表示针对特定的 ip 地址
# 对于网络掩码,使用 /mask。例如,“-s 192.168.1.0/24″ 表示网络掩码为 255.255.255.0 的所有 192.168.1.x 地址都匹配。
# 如果不指定 -s 参数,默认匹配所有源地址
# 也可以用长参数名 --src 或者 --source
-d:表示匹配目标地址
IP | IP/MASK | 0.0.0.0/0.0.0.0
# 使用方式与上面 -s 一致
# 也可以用长参数名 --dst 或者 --destination
-p:表示匹配协议(这里的协议通常有3种,TCP/UDP/ICMP)
-p PROTOCOL
# 可能的参数值有:tcp, udp, icmp, all
# 使用 “all” 表示适用于所有协议。
# 如果在规则中不指定 -p 参数,则默认使用 “all” 参数。一般不使用 “all” 这个值,要么指定某个特定的协议,要么就指定 -p 参数。
# -p 的参数值既可以用名称(如 tcp)也可以用协议对应的数值(如 6 代表 tcp 协议)
# /etc/protocols 文件中包含了所有允许的协议名称和相应数值
# 也可以用长的参数名 --protocol
-i:表示匹配入站接口
# i 表示 “input interface”(输入接口,即,指定网络数据处理的网卡,一般 eth0 即表示第一块有线网卡的外网接口,lo 表示局域网接口)
# 可以直接理解为 “-i” 表示接口。不过,-i 和 -o 都表示接口,-i 表示输入时的接口,而 -o 特指输出用的接口。
# 指定数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口
-i eth0 #表示该规则应该针对从 eth0 接口进来的数据包
# 如果不指定 -i 参数,则经由系统中所有可用的接口进入的数据包都可以匹配该规则。
# 也可以使用长参数 –in-interface
-o:表示匹配出站接口
# o 表示 “output interface”(出站经由接口)
# 指定发送出去的数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。
# 如果不指定 -o 参数,则经由系统中所有可用的接口发出的数据包都可以匹配该规则。
# 也可以使用长参数 --out-interface
-j:表示跳转
-j ACTION
# j 的意思是 “jump”(跳转) 到目标
# 指定当某个数据包满足该规则的时候的就跳转到的下一个处理规则,而不再顺序执行后面的规则判断
# 可能的值有:ACCEPT(接受), DROP(悄悄丢弃),REJECT(明确拒绝), QUEUE(进入队列), RETURN(返回),MARK(打防火墙标记的),REDIRECT(重定向,主要用于实现端口重定向),MASQUEERADE(源地址伪装),(跳出,通常是从某个 chain 中跳回到调用该 chain 的上层 chain)
# 也可以跳转到某个自定义的 chain 中,使用该 chain 的名称做为跳转目标(DROP好于REJECT)
2.5.2、扩展匹配
隐含扩展:对协议的扩展
-p tcp:TCP的协议的扩展,一般有三种扩展
- –dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21或者--dport 21-23(此时表示21,22,23),也可以使用长名称–destination-port。 - –sport:指定源端口,可以指定端口号(数字),也可以指定端口名称。例如,默认的 SSH 端口号码为 22,名称为 ssh,可以表示为 “–sport 22″ 或者 “–sport ssh”。
/etc/services文件包含了所有允许的端口名称和对应的端口号码。也可以使用长名称--source-port。 - –tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)对于它,可以使用英文半角逗号(,)来指定多个 TCP 状态标识,一般要跟两个参数:
- 检查的标志位
- 必须为1的标志位
--tcp-flags syn,ack,fin,rst syn表示检查这4个位,这4个位中syn必须为1,其他的必须为0
-p udp:UDP协议的扩展
- –dport
- –sport
-p icmp:icmp数据报文的扩展
- –icmp-type:特别指定 ICMP 类型。例如,使用 “
–icmp-type 0″ 表示 “Echo Reply”(响应的数据包),“–icmp-type 8″ 表示 “Echo”(请求回显的数据包)。
显示扩展(-m)
扩展各种模块
-m multiport:表示启用多端口扩展
# 之后我们就可以启用比如
--dports 21,23,80
2.6、常用案例
2.6.1、检查是否安装iptables
iptables --version
如果未安装,使用以下命令重新安装:
sudo install iptables
2.6.2、(可选)安装iptables-persistent
如果你希望在重启后保持iptables规则,可以安装iptables-persistent
sudo install iptables-persistent
# 在安装过程中,会提示你是否要保存当前的 iptables 规则,选择“是”即可。
2.6.3、查看当前规则
sudo iptables -L -n -v
2.6.4、设置默认策略
拒绝所有入站流量:
sudo iptables -P INPUT DROP
允许所有出站流量:
sudo iptables -P OUTPUT ACCEPT
2.6.5、允许特定流量
允许本地回环接口:
sudo iptables -A INPUT -i lo -j ACCEPT
允许SSH(端口22):
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许HTTP(端口80):
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
允许HTTPS(端口443):
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
2.6.6、允许特定IP地址
允许来自特定IP的流量:
sudo iptables -A INPUT -s 192.168.1.100 -j ACCEPT
2.6.7、删除规则
删除特定规则(使用规则编号):
sudo iptables -D INPUT <规则编号>
# 例如
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
2.6.8、保存规则
在Debian/Ubuntu上:
sudo iptables-save > /etc/iptables/rules.v4
在Red Hat/CentOS上:
service iptables save
2.6.9、还原规则
sudo iptalbes-restore < /etc/iptables/rules.v4
2.6.10、清空所有规则
sudo iptables -F
2.6.11、查看特定链的规则
sudo iptables -L INPUT -n -v
2.6.12、记录日志
记录丢弃的包:
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped:"
2.6.13、限制连接速率
限制SSH连接速率:
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m limit --limit 5/minute --limit-burst 10 -j ACCEPT
2.6.14、查看规则详细信息
sudo iptables -S
2.6.15、保存和恢复规则
保存规则:
sudo iptables-save > /etc/iptables/rules.v4
恢复规则:
sudo iptables-restore < /etc/iptables/rules.v4
2.6.16、使用systemctl管理服务
启动服务:
sudo systemctl start iptables
停止服务:
sudo systemctl stop iptables
重启服务:
sudo systemctl restart iptables
注意:确保在使用 iptables 时小心操作,因为不正确的规则可能会导致网络连接中断。
2.6.17、禁止访问22端口
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
2.6.18、禁止某IP访问
iptables -I INPUT -s 10.0.0.5 -j DROP
iptables -I INPUT -s 192.168.10.3 -j DROP
2.6.19、禁止网段连入
# 禁止10.0.0.0/24网段访问22端口
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
# 禁止10.0.0.0/24网段访问8080端口
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP
2.6.20、允许指定网段连入
利用!排除,只准许10.0.0.0/24访问:
iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
修改链默认规则,修改为拒绝,添加准许:
iptables -P INPUT DROP
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
2.6.21、指定多个端口
# 方式一:多次命令
iptables -I INPUT -p tcp --dport 8888 -j DROP
iptables -I INPUT -p tcp --dport 9999 -j DROP
# 方式二:逗号分隔
iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
# 方式三:连续端口可以不加-m multiport 1:1024
iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
2.6.22、匹配ICMP类型(禁止被ping)
ICMP(Internet Control Message Protocol)Internet控制报文协议,ping,是整个网站的核心,通过防火墙规则,控制是否可以ping。
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
通过内核参数,控制禁止被ping:
[root@Ansible ~]# cat /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_all = 0 #0为允许,1为禁止
[root@Ansible ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
2.6.23、匹配网络状态(TCP/IP连接状态)
-m state --state
# NEW:已经或将启动新的连接
# ESTABLISHED:已建立的连接
# RELATED:正在启动的新连接
# INVALID:非法或无法识别的
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2.6.24、限制并发及速率
-m limit限制模块
-m limit --limit 10/minute #每分钟只能有10个数据包 每6秒生成
-m limit --limit n/{second/minute/hour}:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
-m limit --limit 10/minute --limit-burst 5 每6秒释放工牌 给别人使用
#10个数据包
前5个 1个1个工牌 从第6个开始 每6秒 才能释放1个工牌
--limit-burst [n]:在同一时间内允许通过的请求“n”为数字,不指定默认为5
#ping icmp 协议 进行测试
[root@Ansible ~]# iptables -F
[root@Ansible ~]# iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[root@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@Ansible ~]# iptables -P INPUT DROP
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
测试
[root@Web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.298 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=1.33 ms
64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.435 ms
64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.460 ms
64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.758 ms
64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=2.28 ms #7和1之间间隔6秒
64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.793 ms #13和7之间间隔6秒
64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.734 ms
64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.803 ms
^C
--- 10.0.0.61 ping statistics ---
26 packets transmitted, 9 received, 65% packet loss, time 25013ms
rtt min/avg/max/mdev = 0.298/0.877/2.286/0.572 ms
2.6.25、限制并发及速率防火墙规则的保存与恢复
iptables-save 保存,默认输出到屏幕
iptables-restore 恢复,加上文件
写入/etc/sysconfig/iptables
[root@Ansible ~]# iptables-save >/etc/sysconfig/iptables
[root@Ansible ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sun May 7 16:11:34 2023
*nat
:PREROUTING ACCEPT [306:36403]
:INPUT ACCEPT [182:29467]
:OUTPUT ACCEPT [145:11135]
:POSTROUTING ACCEPT [145:11135]
COMMIT
# Completed on Sun May 7 16:11:34 2023
# Generated by iptables-save v1.4.21 on Sun May 7 16:11:34 2023
*filter
:INPUT DROP [17:1428]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [49:5580]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Sun May 7 16:11:34 2023
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables -D INPUT 1
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@Ansible ~]# iptables-restore < /etc/sysconfig/iptables
[root@Ansible ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
此外,systemctl restart iptables 会读取/etc/sysconfig/iptables内容
三、firewalld
firewalld防火墙是Centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。
firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfilter网络过滤子系统(属于内核态)来实现包过滤防火墙功能。
firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。 它支持IPv4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算), 并且拥有两种配置模式:运行时配置与永久配置。
3.1、firewalld与iptables的区别
- ptables主要是基于接口,来设置规则,从而判断网络的安全性。firewalld是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全。与硬件防火墙的设置相类似。
- iptables 在
/etc/sysconfig/iptables中储存配置,firewalld 将配置储存在/etc/firewalld/(优先加载)和/usr/lib/firewalld/(默认的配置文件)中的各种 XML 文件里。 - 使用 iptables 每一个单独更改意味着清除所有旧有的规则和从
/etc/sysconfig/iptables里读取所有新的规则。(规则修改后会立即生效) - iptables 防火墙类型为静态防火墙,firewalld 防火墙类型为动态防火墙。
3.2、firewalld安装与启动
3.2.1、安装firewalld
在大多数基于Red Hat的发行版(如Fedora、CentOS)中,firewalld通常已经预装。如果没有安装,你可以通过以下命令安装:
sudo dnf install firewalld
对于Debian或Ubuntu系统,使用:
sudo apt-get install firewalld
3.2.2、启动和启用firewalld
安装完成后,启动并设置为开机启动:
sudo systemctl start firewalld
sudo systemctl enable firewalld
3.2.3、检查firewalld状态
sudo systemctl status firewalld
3.2.4、配置firewalld
查看当前区域:
sudo firewall-cmd --get-active-zones
列出所有区域:
sudo firewall-cmd --get-zones
更改默认区域:
# 将默认区域更改为 public
sudo firewall-cmd --set-default-zone=public
3.2.5、添加和删除规则
添加规则允许特定端口(例如,HTTP端口80):
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
重新加载 firewalld 以应用更改:
sudo firewall-cmd --reload
删除规则(例如,删除之前添加的HTTP端口80):
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent
3.2.6、查看当前活动的规则
sudo firewall-cmd --list-all --zone=public
3.2.7、防火墙临时禁用和启用
临时禁用:
sudo systemctl stop firewalld
临时启用:
sudo systemctl start firewalld
3.3、firewalld原理
3.3.1、firewalld九个区域
firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone)。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。
| 区域 | 作用 |
|---|---|
trusted(信任区域) | 允许所有的传入流量 |
public(公共区域) | 允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。 |
external(外部区域) | 允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。 默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。 |
home家庭区域 | 允许与ssh、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。 |
internal(内部区域) | 默认值时与home区域相同 |
work(工作区域) | 允许与 ssh、dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。 |
dmz(隔离区域也称为非军事区域) | 允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。 |
block(限制区域) | 拒绝所有传入流量 |
drop(丢弃区域) | 丢弃所有传入流量,并且不产生包含 ICMP的错误响应。 |
最终一个区域的安全程度是取决于管理员在此区域中设置的规则。区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。可以根据网络规模,使用一个或多个区域,但是任何一个 活跃区域 至少需要关联 源地址或接口。默认情况下,public区域是默认区域,包含所有接口(网卡)。
3.3.2、firewalld数据处理流程
firewalld对于进入系统的数据包,会根据数据包的源IP地址或传入的网络接口等条件,将数据流量转入相应区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址。
- 若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突),则执行该区域所制定的规则。
- 若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突),则使用传入网络接口的区域并执行该区域所制定的规则。
- 若网络接口也未关联到特定的区域(即源地址或接口都没有绑定特定的某个区域),则使用默认区域并执行该区域所制定的规则。
3.4、firewalld防火墙配置方法
- 使用firewall-cmd命令行工具
- 使用firewall-config图形工具
- 编写
/etc/firewalld/中的配置文件



配置文件以及图形工具不常用 ,这边就不做过多介绍,下面主要介绍命令行工具的用法。
3.5、firewall-cmd命令选项
--list-all-zones:显示所有区域及其规则--get-default-zone:显示当前默认区域--set-default-zone=:设置默认区域--get-active-zones:显示当前正在使用的区域及其对应的网卡接口--get-zones:显示所有可用的区域--get-zone-of-interface=:显示指定接口绑定的区域--zone= --add-interface=:为指定接口绑定区域--zone= --change-interface=:为指定的区域更改绑定的网络接口--zone= --remove-interface=:为指定的区域删除绑定的网络接口--zone= --add-source=[/]:为指定源地址绑定区域--zone= --change-source=[/]:为指定的区域更改绑定的源地址--zone= --remove-source=[/]:为指定的区域删除绑定的源地址[--zone=] --list-all:显示指定区域的所有规则,省略–zone=时表示仅对默认区域操作[--zone=] --list-services:显示指定区域内允许访问的所有服务[--zone=] --add-service=:为指定区域设置允许访问的某项服务[--zone=] --remove-service=:删除指定区域已设置的允许访问的某项服务[--zone=] --list-ports:显示指定区域内允许访问的所有端口号[--zone=] --add-port=[-]/:为指定区域设置允许访问的某个/某段端口号(包括协议名)[--zone=] --remove-port=[-]/:删除指定区域已设置的允许访问的端口号(包括协议名)[--zone=] --list-icmp-blocks:显示指定区域内拒绝访问的所有 ICMP 类型[--zone=] --add-icmp-block=:为指定区域设置拒绝访问的某项 ICMP 类型[--zone=] --remove-icmp-block=:删除指定区域已设置的拒绝访问的某项ICMP类型firewall-cmd --get-icmptypes:显示所有 ICMP 类型
示例:
[root@shell ~]# firewall-cmd --get-default-zone
public
[root@shell ~]# firewall-cmd --set-default-zone=work
success
[root@shell ~]# firewall-cmd --get-default-zone
work
[root@shell ~]# firewall-cmd --get-active-zones
work
interfaces: ens33 ens37
[root@shell ~]# firewall-cmd --change-interface=ens33 --zone=home
success
[root@shell ~]# firewall-cmd --add-source=2.2.2.2
success
[root@shell ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@shell ~]# firewall-cmd --remove-source=2.2.2.2
success
[root@shell ~]#
[root@shell ~]# firewall-cmd --list-all
work (active)
target: default
icmp-block-inversion: no
interfaces: ens37
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@shell ~]# firewall-cmd --list-services --zone=public
dhcpv6-client ssh
[root@shell ~]# firewall-cmd --list-ports --zone=home
[root@shell ~]# firewall-cmd --list-ports --zone=public
23/tcp
[root@shell ~]# firewall-cmd --list-icmp-blocks
[root@shell ~]# firewall-cmd --list-icmp-blocks --zone=public
[root@shell ~]# firewall-cmd --list-icmp-blocks --zone=home
3.5.1、区域管理
(1)查看默认区域内允许访问的所有服务
firewall-cmd --list-service
(2)添加httpd 服务到public 区域
firewall-cmd --add-service=http --zone=public
(3)查看public 区域已配置规则
firewall-cmd --list-all --zone=public
(4)删除public 区域的httpd 服务
firewall-cmd --remove-service=http --zone=public
(5)同时添加httpd、https 服务到默认区域,设置成永久生效
firewall-cmd --add-service=http --add-service=https --permanent
firewall-cmd --add-service={http,https,ftp} --zone=internal
firewall-cmd --reload
firewall-cmd --list-all
3.5.2、服务管理
(1)允许TCP的443端口到internal 区域
firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd --list-all --zone=internal
(2)从internal 区域将TCP的443端口移除
firewall-cmd --zone=internal --remove-port=443/tcp
(3)允许UDP的2048~2050端口到默认区域
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all
3.5.3、端口管理
(1)允许TCP的443端口到internal 区域
firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd --list-all --zone=internal
(2)从internal 区域将TCP的443端口移除
firewall-cmd --zone=internal --remove-port=443/tcp
(3)允许UDP的2048~2050端口到默认区域
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all
3.5.4、永久生效配置
#添加使用 --permanent选项表示设置成永久生效,需要重新启动firewalld服务或执行firewall-cmd --reload命令 重新加载防火墙规则时才会生效。若不带有此选项,表示用于设置运行时规则,但是这些规则在系统或firewalld服务重启、停止时配置将失效。
firewall-cmd --runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。
856

被折叠的 条评论
为什么被折叠?



