【Linux】防火墙iptables详解

目录

一、防护墙概述

二、防火墙

2.1名词

2.2使用规则

2.3表与链

2.3.1简介

2.3.2每个表说明

1)filter表

2)nat表

2.4环境的配置

2.5iptables的命令参数

2.6 配置filter表规则

2.6.1备份与恢复

2.6.2案例1:禁止访问22端口

2.6.3案例2:封ip 屏蔽某个ip

 2.6.4案例3:只允许指定⽹段连⼊

2.6.5 案例4:指定多个端⼝

2.6.6 案例5:匹配ICMP类型

2.6.7案例6:匹配⽹络状态(TCP/IP连接状态)

2.6.8案例7:限制并发速率

2.7 nat

2.7.1共享上网

2.7.2端口映射


一、防护墙概述

防火墙是一种网络安全设备,用于监控和控制数据包在网络中的流动,以保护网络免受未经授权的访问、恶意攻击和其他安全威胁。防火墙可以是软件、硬件或组合体,其主要功能包括:

  1. 封端口封ip
  2. 实现NAT功能
  3. 共享上网
  4. 端口映射(端口转发),ip映射

二、防火墙

2.1名词

  1. 表(table):用来存放链的容器,防火墙最大的概念。
  2. 链(chain):用来存放规则的容器。
  3. 规则(policy):准许或拒绝规则,未来书写的防火墙条件就是各种防火墙规则。

  

2.2使用规则

1. 防⽕墙是 层层过滤 的,实际是按照配置规则的 顺序从上到下 ,从前到后进⾏过滤的。
2. 如果 匹配成功 规则,即明确表示是 拒绝 (DROP) 还是接收 (ACCEPT) 数据包就不再向下匹配新的规则
3. 如果规则中没有明确表明是阻⽌还是通过的,也就是没有匹配规则,向下进⾏匹配,直到 匹配默认规则 得到明确的阻⽌还是通过。
4. 防⽕墙的 默认规则 所有规则都匹配完才会匹配的。

那么问题来了,如果是拒绝的规则,我们应该放在哪里呢?

回答:为了能够最快速的筛掉不必要的数据包,我们的拒绝规则肯定是要放在前面的,接受的放在后面。

2.3表与链

2.3.1简介

iptables分成4表五链。

4表:raw表、mangle表、filter表、nat表

五链:INPUT、OUTPUT、FORWARD  、PREROUTING、POSTROUTING

表全是小写字母,链全是大写字母。

2.3.2每个表说明

我们这里主要介绍filter表和nat表,其他的几乎用不到。

1)filter表
实现防⽕墙功能 : 屏蔽或准许 端⼝ ip
filter表
强调:主要和主机⾃身相关,真正负责主机防⽕墙功能的(过滤流⼊流出主机的数据包)filter表示iptables默认使⽤的表,这个表定义了三个链(chains) 企业⼯作场景:主机防⽕
INPUT
负责过滤所有⽬标地址是本机地址的数据包 通俗来说: 就是过滤进⼊主机的数据包 ( 能否让数据包进⼊服务器)
OUTPUT
路过 : 负责转发流经主机的数据包。起转发的作⽤,和 NAT 关系很⼤,后⾯会详细介绍 LVS NAT模式, net.ipv4.ip_forward=0
FORWARD
处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包

2)nat表
实现 nat 功能:
  • 实现共享上⽹(内⽹服务器上外⽹)
  • 端⼝映射和ip映射
nat表
负责⽹络地址转换的,即来源与⽬的 IP 地址和 port 的转换。
应⽤:和主机本身无关,⼀般⽤于局域⽹共享上⽹或者特殊的端⼝转换服务相关。
⼯作场景:
1. ⽤于企业路由( zebra )或网关( iptables ),共享上⽹( POSTROUTING
2. 做内部外部 IP 地址⼀对⼀映射( dmz ),硬件防⽕墙映射 IP 到内部服务器, ftp 服务 PREROUTING
3. WEB ,单个端⼝的映射,直接映射 80 端口( PREROUTING ) 这个表定义了 3 个链, nat 功能相当于⽹络的 acl 控制。和⽹络交换机 acl 类似
OUTPUT
和主机放出去的数据包有关,改变主机发出数据包的⽬的地址。
PROROUTING
在数据包到达防⽕墙时,进⾏路由判断之前执⾏的规则, 作⽤是改变数据包的⽬的地址、 ⽬的端口等
就是收信时,根据规则重写收件⼈的地址
例如:把公⽹ IP xxx.xxx.xxx.xxx 映射到局域⽹的 xx.xx.xx.xx 服务器上。
如果是 web 服务,可以报 80 转换为局域⽹的服务器 9000 端⼝上
10.0.0.61 8080( ⽬标端⼝ ) ----nat---à 10.0.0.7 22
POSTROUTING
在数据包离开防⽕墙时进⾏路由判断之后执⾏的规则,作⽤改变数据包的源地址,源端⼝等。
写好发件⼈的地址,要让家⼈回信时能够有地址可回。
例如。默认笔记本和虚拟机都是局域⽹地址,在出⽹的时候被路由器将源地址改为了公⽹地址。
⽣产应⽤: 局域⽹共享上⽹

流程图:

2.4环境的配置

我们需要有root权限(本文测试都是在root用户环境下)

//下载iptables

[root@VM-8-13-centos ~]# yum install -y iptables-services

//将配置文件永久写入文件

cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

//检查文件是否已经了iptables

[root@VM-8-13-centos ~]#  lsmod |egrep 'filter|nat|ipt'

//关闭防火墙

[root@VM-8-13-centos ~]# systemctl disabled firewalld
[root@VM-8-13-centos ~]# systemctl disable firewalld
 

//开启iptables服务

[root@VM-8-13-centos ~]# systemctl start iptables.service
[root@VM-8-13-centos ~]# systemctl enable iptables.service
 

//查看iptables服务状态

[root@VM-8-13-centos ~]# systemctl status iptables.service

//查看filter中的规则

[root@VM-8-13-centos ~]# iptables -nL

2.5iptables的命令参数

参数含义
查看表
-L
显示表中的所有规则
-n
不要把端⼝ 或 ip 反向解析为名字(查看表的时候更快)
指定表
-t
指定表(不指定默认是 filter 表)
指定链接(追加/头部插入/删除)
-A
append 追加 加⼊ 准许 类规则
-I
insert 把规则加在链的第 1 拒绝 类规则放在所有规则最上⾯
-D
delete 删除
-N添加用户自定义链
-X删除自定义链
-P修改默认规则

参数含义
-p
协议 protocal   tcp/udp/icmp/all 
--doprt
⽬标端⼝ dest destination 指定端⼝ 加上协议 -p tcp  (这里之所以是--是为了和-d参数区分开)
--sport
源端⼝ source
-s
source ip
-d
destination ⽬标 ip
-m
指定模块 multiport
-i
input 输⼊的时候 从哪个⽹卡进来
-o
ouput 输出的时候 从哪个⽹卡出去

参数含义
-j
满⾜条件后的动作 : DROP/ACCEPT/REJECT
DROP REJECT 拒绝
DROP 把数据丢掉 不会返回信息给⽤户
REJECT 拒绝 返回拒绝信息
(这两个的区别就在于:一个是收到东西后直接丢了不和你说,另一个就是收到后直接和你说不喜欢。)

参数含义
-F
flush 清除所有规则,不会处理默认的规则
-x
删除⽤户 ⾃定义的链
-Zzero 链的计数器清零(数据包计数器与数据包字节计数器)

下面是组合用法: 

iptables 命令及选项
指定表
指定链
( 插⼊ / 追加 / 删除 )
ip
具体要求
( 端⼝ ,ip, 协议 )
端⼝
动作
iptables
-t nat
-A INPUT
-s
-p tcp/udp/icmp
--dport ⽬标端⼝
-j DROP
-I
-d
--sport 源端⼝
-j REJECT
-D
-j ACCEPT

 相信看到这么多参数已经头大了,没事,我们下面结合案例来看

2.6 配置filter表规则

2.6.1备份与恢复

备份:iptables-save >/etc/sysconfig/iptables

我们可以cat查看这个目录,这是我们本来保存的规则,我们将现在的内容写入配置文件保存起来。

恢复:iptables-restore </etc/sysconfig/iptables

我们先用 iptable -F清空规则,然后使用恢复。

2.6.2案例1:禁止访问22端口

我们先 iptables -F清空规则,然后加入规则:

[root@VM-8-13-centos ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

这时候可以发现,我们的云服务器直接退出了

 

这是因为我们登录使用的端口是22号端口,我们把22号端口禁止掉,那么我们相当于自杀了。这时候就需要重启云服务器让它重置到之前的样子。

2.6.3案例2:ip 屏蔽某个ip

老规矩,先清空规则,然后加入规则:

[root@VM-8-13-centos ~]# iptables -I INPUT -s 106.52.90.67 -j DROP
这时候我们复制一个窗口,ping+自己云服务器的ip地址,这时候我们发现是无法收到自己发给自己的数据包的。

因为我们把自己的ip给封禁了。

我们输入 iptables -nL 查看此时表中的规则,如果此时的规则很多,我们删除的时候还需要数删除第几条,那么我们可以输入: 

[root@VM-8-13-centos ~]# iptables -nL --line-number

可以看到,现在显示的规则是会带上编号的。

我们删除第一条规则:

[root@VM-8-13-centos ~]# iptables -D INPUT 1
此时我们把封禁的规则删除之后,我们又可以ping了

 2.6.4案例3:只允许指定⽹段连⼊

实现阿⾥云⽩名单功能:默认是拒绝 开放端⼝ ⽹段

方法一:利⽤ ! 进⾏排除

iptables -I INPUT ! -s 106.52.90.0/24 -j DROP
我们通过上面案例,我们知道了怎么封禁单个ip,我们其实只需要加上一个感叹号,就可以实现只允许该ip连入。

到这里很多人就迷糊了,这个0/24是什么意思?

在网络中,CIDR(Classless Inter-Domain Routing)表示法用于指定一个IP地址和其对应的网络前缀长度。这个长度告诉我们IP地址中有多少位是网络地址,剩下的位数则是主机地址。

在106.52.90.0/24中,106.52.90.0/24是网络地址,/24表示子网掩码,也就是前24位是网络地址,后8位是主机地址。这意味着这个网络中有 2^8 - 2 = 254 个可用的主机地址,因为其中的网络地址和广播地址都不能用于主机。

因此,106.52.90.0/24表示了一个包含 106.52.90.0 到 106.52.90.255 的范围内的所有IP地址的网络。这样的表示法在指定网络范围时非常常见。

方法二:修改链默认规则 修改为拒绝 添加准许

[root@VM-8-13-centos ~]# iptables -A INPUT -s 106.52.90.0/24 -j ACCEPT

[root@VM-8-13-centos ~]# iptables -P INPUT DROP

//重新改回

[root@VM-8-13-centos ~]# iptables -P INPUT ACCEPT

2.6.5 案例4:指定多个端⼝

参数:-m multiport 只要在参数中加一个这个参数,就代表需要设置多个端口。

[root@VM-8-13-centos ~]# iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT

如果是连续的多个端口,可以不需要加上这个,只需要用一个冒号:连接起来即可。

[root@VM-8-13-centos ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP

这样就把1024到65535的端口全部禁止掉了

2.6.6 案例5:匹配ICMP类型

  • ICMPInternet Control Message ProtocolInternet控制报⽂协议,ping就是用的ICMP协议
  • 整个⽹站核⼼
通过防⽕墙规则 控制是否可以ping
//icmp-type8 就是icmp协议的第8种功能,也就是ping功能

[root@VM-8-13-centos ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

通过内核参数 控制 禁⽌被ping

[root@VM-8-13-centos ~]# cat /etc/sysctl.conf
#/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_all = 1
[root@VM-8-13-centos ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
[root@VM-8-13-centos ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
[root@VM-8-13-centos ~]# #net.ipv4.icmp_echo_ignore_all=1 写⼊到
/etc/sysctl.conf[root@oldboy-m01 ~]# #sysctl -p
[root@VM-8-13-centos ~]# echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

2.6.7案例6:匹配⽹络状态(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

通过指定适当的连接状态,可以根据连接的状态来过滤和处理数据包。例如,你可以设置防火墙规则只允许已建立的连接通过(ESTABLISHED),从而增强网络安全性。

2.6.8案例7:限制并发速率

-m limit 限制模块
-m limit --limit n/{second/minute/hour}:
解释:指定时间内的请求速率”n”为速率,后⾯为时间分别为:秒 分 时

例如:-m limit --limit 10/minute #每分钟只能有10个数据包 每6秒⽣成

--limit-burst [n]
解释:在同⼀时间内允许通过的请求”n”为数字,不指定默认为5
测试:
#ping icmp 协议 进⾏测试
iptables -F
iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport -j ACCEPT
iptables -P INPUT DROP

2.7 nat

2.7.1共享上网

原理:

  1. 当我的局域网ip想要发送消息给百度的ip的时候,我需要先转成公网ip之后才能找到它。
  2. 如果消息包中的源ip在进入公网之后还是我的局域网的ip地址,那么当百度想要给我发送包的时候,就会在公网中找不到。因此,我们经过防火墙的SNAT源地址转换的时候,我们会把源ip换成公网的ip,这样在返回的时候才能找到。

操作:

//参数设置为1,开启ip转发功能
[root@VM-8-13-centos ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

//刷新一下

[root@VM-8-13-centos ~]# sudo sysctl -p


//使用 iptables 设置转发规则,将局域网内部的数据包转发到外部网络。

[root@VM-8-13-centos ~]# sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这里假设 eth0 是连接外部网络的网络接口,您需要将其替换为您实际使用的网络接口名称。如果不确定网络接口名称,可以使用 ifconfig 命令查看。

//根据需要设置防火墙规则,以允许或拒绝特定的网络流量。

例如,允许局域网内部的流量:

sudo iptables -A INPUT -i eth1 -j ACCEPT

2.7.2端口映射

有时候公网用户想要从局域网内某个端口使用局域网,那么我们就可以用端口映射。将我们所需要使用的局域网ip的端口映射到管理机的某个端口上,达到上网的目的。

//将局域网ip为10.0.8.13的22号端口  映射到  目的ip为公网ip 106.52.90.67的9000号端口。

//这里之所以是-d是站在数据包的角度的,数据包是从别的主机出发,目的ip是我们要找到的公网ip

[root@VM-8-13-centos ~]# iptables -t nat -A PREROUTING -d 106.52.90.67 -p tcp --dport 9000 -j
DNAT --to-destination 10.0.8.13:22

注意:这里还是需要注意一下之前我们在共享上网讲到的SNAT技术,不然往回传数据的时候又会找不到路了。

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

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

相关文章

【微信小程序】流量主-激励视频(激励广告)下发策略,每天三次免费体验,然后再次点击触发激励视频,当日不再触发。

如题&#xff1a; 允许用户有三次体验效果&#xff0c;然后弹出激励视频弹窗&#xff0c;之后当日不再弹出。 体验小程序&#xff1a; /*** 判断当前项目当天是否点击超过3次&#xff0c;触发广告效果。* 若&#xff0c;当天低于三次&#xff0c;则新增&#xff0c;若高于…

图片标注编辑平台搭建系列教程(4)——fabric几何定制渲染

背景 标注的几何&#xff0c;有时需要一些定制化的渲染样式&#xff0c;例如&#xff0c;线中间展示箭头&#xff0c;表示方向。本期教程教大家如何实现fabric几何定制化渲染。 带箭头的线 fabric提供了一些原生的几何&#xff0c;例如Point、Polyline、Polygon。同时提供了…

前端学习<三>CSS进阶——03-网页设计和开发中,那些困扰大神的关于字体的知识

前言 我周围的码农当中&#xff0c;有很多是技术大神&#xff0c;却常常被字体这种简单的东西所困扰。 这篇文章&#xff0c;我们来讲一讲关于字体的常识。这些常识所涉及到的问题&#xff0c;有很强的可操作性&#xff0c;都是在实际业务中真实遇到的&#xff0c;都是需要开…

软件资源分享六:EPLAN Electric P8 2024 | Eplan 2024 中文版软件介绍+保姆级安装教程

原文链接&#xff1a;安装激活教程 EPLAN Electric P8 2024 | Eplan 2024 中文版软件介绍安装教程 EPLAN 2024是一款电气设计软件&#xff0c;它可以用于自动化系统的设计、文档编制和维护。EPLAN可以对电气设计的各个方面进行完整的支持&#xff0c;包括电气控制系统、机械设…

Spring 整合 Log4j2日志框架

1. Log4j2日志概述 在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息&#xff0c;能够帮助我们了解并监控系统状态&#xff0c;在发生错误或者接近某…

【JavaSE】一维数组和二维数组详解

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 一维数组 基本语法 初始化 遍历和打印 数组是引用型变量 基本类型变量与引用类型变量的区别 null 数组传参和返回 总结 二维数组 基本语法 初始化 遍历和打印 一维数组…

论文精读--GPT4

现有的所有模型都无法做到在线学习&#xff0c;能力有限&#xff0c;而让大模型拥有一个tools工具库&#xff0c;则可以使大模型变成一个交互式的工具去协调调用API完成任务&#xff0c;同时GPT4还联网了&#xff0c;可以不断地更新自己的知识库 多模态模型&#xff0c;接受文…

单V及多V感知在自动驾驶在恶劣环境条件下的感知提升方案

单V及多V感知在自动驾驶在恶劣环境条件下的感知提升方案 附赠自动驾驶学习资料和量产经验&#xff1a;链接 自动驾驶中的视觉感知是车辆在不同交通条件下安全、可持续地行驶的关键部分。然而&#xff0c;在大雨和雾霾等恶劣天气下&#xff0c;视觉感知性能受到多种降级效应的极…

Pygame基础9-射击

简介 玩家用鼠标控制飞机&#xff08;白色方块&#xff09;移动&#xff0c;按下鼠标后&#xff0c;玩家所在位置出现子弹&#xff0c;子弹匀速向右飞行。 代码 没有什么新的东西&#xff0c;使用两个精灵类表示玩家和子弹。 有一个细节需要注意&#xff0c;当子弹飞出屏幕…

RK3568 学习笔记 : 独立修改与编译 u-boot

前言 开发板&#xff1a;【正点原子】ATomPi-CA1 开发板&#xff0c;配置&#xff1a;RK3568&#xff0c;4GB DDRAM 64GB emmc 开发板资料给了 u-boot 与 Linux kernel 源码&#xff0c;尝试手动编译。 本篇记录 收到编译 RK3568 平台 u-boot 的方法 环境搭建 由于 RK 平台…

椋鸟数据结构笔记#5:树、二叉树基础

文章目录 树树的相关概念树的表示 二叉树基础二叉树分类满二叉树完全二叉树 二叉树的性质二叉树的存储结构顺序存储链式存储 萌新的学习笔记&#xff0c;写错了恳请斧正。 树 树是一种非线性的数据结构&#xff0c;它是由 n 个节点组成的一个具有层次关系的数据集合。其大概结…

新手学python还是c?

考虑到个人情况和职业规划是非常重要的。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 Python作为初学者入门语言…

基于three-mesh-bvh实现第一人称及第三人称的漫游

基于three-mesh-bvh实现第一人称及第三人称的漫游 简介 这篇文章主要介绍在3d场景中实现第一人称与第三人称切换以及碰撞监测的漫游方案。 人称视角的场景漫游主要需要解决两个问题&#xff0c;人物在场景中的移动和碰撞检测。移动与碰撞功能是所有三维场景首先需要解决的基…

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程&#xff0c;笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC&#xff1a;Objective-C的简称&#xff0c;因为完整的名称过长&#xff0c;后续会经缩写来代替&#xff1b;项目/工程&#xff1a;也称工程&#xff0c;指的是一个A…

【现代控制】倒立摆模型

基础公式 转动惯量&#xff1a; 欧拉拉格朗日等式 倒立摆模型建立 由拉格朗日等式推导出微分方程&#xff1a; 也就是 将zdot移到等式左边&#xff0c;化简得到 展开就是&#xff1a; 系统线性化 法一&#xff1a;雅可比矩阵 法二&#xff1a;小角度假设 化简最终得…

基于8086贪吃蛇游戏系统方恨设计

**单片机设计介绍&#xff0c;基于8086贪吃蛇游戏系统方恨设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的贪吃蛇游戏系统设计是一个结合了微处理器控制、游戏逻辑以及图形显示技术的综合性项目。该系统旨在通过8086微处理器…

学习使用echats因xAxis值过多,可以滚动的柱状图解决方案

学习使用echats因xAxis值过多&#xff0c;可以滚动的柱状图解决方案 效果图柱状图代码关键代码 效果图 柱状图代码 function echarts() {// 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById(echart4));let xaxisData [1, 2,…

篮球竞赛预约平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

LabelConvert: 目标检测和图像分割数据集格式转换工具

LabelConvert LabelConvert是一个目标检测和图像分割的数据集格式转换工具&#xff0c;支持labelme、labelImg与YOLO、VOC和COCO 数据集格式之间的相互转换。 支持的转换格式 安装 pip install label_convert具体使用方法 由于文章篇幅所限&#xff0c;请移步LabelConvert官…

idea 报错 Could not list the contents of folder “ftps

idea 报错 Could not list the contents of folder "ftps 解决方案 这里看到了网上的解决方案&#xff0c;顺便再记录一下。打开 【高级】菜单 - 取消勾选 被动模式。然后点击测试连接&#xff0c;显示连接成功&#xff01; ftp中的主动模式和被动模式 主动模式&…