firewalld常用的基础配置

news2025/1/15 20:45:16

firewalld防火墙是centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。

  • 支持IPv4、IPv6防火墙设置以及以太网桥
  • 支持服务或应用程序直接添加防火墙规则接口
  • 拥有两种配置模式:临时模式、永久模式

firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfilter网络过滤子系统(属于内核态)来实现包过滤防火墙功能。

firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。

2 Firewalld和iptables的关系

2.1 Firewalld和iptables的关系

netfilter

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的“内核态”

Firewalld/iptables

  • CentOS7默认的管理防火墙规则的工具(Firewalld)
  • 称为Linux防火墙的“用户态”

1.png

2.2 Firewalld和iptables的区别

1、对规则的设置不同:

  • ptables主要是基于接口(网卡),来设置规则,从而判断网络的安全性。
  • firewalld是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全。与硬件防火墙的设置相类似。

2、配置文件不同:

  • iptables在/etc/sysconfig/iptables中储存配置;

  • firewalld 将配置储存在/etc/firewalld/(优先加载)和/usr/lib/firewalld/(默认的配置文件)中的各种XML文件里。

    • /etc/firewalld/中没有相关区域的配置文件时,才会加载/usr/lib/firewalld/中的配置文件。

3、对规则的修改:

  • 使用iptables每一个单独更改,意味着清除所有旧的规则和从/etc/sysconfig/iptables里读取所有新的规则。
  • 使用firewalld却不会再创建任何新的规则,仅仅运行规则中的不同之处。因此firewalld可以在运行时间内,改变设置而不丢失现行连接。

4、防火墙类型不同:

  • iptables防火墙类型为静态防火墙
  • firewalld防火墙类型为动态防火墙

3 Firewalld区域

3.1 firewalld区域的概念

firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone)。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。

这些区域配置文件存在于/usr/lib/firewalld/zones目录中,还有一个目录/etc/firewalld/zones。firewalld使用规则时,会首先到/etc/firewalld/目录中查找,如果可以找到就直接使用,找不到会继续到/usr/lib/firewalld/目录中查找。

3.2 firewalld防火墙定义了9个区域

区域作用
trusted(信任区域)允许所有的传入流量。
public(公共区域)允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
external(外部区域)允许与ssh预定义服务匹配的传入流量其余均拒绝。
home(家庭区域)允许与ssh、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其他均拒绝。
internal(内部区域)默认值与home区域相同。
work(工作区域)允许与ssh、dhcpv6-client预定义服务匹配的传入流量,其他均拒绝
dmz(隔离区域也称非军事区域)允许与ssh预定义服务匹配的传入流量,其他均拒绝。
block(限制区域)拒绝所有传入流量。
drop(丢弃区域)丢弃所有传入流量,并且不产生包含icmp的错误响应。

3.3 firewalld区域介绍和区域优先级

firewalld区域介绍

  • 最终一个区域的安全程度是取决于管理员在此区域中设置的规则。
  • 区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。
  • 可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口。
  • 默认情况下,public区域是默认区域,包含所有接口(网卡)。

firewalld数据处理流程

检查数据来源的源地址:

  • 若源地址关联到特定的区域,则执行该区域所指定的规则
  • 若源地址未关联到特定的区域,则使用传入网络接口的区域 并执行该区域所指定的规则
  • 若网络接口未关联到特定的区域,则使用默认区域并执行该 区域所指定的规则

区域优先级:源地址绑定的区域 > 网卡绑定的区域 > 默认区域(只要没有绑定过指定区域的网卡,都适用于于默认区域的规则。默认区域可自定义,不修改则为public)

2.png

4 Firewalld防火墙的配置方法

1、firewall-config 图形化工具(生产环境一般只有字符界面,不使用这种方法)

2、firewall-cmd 命令行工具(生产环境中没有图形化界面,所以只能在命令行进行配置)

3、编写 /etc/firewalld 中的配置文件。

  • Firewalld 会优先使用/etc/firewalld/中的配置,如果不存在配置文件,则使用/usr/lib/firewalld/中的配置。

    • /etc/firewalld/:用户自定义配置文件,需要时可通过从/usr/lib/firewalld/ 中拷贝
    • /usr/lib/firewalld/ :默认配置文件,不建议修改,若恢复至默认配置,可直接删除/etc/firewalld/ 中的配置

4.1 firewall-config 图形化工具

在命令行输入”firewall-config“,回车后会弹出图形化管理工具。生产环境一般只有字符界面,不使用这种方法。

3.png

4.png

4.2 firewall-cmd 命令行工具

常用的 firewall-cmd 命令选项:

不指定区域时,则对默认区域进行操作(默认区域可自定义,不修改则为public)

 

ini

复制代码

 #默认区域  --get-default-zone :显示当前默认区域  --set-default-zone=<zone> :设置默认区域  ​  --get-active-zones :显示当前正在使用的区域及其网卡接口  --get-zones:显示所有可用的区域  ​  #网络接口  --get-zone-of-interface=ens33 :查看指定接口ens33绑定的区域  --zone=<zone> --add-interface=<interface> :为指定接口绑定区域  --zone=<zone> --change-interface=<interface> :为指定区域更改绑定的网络接口  --zone=<zone> --remove-interface=<interface> :为指定区域删除绑定的网络接口  ​  #源地址  --zone=<zone> --add-source=<source>[/<mask>] :为指定源地址绑定区域  --zone=<zone> --change-source=<source>[/<mask>] :为指定的区域更改绑定的源地址  --zone=<zone> --remove-source=<source>[/<mask>] :为指定的区域删除绑定的源地址  ​  #显示指定区域的所有规则  --list-all-zones :显示所有区域及其规则  --zone=<zone> --list-all :显示所有指定区域的所有规则,若不指定区域表示仅对默认的区域操作  ​  #服务管理  --zone=<zone> --list-service :显示指定区域内允许访问的所有服务  --zone=<zone> --add-service=<service> :为指定的区域设置允许访问的某项服务  --zone=<zone> --remove-service=<service> :删除指定区域已设置的允许访问的某项服务  ​  #端口管理  --zone=<zone> --list-ports:x显示指定区域内允许访问的所有端口号  --zone=<zone> --add-port=<poreid>[-portid]/<portocol>:为指定的区域设置允许访问的某个端口号/某段端口号(包括协议)  --zone=<zone> --remove-port=<poreid>[-portid]/<portocol>:删除指定区域已设置允许访问的端口号(包括协议)  ​  #icmp协议  --zone=<zone> --list-icmp-blocks :显示指定区域内拒接访问的所有icmp类型  --zone=<zone> --add-icmp-block=<icmptype>:为指定区域设置允许访问的某项icmp类型  --zone=<zone> --remove-icmp-block=<icmptype>删除指定区域已设置允许访问的某项icmp类型  firealld-cmd --get-icmptypes :显示所有icmp类型

5 Firewalld两种配置模式

运行时配置:

  • 实时生效,并持续至Firewalld重新启动或重新加载配置文件
  • 不中断现有连接
  • 不能修改服务器配置

永久配置:

  • 不立即生效,除非Firewaddl重新启动或重新加载配置
  • 中断现有连接
  • 可以修改服务配置

5.1 运行时配置(临时配置)

运行时配置,实时生效,不会中断现有连接。重启后丢失。

示例1:查看和设置默认区域

--get-default-zone :显示当前默认区域

--set-default-zone=< zone> :设置默认区域

--get-active-zones :显示当前正在使用的区域及其网卡接口

 

swift

复制代码

 [root@yuji ~]# firewall-cmd --get-default-zone   //显示当前默认区域  public  [root@yuji ~]# firewall-cmd --get-active-zone   //当前正在使用的区域及其网卡接口  public   interfaces: ens33  [root@yuji ~]# firewall-cmd --set-default-zone=home //将默认区域设置为home  success  [root@yuji ~]# firewall-cmd --get-default-zone //显示当前默认区域  home  [root@yuji ~]# firewall-cmd --set-default-zone=public //将默认区域设置为public  success

5.png

示例2:对指定网卡进行操作

add 增加绑定,change修改,remove 删除

 

kotlin

复制代码

 #增加绑定  [root@yuji ~]# firewall-cmd --get-active-zone  public   interfaces: ens34 ens33  [root@yuji ~]# firewall-cmd --zone=work --add-interface=ens33  The interface is under control of NetworkManager, setting zone to 'work'.  success  [root@yuji ~]# firewall-cmd --get-active-zone  work   interfaces: ens33  public   interfaces: ens34      #修改网卡绑定的区域    [root@yuji ~]# firewall-cmd --zone=home --change-interface=ens33  The interface is under control of NetworkManager, setting zone to 'home'.  success  [root@yuji ~]# firewall-cmd --get-active-zone  home   interfaces: ens33  public   interfaces: ens34  ​  #删除网卡和区域的绑定关系  [root@yuji ~]# firewall-cmd --zone=home --remove-interface=ens33  The interface is under control of NetworkManager, setting zone to default.  success  [root@yuji ~]# firewall-cmd --get-active-zone  public   interfaces: ens33

6.png

7.png

8.png

示例3:对源地址进行操作

 

csharp

复制代码

 [root@yuji ~]# firewall-cmd --add-source=2.2.2.2 --zone=work //将源地址绑定到work区域  success  [root@yuji ~]# firewall-cmd --get-active-zone  work   sources: 2.2.2.2  public   interfaces: ens33 ens34  [root@yuji ~]# firewall-cmd --remove-source=2.2.2.2 --zone=work //删除源地址和work区域的绑定关系  success  [root@yuji ~]# firewall-cmd --get-active-zone  public   interfaces: ens33 ens34

9.png

示例4:查看指定区域的所有规则

不指定区域时,则对默认区域进行操作(默认区域可自定义,不修改则为public)

firewall-cmd --list-all-zones:显示所有区域及其规则

firewall-cmd --list-all : 不指定区域时,查看的是默认区域

firewall-cmd --list-all --zone=work:显示work区域的所有规则

 

yaml

复制代码

 [root@yuji ~]# firewall-cmd --list-all-zones   //显示所有区域及其规则  ​  [root@yuji ~]# firewall-cmd --list-all   //不指定区域时查看的是默认区域  public (active)   target: default   icmp-block-inversion: no   interfaces: ens33               //绑定的   sources:   services: ssh dhcpv6-client   ports:   protocols:   masquerade: no   forward-ports:   source-ports:   icmp-blocks:   rich rules:  ​  [root@yuji ~]# firewall-cmd --list-all --zone=work   //查看work区域的规则  work   target: default   icmp-block-inversion: no   interfaces:   sources:   services: ssh dhcpv6-client   ports:   protocols:   masquerade: no   forward-ports:   source-ports:   icmp-blocks:   rich rules:

10.png

11.png

示例5:服务管理

显示、添加、删除指定区域的某个服务:

 

css

复制代码

 [root@yuji ~]# firewall-cmd --zone=work --list-services  ssh dhcpv6-client  [root@yuji ~]# firewall-cmd --zone=work --add-service=http  success  [root@yuji ~]# firewall-cmd --zone=work --list-services  ssh dhcpv6-client http  [root@yuji ~]# firewall-cmd --zone=work --remove-service=http  success  [root@yuji ~]# firewall-cmd --zone=work --list-services  ssh dhcpv6-client

12.png

向默认区域中添加允许通过的服务:

 

css

复制代码

 [root@yuji ~]# firewall-cmd --add-service=http  success  [root@yuji ~]# firewall-cmd --list-services --zone=public  ssh dhcpv6-client http

13.png

一次性添加多个服务:

 

css

复制代码

 [root@yuji ~]# firewall-cmd --zone=work --add-service={http,https,ftp}  success  [root@yuji ~]# firewall-cmd --list-services --zone=work  ssh dhcpv6-client http https ftp

14.png

示例6:端口管理

添加、删除某个协议的端口。

 

yaml

复制代码

 [root@yuji ~]# firewall-cmd --zone=work --add-port=80/tcp  success  [root@yuji ~]# firewall-cmd --zone=work --list-ports  80/tcp  [root@yuji ~]# firewall-cmd --zone=work --list-all  work   target: default   icmp-block-inversion: no   interfaces:   sources:   services: ssh dhcpv6-client http https ftp   ports: 80/tcp   protocols:   masquerade: no   forward-ports:   source-ports:   icmp-blocks:   rich rules:

15.png

添加连续的端口:

 

yaml

复制代码

 [root@yuji ~]# firewall-cmd --add-port=3000-5000/udp  success  [root@yuji ~]# firewall-cmd --list-all  public (active)   target: default   icmp-block-inversion: no   interfaces: ens33 ens34   sources:   services: ssh dhcpv6-client http   ports: 3000-5000/udp   protocols:   masquerade: no   forward-ports:   source-ports:   icmp-blocks:   rich rules:            [root@yuji ~]# firewall-cmd --remove-port=3000-5000/udp  success

16.png

5.2 永久配置

永久配置不立即生效,需要重启服务或重新加载后才生效。重启服务或重新加载时会中断现有连接。下次重启后不会丢失,永久存在。

示例:

1、--permanent 设置成永久生效,需要重启服务或重新加载 后才生效。

 

css

复制代码

 #同时添加 httpd、https 服务到默认区域,并设置成永久生效。  ​  firewall-cmd --add-service={http,https} --permanent  firewall-cmd --reload  ​  #添加使用 --permanent选项表示设置成永久生效,需要重新启动 firewalld 服务或执行firewall-cmd --reload 命令重新加载后才生效;

2、把运行时配置转换成永久配置

 

bash

复制代码

 firewall-cmd --runtime-to-permanent  ​  #将当前的运行时配置,写入规则配置文件中,使之成为永久性配置。

示例1:直接进行永久配置

同时添加 httpd、https 服务到默认区域,并设置成永久生效。

 

yaml

复制代码

 [root@yuji ~]# firewall-cmd --add-service={http,https} --permanent  success  [root@yuji ~]# firewall-cmd --reload  success  [root@yuji ~]# firewall-cmd --list-all  public (active)   target: default   icmp-block-inversion: no   interfaces: ens33   sources:   services: ssh dhcpv6-client http https   ports:   protocols:   masquerade: no   forward-ports:   source-ports:   icmp-blocks:   rich rules:  ​

17.png

示例2:把运行时配置 转换成 永久配置

将当前的运行时配置,写入规则配置文件中,使之成为永久性配置。

 

csharp

复制代码

 [root@yuji ~]# firewall-cmd --runtime-to-permanent  success

18.png

6 设置SNAT规则和DNAT规则

设置SNAT策略:

 

css

复制代码

 [root@yuji ~]# firewall-cmd --zone=public --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.72.0/24 -j SNAT --to-source 12.0.0.254  success  [root@yuji ~]# iptables -t nat -nL POSTROUTING  Chain POSTROUTING (policy ACCEPT)  target     prot opt source               destination          SNAT       all  --  192.168.72.0/24      0.0.0.0/0           to:12.0.0.254

19SNAT.png

设置DNAT策略:

 

css

复制代码

 [root@yuji ~]# firewall-cmd --zone=public --direct --passthrough ipv4 -t nat -A PREROUTING -d 12.0.0.254 -p tcp --dport 80 -j DNAT --to 192.168.72.10  success  [root@yuji ~]# iptables -t nat -nL PREROUTINGChain PREROUTING (policy ACCEPT)  target     prot opt source               destination          DNAT       tcp  --  0.0.0.0/0            12.0.0.254           tcp dpt:80 to:192.168.72.10

20DNAT.png

小贴士:

拒绝某个地址访问所有服务,可以通过block和drop区域,即将这个源地址和block区域绑定(或者和drop区域绑定)。但是拒绝这个源地址访问单个服务,要通过富规则实现。

例如现在有个地址192.168.89.10,只想拒绝它使用ssh服务,其他都放行。需要通过富规则实现。

 

ini

复制代码

 firewall-cmd --add-rich-rule=...

作者:聂鲁达的邮差
链接:https://juejin.cn/post/7094625904453763103
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#桶排序算法

前言 桶排序是一种线性时间复杂度的排序算法&#xff0c;它将待排序的数据分到有限数量的桶中&#xff0c;每个桶再进行单独排序&#xff0c;最后将所有桶中的数据按顺序依次取出&#xff0c;即可得到排序结果。 实现原理 首先根据待排序数据&#xff0c;确定需要的桶的数量。…

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合&#xff08;Link Aggregation&#xff09;是将多条物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …

轻重链剖分+启发式合并专题

Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树&#xff0c;每条边上有一个字符&#xff08;a-v共22种&#xff09;。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…

第三章 内存管理 九、基本分段存储管理方式

目录 一、概括 二、什么是分段 三、段表 四、地址转换 五、分段和分页的对比 六、总结 一、概括 基本分段存储管理方式是一种操作系统的内存管理方式&#xff0c;采用这种方式&#xff0c;将进程所需的内存分成若干个段&#xff0c;每个段都可以单独进行管理和保护。 具…

分享一下怎么开发一个陪诊小程序

开发一个陪诊小程序需要综合考虑许多方面&#xff0c;包括但不限于市场需求、用户体验、技术实现和运营策略。以下是一篇以开发陪诊小程序为主题的文章。 一、背景介绍 随着社会的发展和人口老龄化的加剧&#xff0c;越来越多的老年人、病患和孕妇需要就医&#xff0c;而由于各…

攻防世界web篇-unserialize3

得出php代码残篇 将代码补全后再在线php运行工具中进行运行 在浏览器输入后得到下面的界面 这里需要将O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 改为 O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}

【Leetcode】212.单词搜索II(Hard)

一、题目 1、题目描述 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中…

【java】Java项目从开发到部署生产完整流程梳理

文章目录 前言一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat&#xff0c;引入外部tomcat4.2.3 添加servlet-ap…

Unity可视化Shader工具ASE介绍——8、UI类型的特效Shader编写

阿赵的Unity可视化Shader工具ASE介绍目录 Unity的UGUI图片特效角色闪卡效果 大家好&#xff0c;我是阿赵。   继续介绍Unity可视化Shader编辑插件ASE的使用。这次讲一下UI类特效Shader的写法。 一、例子说明 这次编写一个Shader&#xff0c;给一张UGUI里面的图片增加一个闪卡…

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址&#xff0c;然后会转到另一个网页界面&#xff0c;在这个界面&#xff0c;已经给出了提示&#xff0c;robots.txt 在浏览器中&#xff0c;直接在地址的后面加上robots.txt&#xff0c;会进到下面这个界面 因为对php语言一窍不通&#xff0c;所以这里纯粹就…

Swagger有哪些非常重要的注释?

Swagger是一种用于描述和定义RESTful API的强大工具&#xff0c;它提供了一种规范来编写API文档&#xff0c;生成客户端SDK以及进行自动化测试。其中的注释&#xff08;Annotations&#xff09;在Swagger规范中扮演着关键的角色&#xff0c;用于为API端点、操作、模型等添加元数…

在UniApp中使用uni.makePhoneCall方法调起电话拨打功能

目录 1.在manifest.json文件中添加权限 2. 组件中如何定义 3.如何授权 4.相关知识点总结 1.在manifest.json文件中添加权限 {"permissions": {"makePhoneCall": {"desc": "用于拨打电话"}} }2. 组件中如何定义 <template>…

Spring Security的认证和授权(1)

1、Spring Security 简介 Java企业级开发生态丰富&#xff0c;无论你想做哪方面的功能&#xff0c;都有众多的框架和工具可供选择, 以至于SUN公司在早些年不得不制定了很多规范&#xff0c;这些规范在今天依然影响着我们的开发&#xff0c; 安全领域也是如此&#xff0c;然而&…

TOGAF架构开发方法—初步阶段

本章描述了满足新企业体系结构业务指令所需的准备和启动活动,包括组织特定体系结构框架的定义和原则的定义。 一、目标 初步阶段的目标是: 确定组织所需的体系结构功能: 审查进行企业架构的组织背景确定受体系结构功能影响的企业组织的元素并确定其范围确定与架构功能相交的…

php 遍历PHP数组的7种方式

在PHP中&#xff0c;遍历数组有多种方式可以选择。以下是最常用的几种方式&#xff1a; 使用foreach循环 $array array("apple", "banana", "orange"); foreach($array as $value){echo $value . "<br>"; } 输出结果&#xff…

工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性

工程监测仪器振弦传感器信号转换器在桥梁安全监测中的重要性 桥梁是人类社会建设过程中最重要的交通基础设施之一&#xff0c;对于保障人民出行、促进经济发展具有极其重要的作用。由于桥梁结构在长期使用过程中受到环境因素和负荷的影响&#xff0c;会逐渐发生变形和损伤&…

QT学习笔记-QT程序执行Linux Shell命令实现动态添加路由

QT学习笔记-QT程序执行Linux Shell命令实现动态添加路由 背景关键代码程序界面 背景 在使用QT进行Linux下应用程序开发时&#xff0c;在特定业务需求下&#xff0c;需要在程序中执行Linux的Shell命令。QT中执行Linux命令可以通过QProcess类和system来实现&#xff0c;如果需要…

使用 Service 把前端连接到后端

使用 Service 把前端连接到后端 如何创建前端&#xff08;Frontend&#xff09;微服务和后端&#xff08;Backend&#xff09;微服务。后端微服务是一个 hello 欢迎程序。 前端通过 nginx 和一个 Kubernetes 服务暴露后端所提供的服务。 使用部署对象&#xff08;Deployment ob…

Android Gradle权威指南读书笔记

第一章 Gradle入门 生成Gradle Wrapper 命令&#xff1a;gradle wrapper --gradle-version 版本号自定义Gradle Wrapper task wrapper(type : Wrapper) { gradleVersion 2.4 archiveBase GRADLE USER HOME archivePath wrapper/dists distributionBase GRADLE USER HOME …

基于PHP的宠物爱好者交流平台管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…