iptables与firewalld防火墙
Firewalld防火墙什么是防火墙Firewalld防火墙的概念Firewalld防火墙运行模式Firewalld防火墙的命令Firewalld防火墙的高级规则iptablesiptables执行过程iptables的表格(table)与链(chain)iptables-filter表规则的查看与清除定义默认策略数据包的基础比对:IP、网络及接口设备TCP、UDP的规则比对:针对端口设置ipta
防火墙概述
- 目标:
- 防火墙:封端口,封IP
- 实现NAT功能
- 共享上网
- 端口映射(端口转发),ip映射
防火墙种类及使用说明
硬件防火墙:整个企业的入口
-
三层路由:H3C 华为 Cisco(思科)
-
防火墙:深信服了,奇安信,绿盟
软件防火墙:开源软件 ,网站内部软件,封IP
- iptables 写入到Linux内核中
- firewalld C7 底层也是iptables
- nftables C8 C9
- ufw (ubuntu firewall)Ubuntu
云防火墙(公有云)
- 安全组(封ip,封端口)
- NAT网关(共享上文,端口映射…)
- waf应用防火墙(主要处理7层的攻击)SQL注入,等攻击
- DDOS高仿
企业选型建议:
中小企业:使用公有云,安全组,waf防火墙,态势感知
访问量巨大:使用硬件防火墙,waf防火墙,硬件服务器+云服务器
iptables
iptables是一个在Linux系统上进行网络包过滤和防火墙配置的工具。它允许系统管理员定义不同规则和策略来控制网络流量的传输。
iptables执行过程
要使用iptables前,先关闭firewalld防火墙
#这里使用的kylinv10sp3
1. 关闭firewalld防火墙
systemctl stop firewalld && systemctl disable firewalld
2. 安装iptables
yum install -y iptables-services
3. 启动iptables
systemctl enable --now iptables

工作流程
- 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的
- 如果匹配成功规则,即明确标识是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则
- 如果规则中没有明确表面是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过
- 防火墙的默认规则是所有规则都匹配完才会匹配的
iptables的表(table)与链(chain)
为什么称为iptables呢?因为这个防火墙里面有很多个表(table),每个表都定义出自己的默认策略与规则,且每个表的用途都不相同
常用的四表五链
四表:Filter表(默认)、Nat表、Raw表、Mangle表
五链:INPUT链、OUTPUT链、FORWARD链、PREROUTING链、POSTROUTING链

Filter表
filter表:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)
filter表是iptables默认使用的表,这个表定义了三个链(chains)
企业工作场景:主机防火墙
| Filter表常用的三个链 | 说明 |
|---|---|
| INPUT | 负责过滤所有目标地址是本机的数据包,通俗来说:就是过滤进入主机的数据包(能否让数据包进入服务器) |
| FORWARD | 路过:负责转发流经主机的数据包。起转发作用,和NAT关系很大 |
| OUTPUT | 处理所有源地址是本机地址的数据包,通俗的讲:就是处理主机发出的数据包 |
nat表
nat:负责网络地址转换的,即来源与目的IP地址和port的转换
应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关
工作场景:
- 用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
- 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)
- web,单个端口的映射,直接映射80端口(PREROUTING)这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似
| nat表常用的三个链 | 说明 |
|---|---|
| OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址 |
| PREROUTING | 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等 就是收信时,根据规则重写收件人的地址 |
| POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等 写好发件人的地址,要让家人回信时能够有地址可回 例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址 生成应用:局域网共享上网 |
mangle表
Mangle表用于对数据包进行标记和修改操作,它包含了PREROUTING链、INPUT链、FORWARD链、OUTPUT链和POSTROUTING链。
raw表
Raw表用于数据包的预处理,它包含了PREROUTING链和OUTPUT链
Raw、Mangle等其他表较少使用,如果使用到可以查看【man iptables】
如下图iptables内建各表格与链的相关性简图,拿掉了Mangle

- 数据包进入Linux主机使用资源(路径A):在路由判断后确定是项Linux主机请求数据的数据包,主机就会通过Filter的INPUT链来进行控制
- 数据包通过Linux主机的转递,没有使用主机资源,而是向后端主机流动(路径B):在路由判断之前进行数据包报头的修订后,发现数据包主要是要通过防火墙而去后端,此时数据包就会通过路径B来移动。也就是说,该数据包的目标并非Linux本机主要经过的链是Filter的FORWARD以及NAT的POSTROUTING、PREROUTING
- 数据包由Linux本机发送出去(路径C):例如响应客户端的要求,或者是Linux 本机主动送出的数据包,都是通过路径C来进行的。先是通过路由判断,决定了输出的路径后,再通过Filter的OUTPUT链来传送。当然,最终还是会经过NAT的POSTROUTING 链。
iptables-filter表
规则的查看、保存、清除
查看
[root@chenshiren ~]# iptables [-t tables] [-L] [-nv]
#选项
-t :后面接table,例如nat或filter,若省略此项目,则默认使用的filter
-L :列出目前的table的规则
-n :不进行IP与HOSTNAME的反查,显示信息的速度会快很多
-v :列出更多的信息,包括通过该规则的数据包总位数、相关的网络接口等
# 示例1 列出filter表所有规则
[root@chenshiren ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
# 第一条规则允许所有与已建立的和相关的连接通过
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
# 第二条规则允许TCP协议的源端口为22的数据包通过(用于SSH连接)
ACCEPT all -- 192.168.0.0/24 0.0.0.0/0
# 第三条规则允许来自192.168.0.0/24网络的所有数据包通过
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
# 第一条规则允许所有与已建立的和相关的连接通过
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
# 第一条规则允许所有与已建立的和相关的连接通过
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
# 第二条规则允许TCP协议的目标端口为80的数据包通过(用于HTTP连接)
# 示例2 列出nat表所有规则
[root@m01 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
#上面的输出中每个Chain代表一个链,Chain那一行括号里面的policy就是默认策略
#target:代表进行的操作,ACCEPT是放行,而REJECT则是拒绝,此外,还有DROP(丢弃)
#port :代表使用的数据包协议,主要有TCP、UDP及ICMP3种数据包格式
#opt :额外的选项说明
#source:代表此规则是针对哪个来源IP进行限制
#destination:代表此规则是针对哪个目标IP进行限制
保存
iptables-save命令是用于将当前的iptables规则保存到文件或列出防火墙规则的命令
[root@chenshiren ~]# iptables-save [-t table]
选项:
-t:可以针对某些表格来输出,例如仅对NAT或Filter等
# 保存防火墙规则到iptables配置文件
[root@chenshiren ~]# iptables-save > /etc/sysconfig/iptables
清除
[root@chenshiren ~]# iptables [-t talbes] [-FXZ]
选项:
-F:清楚所有的已制订的规则
-X:除掉所有用户"自定义"的chain(tables)
-Z:将所有的chain的计数与流量统计都归零
-D:delete删除 -D INPUT 1
# 示例1 清除本机防火墙(filter)的所有规则,并保存规则到配置文件
[root@chenshiren ~]# iptables -F
[root@chenshiren ~]# iptables -X
[root@chenshiren ~]# iptables -Z
[root@chenshiren ~]# iptables-save > /etc/sysconfig/iptables
定义默认策略
数据包不在我们设置的规则之内,则该数据包的通过与否,是以Policy的设置为准
[root@chenshiren ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项:
-P(大写):定义策略
ACCEPT:该数据包可接受
DROP:该数据包直接丢弃,不会让Client端知道为何丢弃
# 示例1 将本机的INPUT设置为DROP,其他设置为ACCEPT(在本地运行,远程连接运行会断开连接)
[root@chenshiren ~]# iptables -P INPUT DROP
[root@chenshiren ~]# iptables -P OUTPUT ACCEPT
[root@chenshiren ~]# iptables -P FORWARD ACCEPT
[root@chenshiren ~]# iptables-save > /etc/sysconfig/iptables
数据包的基础比对:IP、网络及接口设备
[root@chenshiren ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源IP/网络] [-d 目标IP/网络] [ACCEPT|DROP|REJECT|LOG]
选项:
-AI 链名:针对某条链进行规则的“插入”或“累加”
-A:新增一条规则,该规则增加在原规则的最后面,例如原来已经有四条规则
使用-A就可以加上第五条规则
-I:插入一条规则,该规则增加在原规则的最后面。
例如原本有四条规则,使用-I则该规则变成第一条,而原本4条变成第2~5条
链:有INPUT、OUTPUT、FORWARD等,此链名称又与-io有关
-io 网络接口:设置数据包进出的接口规范
-i:数据包所进入的哪个网络接口,例如 eth0、lo等接口。需与INPUT链配合
-o:数据包所传出的那个网络接口,需与OUTPUT链配合
-p 协议:设置此规则适用于哪种数据包格式
主要的数据包格式又:tcp、udp、icmp及all
-a 来源IP/网络:设置此规则之数据包的来源地,可指定单纯的 IP 或网络,例如:
IP :192.168.0.100
网络:192.168.0.0/24、192.168.0.0/255.255.255.0 均可
若规范为“不许”时,则加上“!”即可,例如:
-s! 192.168.100.0/24表示不接受 192.168.100.0/24 发来的数据包
-d 目标IP/网络:同s,只不过这里指的是目标的IP或网络。
-j:后面接操作,主要的操作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
# 示例1 只要来自内网的(192.168.200.0/24)的数据包就通通接受
[root@chenshiren ~]# iptables -A INPUT -s 192.168.200.0/24 -j ACCEPT
# 示例2 只要来自(192.168.200.20)就接受,来自(192.168.200.10)就丢弃
[root@chenshiren ~]# iptables -A INPUT -s 192.168.200.10 -j DROP
[root@chenshiren ~]# iptables -A INPUT -s 192.168.200.20 -j ACCEPT
# 示例3 如果想要记录某个规则的记录
[root@chenshiren ~]# iptables -A INPUT -s 192.168.1.5 -j LOG
# 只要有数据包来自192.168.1.5这个IP时,那么该数据包的相关信息就会被写入到内核日志文件
# /var/log/messages这个文件中,然后该数据包会进行后续的规则比对
TCP、UDP的规则比对:针对端口设置
[root@chenshiren ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源IP/网络] [--sport 端口范围] [-d 目标IP/网络] [--dport 端口范围] [ACCEPT|DROP|REJECT]
选项:
--sport 端口范围:限制来源的端口号码,端口号码可以是连续的,例如 1024:65535
--dport 端口范围:限制目标的端口号码
# 事实上就是多了--sport和--dport两个选项,重点在port,不过需要特别注意的是
# 因为仅有TCP与UDP数据包具有端口,因此要想使用--dport、--sport时,需要加上-p tcp或-p udp
# 的参数才会成功
# 示例1 想要连接进入本机port 21 的数据包都要阻挡掉
[root@chenshiren ~]# iptables -A INPUT -p tcp --dport 21 -j DROP
# 示例2 想要连接本台主机的网上邻居(udp port 137,138 tcp port 139,445)就放行
[root@chenshiren ~]# iptables -A INPUT -p udp --dport 137:138 -j ACCEPT
[root@chenshiren ~]# iptables -A INPUT -p tcp --dport 139 -j ACCEPT
[root@chenshiren ~]# iptables -A INPUT -p tcp --dport 445 -j ACCEPT
# 示例3 只要来自192.168.1.0/24的 1024:65535端口的数据包,且想要连接到本机的ssh port 就阻挡
[root@chenshiren ~]# iptables -A INPUT -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP
# 示例4 将来自任何地方来源 port 1:1023 的主动连接到本机端的 1:1023连接丢弃
[root@chenshiren ~]# iptables -A INPUT -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
# --syn:参数表示匹配TCP连接的SYN标志。TCP协议在建立连接时
# 双方会进行三次握手,发送SYN和ACK标志来确认和同步连接
iptables模块
iptables允许加载外部的扩展模块,以提供额外的功能和匹配条件。
iptables可以通过一个状态模块来分析这个想要进入的数据包是否为刚刚发出去的响应,如果是刚刚发出去的响应,那么久予以接受放行。
[root@chenshiren ~]# iptables -A INPUT [-m state] [--state 状态]
选项:
-m :一些iptables的外挂模块,主要常见的有
state:状态模块
mac:网卡硬件地址
multiport 在一条规则中匹配 “多个不连续的端口”
--state:一些数据包的状态,主要有:
INVALID :无效的数据包,例如数据破损的数据包状态
ESTABELISHED:已经连接成功的连接状态
NEW:想要新建立连接的数据包状态
RELATED:表示这个数据包是与主机发送出去的数据包有关
# 示例1 只要已建立或已发出请求相关的数据包就予以通过,不合法数据包就丢弃
[root@chenshiren ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 示例2 针对局域网内的 aa:bb:cc:dd:ee:ff 主机开放其连接
[root@chenshiren ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd::ee:ff -j ACCEPT
# 示例3 允许目标端口为 80、443、8080 的 TCP 入站流量
iptables -I INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
ICMP数据包规则的比对:针对是否响应ping来设计
[root@chenshiren ~]# iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
选项:
--icmp-type :后面必须要接ICMP的数据包类型,也可以使用代号
例如 8 代表 echo request 的意思
# 示例1 禁止其他主机ping本机IP
[root@chenshiren ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables-nat表
NAT的全名是Network Address Translation,即网络地址的转换。
什么是NAT?SNAT?DNAT?
通过iptables内建各表格与链的相关性简图可以知道

(1) 先经过NAT table 的 PREROUTING链
(2)再经路由器判断确定这个数据包是否要进入本机,若不进入本机,则下一步
(3) 再经Filter table 的FORWARD链
(4) 通过NAT table 的POSTROUTING 链,最后传送出去
NAT 服务器的重点就在于上面的第 1、4 步,也就是 NAT table 的两条重要的链:PREROUTING 与 POSTROUTING
重点在于修改IP,但是这两条链修改的 IP 是不一样的
-
POSTROUTING 修改的是来源 IP -
PREROUTING 则修改的是目标 IP。
由于修改的 IP 不一样,所以就称为来源 NAT(Source NAT,SNAT)及目标NAT(Destination NAT,DNAT)。
来源NAT(SNAT):修改数据包报头的来源项目
如图,在客户端192.168.1.100这台主机要连接到http://www.bilibili.com时,它的数据包报头如何变化

(1) 客户端所发出的数据包报头中,来源会是192.168.1.100,然后传送到NAT这台主机
(2) NAT主机的内部接口(192.168.1.2)接收到这个数据包后,会主动分析报头数据,因为报头数据显示目的并非Linux本机,所以开始经过路由分析,将此数据包转到可以连接internet的Public IP处
(3)由于 private lP 与 public lP 不能互通,所以 Linux 主机通过 iptables 的 NAT table 内
的 POSTROUTING 链将数据包报头的来源伪装成为 Linux 的 publicIP,并且将两个不同来源(192.168.1.100及 publiclP)的数据包对应写入暂存内存当中,然后将此数据包传送出去

(1) 在 Internet 上的主机接到这个数据包时,会将响应数据传送给 public IP 的主机
(2) 当 Linux NAT 服务器收到来自 Internet 的响应数据包后,会分析该数据包的序号并比对刚刚记录到内存当中的数据,由于发现该数据包为后端主机之前传送出去的因此在 NAT PREROUTING 链中,会将目标 IP 修改成为后端主机,亦即那台192.168.1.100,然后发现目标已经不是本机(publiclP),所以开始通过路由分析数据包流向。
(3) 数据包会传送到 192.168.1.2 这个内部接口,然后再传送到最终目标 192.168.1.100机器上去
目标NAT(DNAT):修改数据包报头的目标项目
SNAT主要是应付内部LAN连接到internet的使用方式,DNAT则主要用在为内部主机架设可以让internet访问的服务器,类似下图

(1) 外部主机想要连接到目的端的 WWW 服务,则必须要连接到 NAT 服务器上
(2) NAT服务器已经设置好要分析出 port 80 的数据包,所以当 NAT 服务器接到这个数据包后,会将目标 IP 由 public IP 改成 192.168.1.210,且将该数据包相关信息记录下来,等待内部服务器的响应。
(3) 上述的数据包在经过路由分析后,来到 private 接口处,然后通过内部的 LAN 传送到192.168.1.210 上
(4) 192.186.1.210 会响应数据给 61.xx.xx.xx,这个回应当然会传送到 192.168.1.2 上去
(5) 经过路由判断后,来到 NAT POSTROUTING 的链,然后通过第二步骤的记录,将来源 IP由 192.168.1.210 改为 public IP 后,就可以传送出去了
SNAT实现共享上网
IP分享器的动能其实就是SNAT,作用就只是iptables内的NAT表格中,那个路由判断后的POSTROUTING链所做的工作就是进行IP的伪装。NAT服务器必须要有一个Public IP接口,以及一个内部的LAN连接的privateIP接口才行。
| 主机 | 网卡 |
|---|---|
| 主机A | public ip:192.168.200.10 privatel ip:192.168.100.10 |
| 主机B | privatel ip:192.168.100.20 |
# 1.将主机A privatel ip设置为主机B的网关(自行设置)
# 2.ping一下
ping www.baidu.com
# 应该是不通的
# 3. 主机A启用Linux的IP转发功能
[root@chenshiren ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@chenshiren ~]# sysctl -p
# 4. 主机A设置iptables规则(两种)
# 方法1 伪装
# 参数说明:
# MASQUERADE :这个设置就是IP伪装成为数据包出去(-o)的那设备的IP
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
# 方法2
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.200.10
# 方法2 变种如果想轮流使用不同的IP时
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.200.10-192.168.200.20
# 5. 主机B 测试是否能ping通
可以ping通说明正常
DNAT实现端口转发
假设内网有台主机IP为192.168.100.20,该主机是可对internet开放的WWW服务器。如何通过NAT机制,将WWW数据包传到该主机上
| 主机 | 网卡 |
|---|---|
| 主机A | public ip:192.168.200.10 privatel ip:192.168.100.10 |
| 主机B | privatel ip:192.168.100.20(安装httpd) |
# 1.将主机A privatel ip设置为主机B的网关(自行设置)
# 2.主机A启用Linux的IP转发功能
# 3.主机B安装httpd 并配置网页内容
yum install -y nginx # 安装
systemctl enable nginx --now # 启动并开机自启
echo "<h1>hello DNAT</h1>" > /usr/share/nginx/html/index.html # 写入网站主页内容
iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 开放80端口(重点 关系到后面能不能访问)
# 4. 主机A设置iptables规则
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.100.20:80
# 上面的-j DNAT --to-destination IP[:port]是关键所在
# 代表从ens224这个接口传入的,且想要使用port 80的服务时,将该数据包重新传递到192.168.100.20:80的IP及port上,同时修改IP与port

DNAT实现远程连接内网服务器
还是使用上面所设置的环境,不过不用再开放端口了(因为默认已经开放了22端口)
# 1. 主机A设置iptables规则
iptables -t nat -A PREROUTING -p tcp --dport 9000 -j DNAT --to-destination 192.168.100.20:22
# 2. 使用shell终端连接
# 记得设置端口为9000IP为192.168.200.10

Firewalld防火墙
Firewalld防火墙的概念
firewalld是Linux系统上的一种动态防火墙管理工具。它是Red Hat公司开发的,现在已经被很多Linux发行版广泛采用。相比于传统的iptables防火墙,firewalld具有更加灵活和易用的特点,可以实现更加细粒度的网络访问控制。
firewalld防火墙主要包括如下几个方面:
- 区域(zone)
firewalld将网络的不同部分分为若干个区域,每个区域都有一组预定义的规则集合。例如,public区域适用于公共互联网环境下的主机,internal区域适用于内部网络环境下的主机。
| 区域 | 默认策略 |
|---|---|
| trusted | 允许所有数据包 |
| home | 拒绝流入的流量,除非与流出的流量相关,允许ssh、mdns、ippclient、amba-client、dhcpv6-client服务通过 |
| internal | 等同于home |
| work | 拒绝流入的流量,除非与流出的流量相关,允许ssh、ipp-client、dhcpv6-client服务通过 |
| public | 拒绝流入的流量,除非与流出的流量相关,允许ssh、dhcpv6-client服务通过 |
| external | 拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过 |
| dmz | 拒绝流入的流量,除非与流出的流量相关,允许ssh服务通过 |
| block | 拒绝流入的流量,除非与流出的流量相关,非法流量采取拒绝操作 |
| drop | 拒绝流入的流量,除非与流出的流量相关,废了流量采取丢弃操作 |
- 服务(Service)
在firewalld中,防火墙服务是一组预定义的规则,用于允许或拒绝对特定端口的访问。每个服务都有一个名称,并与一个或多个端口相关联。例如,HTTP服务通常使用端口80,可以定义一个HTTP服务规则来允许对该端口的访问
- 端口(Port)
firewalld防火墙的端口规则是一种基于端口号的规则,用于控制特定端口的访问。它可以允许或拒绝特定端口的进出流量。firewalld中的端口规则可以应用于指定的区域或服务,也可以直接应用于所有区域。
Firewalld防火墙运行模式
firewalld防火墙有两种运行模式:(运行时模式)runtime模式和(永久模式)permanent模式。
runtime模式:
runtime模式是指firewalld防火墙在内存中的运行模式。在这种模式下,所有的防火墙规则都是临时的,它们只会在系统重新启动前保持有效。可以使用firewall-cmd命令在runtime模式下添加、删除、修改防火墙规则,但是这些更改在系统重新启动后会被清除。
permanent模式:
permanent模式是指firewalld防火墙在硬盘上的运行模式。在这种模式下,所有的防火墙规则都是永久的,它们会被保存在硬盘上,并在系统重新启动后仍然有效。可以使用firewall-cmd命令的--permanent选项将防火墙规则添加、删除、修改到permanent模式中。
Firewalld防火墙的命令
查看,开启和停止firewalld服务
语法:
systemctl [选项] firewalld
status:检查指定服务的运行状况
start:启动指定服务
stop:停止指定服务
restart:重启指定服务
reload:重新加载指定服务的配置文件
管理firewall配置
firewall-cmd [参数选项1] ... [参数选项n]
常用选项
- 查看防火墙规则:
firewall-cmd --list-all
[root@localhost ~]# firewall-cmd --list-all
public (active) # 防火墙区域名称
target: default # 是防火墙的默认策略
icmp-block-inversion: no # 如果启用,则允许所有 ICMP 流量
interfaces: ens34 # 列出了防火墙所绑定的网络接口
sources: # 列出了允许连接到防火墙的源 IP 地址或地址段
services: dhcpv6-client ssh # 列出了允许通过防火墙的服务
ports: # 列出了防火墙开放的端口
protocols: # 列出了防火墙允许的协议
masquerade: no # 表示未启用地址伪装
forward-ports: # 列出了防火墙上设置的端口转发规则
source-ports: # 列出了允许从防火墙发起的源端口。
icmp-blocks: # 列出了防火墙阻塞的 ICMP 类型
rich rules: # 列出了其他自定义的复杂规则
- 查看可用的zone:
firewall-cmd --get-zones。
[root@localhost ~]# firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
- 查看当前zone:
firewall-cmd --get-default-zone。
[root@localhost ~]# firewall-cmd --get-default-zone
public
- 设置默认的zone:
firewall-cmd --set-default-zone=public。
[root@localhost ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public # 默认就是public,所以再次设置会告诉当前状态已经是public
success # 执行成功
[root@localhost ~]# firewall-cmd --reload # 设置完成后一定要重新加载防火墙规则才会生效
success
- 查看zone的详细信息:
firewall-cmd --zone=public --list-all。
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 开放端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent。
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success # 设置成功会显示 success
[root@localhost ~]# firewall-cmd --reload # 设置完成后一定要重新加载防火墙规则才会生效
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 设置成功
- 关闭端口:
firewall-cmd --zone=public --remove-port=80/tcp --permanent。
[root@localhost ~]# firewall-cmd --zone=public --remove-port=80/tcp --permanent
success # 设置成功会显示 success
[root@localhost ~]# firewall-cmd --reload # 设置完成后一定要重新加载防火墙规则才会生效
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 开放服务:
firewall-cmd --zone=public --add-service=http --permanent。
[root@localhost ~]# firewall-cmd --zone=public --add-service=http --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 关闭服务:
firewall-cmd --zone=public --remove-service=http --permanent。
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 允许源IP访问:
firewall-cmd --zone=public --add-source=192.168.200.0/24 --permanent。
[root@localhost ~]# firewall-cmd --zone=public --add-source=192.168.200.0/24 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources: 192.168.200.0/24
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 拒绝源IP访问:
firewall-cmd --zone=public --remove-source=192.168.200.0/24 --permanent
[root@localhost ~]# firewall-cmd --zone=public --remove-source=192.168.200.0/24 --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
- 重新加载防火墙规则:
firewall-cmd --reload。
Firewalld防火墙的高级规则
在使用防火墙时,基础规则通常可以满足大多数情况下的需求,例如简单的端口和服务控制等。但是在一些更加复杂的场景下,基础规则的灵活性和细粒度控制就显得有限,这时需要使用高级规则来实现更加精细的流量控制,而 rich rule 就是 firewalld 防火墙中的一种高级规则。
在使用 firewall-cmd 命令设置 rich rule 高级规则时,可以参考以下常用参数:
family:指定网络协议族,可选值为ipv4、ipv6、inet、inet6、arp。例如:family="ipv4"source address:指定源 IP 地址,可以为单个 IP、IP 段或 CIDR 网段,例如source address="192.168.1.1"、source address="192.168.1.1-192.168.1.10"或source address="192.168.1.0/24"。port port:指定端口号,可以为单个端口、端口段或者逗号分隔的多个端口,例如port port="8080"protocol:指定协议,可以为tcp、udp、icmp等协议。service name:指定服务名,可以为/etc/services中定义的服务名称,如http、ftp等。action:指定动作,可以为accept、drop、reject、masquerade、redirect等动作。
要注意的是,在使用 rich-rules 规则时,必须使用双引号将参数值括起来,例如:source address="192.168.1.0/24"。还有就是,不能同时设置port 和 service name
测试案例
- 启动一个简单的HTTP服务器,可以通过浏览器访问到主机上的文件
[root@localhost ~]# nohup python -m SimpleHTTPServer 8080 > ceshil.log 2>&1 &
# python -m SimpleHTTPServer 8080
# 这行命令的意思是在本地主机上启动一个简单的HTTP服务器
# 监听8080端口,可以通过浏览器访问本地主机上的文件。
- 设置规则
[root@localhost ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" accept' --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.200.0/24" port port="8080" protocol="tcp" accept
# 我这里仅是展示了高级规则的使用方法,也可以使用基础规则设置。
- 访问浏览器
已经访问到了当前目录下的文件
[root@localhost ~]# ls -al
总用量 522640
dr-xr-x---. 6 root root 4096 6月 6 14:42 .
dr-xr-xr-x. 17 root root 239 5月 28 21:21 ..
-rw-r--r--. 1 root root 254 5月 29 12:17 0520source
drwx------. 4 root root 27 5月 26 13:11 .ansible
-rw-r--r--. 1 root root 113 6月 1 21:15 ansible.yaml
-rwxr-xr-x. 1 root root 8472 5月 29 10:19 a.out
-rw-------. 1 root root 5792 6月 6 13:47 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
drwxr-xr-x. 4 root root 55 6月 2 12:53 ceshi
-rw-r--r--. 1 root root 233 6月 6 14:57 ceshil.log
-rw-r--r--. 1 root root 254 5月 29 10:19 cos_value.c
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw-r--r--. 1 root root 535099919 5月 30 12:21 DjangoBlog.tar.gz
-rw-r--r--. 1 root root 86 5月 29 09:23 haha.c
-rw-r--r--. 1 root root 319 5月 29 09:31 main.c
-rw-r--r--. 1 root root 160 5月 29 11:43 makefile
-rw-r--r--. 1 root root 273 5月 29 12:18 ntp-4.2.8p3.tar.gz
drwxr-----. 3 root root 19 5月 26 12:00 .pki
-rw-r--r--. 1 root root 237 5月 29 10:16 sin_value.c
drwx------. 2 root root 57 5月 27 08:50 .ssh
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-------. 1 root root 0 6月 4 15:08 .viminfo
在一个局域网的小伙伴们就可以使用这个命令一起共享文件,下载到本地上

更多的firewall-cmd命令请查看
[root@localhost ~]# firewall-cmd --help
更多推荐

所有评论(0)