Firewalld 是什么

在 Linux 系统的网络安全领域,Firewalld 就像是一位默默守护的卫士,为系统抵御各种潜在的网络威胁 。它是一个动态防火墙管理工具,自 CentOS 7 开始,便取代了之前的 iptables 防火墙,成为系统默认的防火墙管理工具,在 Linux 系统的网络安全架构中占据着举足轻重的地位。
从本质上来说,Firewalld 是一个守护进程,它通过充当 netfilter 的前端来提供防火墙功能,默认后端是 iptables/ntftables。简单来讲,它就像是一个翻译官,将我们设置的防火墙规则,准确无误地传达给内核中的 netfilter 网络过滤子系统,进而实现对网络数据包的过滤和管理 。与 iptables 主要基于接口设置规则不同,Firewalld 采用了一种更为灵活和直观的基于区域(zone)的管理方式。它就像一个智能的安保系统,根据不同的区域设置不同的安全策略,从而更有效地保护系统的网络安全。
Firewalld 与其他防火墙对比
在防火墙的世界里,Firewalld 并不是唯一的存在,iptables 便是其 “前辈” 。在 CentOS 7 之前,iptables 一直是 Linux 系统中广泛使用的防火墙管理工具,它基于内核空间的 netfilter 框架,通过直接操作内核中的 iptables 规则表来过滤和处理网络数据包。而 Firewalld 作为后来者,与 iptables 相比,有着诸多显著的区别。
从配置方式来看,iptables 的配置较为底层和复杂,需要手动编写规则,并且使用规则链(rule chains)和表(tables)的概念来组织和管理防火墙规则,例如常见的 filter 表、nat 表和 mangle 表等。对于新手来说,iptables 的规则语法犹如一座难以逾越的大山,需要花费大量的时间和精力去学习和掌握。而 Firewalld 则采用了动态的、面向服务的管理方式,通过定义服务(services)、区域(zones)和规则(rules)等概念来组织和管理防火墙配置 ,大大简化了防火墙的配置过程。
在规则更新方面,iptables 的规则是静态的,一旦配置完成后,除非重新加载或重启,否则规则不会自动更新。每一次对规则的修改,都意味着要清除所有旧有的规则,并从配置文件中读取所有新的规则,这无疑是一项繁琐且容易出错的操作。而 Firewalld 则支持实时动态更新防火墙规则,可以在运行时添加、删除或修改规则,而无需重启或重新加载配置,只需使用--reload选项即可立即生效,这使得管理员可以在不影响系统正常运行的情况下,随时调整防火墙策略,以满足不断变化的网络安全需求。
此外,iptables 将配置存储在/etc/sysconfig/iptables,而 Firewalld 将配置储存在/etc/firewalld(优先加载),同时/usr/lib/firewalld中的各种 xml 文件是默认的配置文件。在配置文件的管理上,Firewalld 的结构更加清晰,更易于维护。
Firewalld 核心概念
区域(Zones)
Firewalld 预先定义了 9 个区域,每个区域都代表了不同的网络环境和安全级别 ,就像是为不同的网络场景量身定制的安全模板。这些区域各自有着独特的用途和默认规则,就像不同的房间有着不同的使用规则一样。
比如,public区域,是用于公共网络的区域,就像公共场所一样,默认只允许与ssh或dhcpv6-client预定义服务匹配的传入流量,对于其他的流量则一概拒绝,这是为了在公共网络环境中最大程度地保护系统安全,防止未经授权的访问。当我们的服务器处于公共网络中,如互联网上,就可以将相关的网络接口分配到public区域,确保只有必要的服务能够被外部访问。
而trusted区域则恰恰相反,它允许所有的传入流量,就像一个完全信任的朋友,对所有流量都敞开大门。这个区域通常用于信任的网络,比如家庭内部网络,在这种网络环境中,我们相信其他设备不会对我们的系统造成危害,所以可以放心地允许所有流量通过。
home区域主要用于家庭网络,它允许与ssh、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,因为在家庭网络中,我们通常会使用这些服务来实现设备之间的通信和共享,比如通过ssh远程访问家庭中的服务器,或者通过samba-client访问共享文件等。
internal区域的默认值与home区域相同,主要用于内部网络,适用于企业内部网络等场景,在这些网络中,我们对内部设备有一定的信任,所以允许一些常见的服务流量通过。
work区域用于工作区域,默认允许与ssh、dhcpv6-client预定义服务匹配的传入流量,适合企业办公网络,满足基本的网络通信需求,同时保证一定的安全性。
dmz区域,即隔离区域,也称为非军事区域,用于放置可公开访问但对内部网络有限制访问的计算机,默认只允许与ssh预定义服务匹配的传入流量,在这个区域中,我们可以放置一些对外提供服务的服务器,如 Web 服务器,但同时限制它们对内部网络的访问,以保护内部网络的安全。
external区域用于启用伪装的外部网络,特别是路由器,默认允许与ssh预定义服务匹配的传入流量,并且默认将通过此区域转发的 IPv4 传出流量进行地址伪装,可用于为路由器启用了伪装功能的外部网络,保护内部网络的真实 IP 地址不被暴露。
block区域会拒绝所有传入流量,就像一堵坚实的墙,阻挡所有外部的访问,常用于对安全性要求极高,不允许任何外部访问的场景。
drop区域则更为严格,它会丢弃所有传入流量,并且不产生包含 ICMP 的错误响应,只允许本机对外访问其他的服务器,推荐把需要进行严格网络限制的网卡绑定到这个区域。
在实际应用中,我们需要根据网络环境的特点和安全需求来选择合适的区域。如果是在家庭网络中,我们可以将连接家庭网络的网卡分配到home区域,这样既可以保证家庭内部设备之间的正常通信,又能提供一定的安全保护。而如果是在企业网络中,对于连接外部网络的网卡,我们可以将其分配到public区域,然后根据具体的业务需求,添加相应的服务和规则,确保企业网络的安全。
服务(Services)
在 Firewalld 的世界里,服务是一个非常重要的概念,它就像是一扇扇通往特定网络功能的大门 。简单来说,服务是 Firewalld 用来表示特定应用程序或服务网络需求的一种方式,每个服务都定义了一组端口和协议,以及与之关联的防火墙规则。
以常见的http服务为例,它默认使用 TCP 协议的 80 端口,当我们在 Firewalld 中添加http服务时,实际上就是允许 TCP 协议的 80 端口的流量通过防火墙。这就好比我们打开了一扇门,让与http服务相关的网络流量能够顺利进入系统,从而使我们的 Web 服务器能够正常对外提供服务。同样,ssh服务默认使用 TCP 协议的 22 端口,添加ssh服务意味着允许通过 22 端口进行 SSH 连接,方便我们远程管理服务器。
Firewalld 预先定义了很多服务,这些服务的配置文件存放在/usr/lib/firewalld/services/目录中,每个服务都有一个对应的 XML 配置文件,按照service-name.xml的格式命名,如ssh.xml、http.xml等。在这些配置文件中,详细记录了各项服务所使用的 TCP/UDP 端口以及协议等信息 。当我们需要允许某个服务的流量通过防火墙时,只需要简单地添加对应的服务即可,而无需手动配置复杂的端口和协议规则,大大简化了防火墙的配置过程。
比如,当我们在服务器上搭建了一个 Web 服务器,需要对外提供 HTTP 服务时,我们只需要使用firewall-cmd --zone=public --add-service=http命令,就可以快速允许http服务的流量通过public区域的防火墙,而不需要手动去配置 TCP 协议的 80 端口的规则。如果我们还需要提供 HTTPS 服务,也只需要使用firewall-cmd --zone=public --add-service=https命令即可。
规则(Rules)
规则是 Firewalld 实现网络访问控制的核心,它就像是一道道关卡,决定着网络流量的通行与否 。规则的作用就是定义允许或拒绝流量的匹配条件,通过这些条件,Firewalld 能够精确地控制哪些网络流量可以进入或离开系统,从而保障系统的网络安全。
规则可以基于多种参数进行配置,其中源 IP、目标 IP、协议和端口是最常见的参数。比如,我们可以配置一条规则,允许来自特定源 IP 地址的流量访问系统的某个端口。假设我们的企业内部网络有一个特定的 IP 地址段
192.168.1.0/24,我们希望这个网段内的设备能够访问服务器的 SSH 服务(默认端口 22),就可以使用firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="
192.168.1.0/24" service name="ssh" accept'命令来添加这样一条规则。这条规则中,family="ipv4"表示针对 IPv4 协议,source address="
192.168.1.0/24"指定了源 IP 地址段,service name="ssh"表示针对 SSH 服务,accept则表示允许该流量通过。
除了基于源 IP 和服务的规则,我们还可以根据目标 IP、端口范围等进行更细致的规则配置。比如,我们可以配置一条规则,拒绝所有外部 IP 地址访问服务器的某个特定端口,以防止潜在的攻击。假设我们要拒绝外部 IP 访问服务器的 3306 端口(通常用于 MySQL 数据库),可以使用firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="
0.0.0.0/0" port protocol="tcp" port="3306" drop'命令,其中source address="
0.0.0.0/0"表示所有的源 IP 地址,port protocol="tcp" port="3306"指定了目标端口和协议,drop表示拒绝该流量。
自定义规则为我们提供了极大的灵活性,使我们能够根据具体的网络环境和安全需求,制定出最适合的防火墙策略。在一些复杂的网络场景中,比如企业网络中存在多个不同安全级别的子网,或者需要对特定的应用程序进行精细的网络访问控制时,自定义规则就显得尤为重要。
运行时和永久性配置
在使用 Firewalld 进行防火墙配置时,我们需要了解运行时配置和永久性配置这两种不同的配置方式,它们就像是临时通行证和长期通行证,有着不同的作用和特点 。
运行时配置是指在当前系统运行过程中即时生效的配置,就像我们在旅行中临时购买的一日通行证,立即可以使用,但有效期只持续到当前会话结束。当我们使用firewall-cmd命令添加、修改或删除防火墙规则时,如果不添加--permanent选项,那么这些配置就属于运行时配置。例如,我们使用firewall-cmd --zone=public --add-service=http命令添加了http服务到public区域,这个配置会立即生效,Web 服务器可以马上对外提供服务。但是,一旦我们重启 Firewalld 服务或者重启系统,这个配置就会失效,就像一日通行证在当天结束后就不能再使用了。运行时配置的优点是即时生效,不需要重启服务或系统,不会中断现有连接,非常适合在系统运行过程中临时调整防火墙策略,以满足一些突发的网络需求。比如,当我们需要临时对外提供一个测试服务时,可以使用运行时配置快速开放相应的端口和服务。
永久性配置则是指会在系统重启后仍然保留的配置,就像我们办理的长期会员卡,只要在有效期内,随时都可以使用。当我们在firewall-cmd命令中添加--permanent选项时,配置就会被保存到配置文件中,成为永久性配置。例如,firewall-cmd --zone=public --add-service=http --permanent命令会将添加http服务的配置永久保存。不过,永久性配置并不会立即生效,需要我们重新加载防火墙配置或者重启 Firewalld 服务才能使新的配置生效,这就像我们办理了长期会员卡后,需要激活才能使用。永久性配置适用于那些需要长期生效的防火墙策略,比如企业网络中对某些关键服务的长期访问控制配置。
在实际操作中,我们可以根据具体需求灵活使用这两种配置方式。如果是一些临时的网络调整,如临时开放某个端口进行测试,使用运行时配置即可;而对于那些需要长期稳定生效的配置,如企业网络的常规安全策略,就应该使用永久性配置。
Firewalld 安装与启动
安装
在使用 Firewalld 之前,我们首先需要将其安装到系统中。不同的 Linux 发行版,安装 Firewalld 的方式也有所不同 。
对于基于 Debian 的 Ubuntu 系统,我们可以使用apt包管理器来安装 Firewalld。首先,打开终端,使用以下命令更新系统的软件包列表,确保我们获取到最新的软件包信息:
sudo apt update
更新完成后,使用以下命令安装 Firewalld:
sudo apt install firewalld
在安装过程中,系统会提示我们确认是否安装,输入Y并回车,即可开始安装。安装完成后,Firewalld 就已经成功安装到我们的 Ubuntu 系统中了。
对于基于 RHEL 的 CentOS 系统,我们则使用yum包管理器来进行安装。同样,先打开终端,使用以下命令安装 Firewalld:
sudo yum install firewalld
执行该命令后,yum会自动下载并安装 Firewalld 及其依赖包。安装过程中,同样会提示我们确认安装,输入y并回车,等待安装完成即可。
启动与设置开机启动
安装完成后,我们就可以启动 Firewalld 服务了。在 Linux 系统中,我们可以使用systemctl命令来管理系统服务 。要启动 Firewalld 服务,只需在终端中输入以下命令:
sudo systemctl start firewalld
执行该命令后,Firewalld 服务就会被启动,开始守护我们的系统网络安全。此时,我们可以使用systemctl status firewalld命令来查看 Firewalld 服务的运行状态,如果看到Active: active (running)字样,就说明 Firewalld 服务已经成功启动了。
为了确保系统在每次启动时都能自动启动 Firewalld 服务,我们还需要设置其开机自启。同样使用systemctl命令,输入以下命令即可设置 Firewalld 开机自启:
sudo systemctl enable firewalld
执行该命令后,系统会创建相应的符号链接,将 Firewalld 服务添加到开机启动项中。这样,下次系统启动时,Firewalld 服务就会自动启动,为我们的系统提供持续的网络安全保护。
Firewalld 常用命令实操
查看状态与信息
在使用 Firewalld 时,查看其状态和相关信息是基础操作。比如,我们想知道防火墙当前是否正在运行,就可以使用firewall-cmd --state命令,它会明确告知我们防火墙的状态是running(运行)还是not running(未运行)。如果我们想要了解 Firewalld 的版本信息,firewall-cmd --version命令就能满足需求,让我们清楚掌握其版本号,以便在遇到问题时进行针对性的查询和解决。
而firewall-cmd --list-all命令则更为强大,它会展示当前激活区域的所有详细信息,包括区域名称、关联的网络接口、已启用的服务、已开放的端口等。假设我们的服务器当前激活区域为public,执行该命令后,我们就能看到类似这样的信息:public (active),接着会列出interfaces: ens33(表示该区域关联的网络接口为ens33),services: ssh dhcpv6-client(显示已启用的服务为ssh和dhcpv6-client),ports: 80/tcp 443/tcp(列出已开放的端口为80/tcp和443/tcp)等,让我们对防火墙的配置一目了然。
开启与关闭
在不同的场景下,我们可能需要开启或关闭防火墙。如果只是临时性的开启防火墙,让其在当前会话中生效,我们可以使用systemctl start firewalld命令,这个命令会立即启动 Firewalld 服务,就像我们打开了一扇保护系统的大门。例如,当我们在服务器上进行一些需要网络访问的测试时,就可以临时开启防火墙。而如果希望防火墙在系统每次启动时都能自动开启,成为系统的常驻守护者,就需要使用systemctl enable firewalld命令,它会将 Firewalld 服务添加到开机启动项中,确保系统的网络安全始终得到保护。
相反,当我们需要关闭防火墙时,同样有临时性和永久性的操作。使用systemctl stop firewalld命令可以临时性关闭防火墙,在当前会话结束后,如果需要防火墙再次运行,还需要重新启动。而systemctl disable firewalld命令则会永久性地禁止防火墙开机启动,就像将保护大门关闭并锁上,下次系统启动时防火墙不会自动运行。不过,在实际应用中,不建议随意永久关闭防火墙,除非是在安全的测试环境中,因为这会使系统暴露在潜在的网络威胁之下。
区域管理
Firewalld 的区域管理功能是其灵活配置的关键,我们可以通过一系列命令来管理不同的区域。使用firewall-cmd --get-zones命令,我们可以查看系统中所有可用的区域,这些区域就像是不同的安全区域,每个都有其特定的用途和规则,如public、home、work等,我们可以根据实际网络环境来选择和配置。
想要知道当前系统中激活的是哪个区域,使用firewall-cmd --get-active-zones命令即可。比如在一个企业网络中,执行该命令后,我们可能会看到public interfaces: ens33,这表明当前激活的区域是public,并且关联的网络接口是ens33。
如果我们想深入了解某个指定区域的详细信息,比如public区域,firewall-cmd --zone=public --list-all命令就能发挥作用,它会展示public区域的所有配置细节,包括已启用的服务、开放的端口、关联的网络接口等,帮助我们更好地管理和维护该区域的网络安全。
在实际应用中,我们还可能需要设置默认区域,使用firewall-cmd --set-default-zone=public命令(这里以public区域为例,可根据需求替换为其他区域),就可以将指定的区域设置为默认区域,当我们没有明确指定区域时,系统会默认使用该区域的规则进行网络访问控制。
端口管理
端口管理是防火墙配置中非常重要的一环,它决定了哪些端口可以被访问,从而保护系统的服务安全。使用firewall-cmd --list-ports命令,我们可以查看当前已开放的端口,这些端口就像是系统对外提供服务的窗口。例如,执行该命令后,我们可能会看到80/tcp 22/tcp,这表示80/tcp(通常用于 HTTP 服务)和22/tcp(通常用于 SSH 服务)端口已经开放。
当我们需要添加一个新的开放端口时,比如要开放8080/tcp端口用于一个新的 Web 服务,我们可以使用firewall-cmd --permanent --zone=public --add-port=8080/tcp命令,其中--permanent表示这是一个永久性的配置,在系统重启后仍然生效;--zone=public指定了在public区域进行配置;--add-port=8080/tcp则明确了要添加的端口和协议。不过,需要注意的是,添加永久性配置后,需要执行firewall-cmd --reload命令重新加载配置,新的端口开放设置才会生效。
如果我们想要移除一个已经开放的端口,比如不再需要开放8080/tcp端口,就可以使用firewall-cmd --permanent --zone=public --remove-port=8080/tcp命令,同样,移除永久性配置后也需要重新加载配置。
此外,我们还可以通过firewall-cmd --zone=public --query-port=8080/tcp命令来查询某个端口的状态,判断它是否已经开放,以便我们及时了解防火墙的端口配置情况。
服务管理
在 Firewalld 中,服务管理与端口管理密切相关,通过管理服务,我们可以更方便地控制一组端口的访问。使用firewall-cmd --list-services命令,我们可以查看当前已启用的服务,这些服务就像是一个个功能模块,每个都对应着特定的端口和协议。例如,执行该命令后,我们可能会看到ssh http https,这表示ssh(默认端口 22/tcp)、http(默认端口 80/tcp)和https(默认端口 443/tcp)服务已经启用。
如果我们想查看系统中所有可用的服务,使用firewall-cmd --get-services命令即可,它会列出所有预定义的服务,让我们清楚了解可以启用哪些服务来满足不同的网络需求。
当我们需要添加一个新的服务时,比如要允许 HTTP 服务通过防火墙,我们可以使用firewall-cmd --permanent --zone=public --add-service=http命令,这会在public区域中添加http服务,允许相关的网络流量通过。同样,添加永久性服务配置后需要重新加载配置。
相反,如果我们要移除一个已经启用的服务,比如不再需要提供 HTTP 服务,就可以使用firewall-cmd --permanent --zone=public --remove-service=http命令,移除后同样需要重新加载配置,以确保防火墙的规则及时更新。
富规则管理
富规则是 Firewalld 中非常强大的功能,它可以让我们实现更精细、更复杂的网络访问控制。简单来说,富规则就是一种基于源地址、目标地址、端口、协议等多种条件的高级防火墙规则,它可以对网络流量进行更精准的控制。例如,我们可以通过富规则设置只允许特定 IP 地址段的设备访问服务器的某个端口,或者限制某个服务只能被特定的网络访问。
查看已设置的富规则,我们可以使用firewall-cmd --list-rich-rules命令,它会展示当前系统中已经配置的所有富规则。
假设我们要添加一条富规则,只允许
192.168.1.0/24这个 IP 地址段的设备访问服务器的3306/tcp端口(通常用于 MySQL 数据库),我们可以使用firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="
192.168.1.0/24" port protocol="tcp" port="3306" accept'命令。在这条命令中,rule表示这是一条规则;family="ipv4"指定了规则针对的是 IPv4 协议;source address="
192.168.1.0/24"明确了源地址段;port protocol="tcp" port="3306"指定了目标端口和协议;accept表示允许该流量通过。添加永久性富规则后,同样需要重新加载配置才能生效。
如果我们想要移除这条富规则,就需要使用与添加时相同的规则字符串,即firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="
192.168.1.0/24" port protocol="tcp" port="3306" accept'命令,移除后也需要重新加载配置,以确保防火墙规则的准确性。
Firewalld 规则持久化
确保服务运行
要实现 Firewalld 规则的持久化,首先得确保 firewalld 服务已经启用并且正在运行。这就好比我们要使用一个工具,首先得保证这个工具已经开启并准备好工作。在 Linux 系统中,我们可以使用systemctl命令来完成这一操作。通过sudo systemctl enable firewalld命令,我们可以设置 firewalld 服务在系统启动时自动启用,就像我们设置闹钟在每天早上自动响起一样,确保服务在系统启动时就已经准备就绪。而sudo systemctl start firewalld命令则是立即启动 firewalld 服务,让它马上开始工作,守护我们的系统网络安全。
编辑配置文件
在确保服务运行后,我们需要编辑 Firewalld 规则持久化的配置文件/etc/firewalld/firewalld.conf 。这个配置文件就像是 Firewalld 的 “使用说明书”,我们可以在其中设置各种参数和规则。使用sudo vi /etc/firewalld/firewalld.conf命令,我们可以打开这个配置文件进行编辑。在文件中,找到PersistFirewall=permanent这一行,如果它的值不是permanent,就将其修改为permanent,这样就表示启用了持久化规则。就好比我们在使用软件时,在设置中勾选了 “记住我的设置” 选项,这样软件下次启动时就会使用我们之前设置好的参数。
保存规则
接下来,对于每个我们需要设置规则的区域,比如public、trusted、home等,我们要将当前的防火墙配置保存为永久规则。这就像是我们在保存重要文件时,要确保保存的位置和方式正确,以便下次能够顺利找到和使用。
如果我们要在public区域添加http服务,使其成为永久规则,就可以使用sudo firewall-cmd --zone=public --permanent --add-service=http命令。这里的--zone=public指定了区域为public,--permanent表示这是一个永久规则,--add-service=http则明确了要添加的服务是http。
要是我们想在public区域开放8080/tcp端口,同样可以使用类似的命令sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp。通过这些命令,我们就可以将各种防火墙配置保存为永久规则,确保在系统重启后,这些规则依然生效,继续为我们的系统网络安全保驾护航。
总结

Firewalld 作为 Linux 系统中强大且灵活的防火墙管理工具,以其动态更新规则、基于区域的安全策略、丰富的功能选项等优势,为系统的网络安全提供了坚实的保障。无论是新手还是经验丰富的系统管理员,都能通过 Firewalld 轻松实现高效的网络访问控制。希望大家在 Linux 系统的使用过程中,充分利用 Firewalld 的特性,合理配置防火墙规则,让我们的系统在复杂的网络环境中安全稳定地运行。如果在使用 Firewalld 的过程中有任何疑问或心得,欢迎在评论区留言交流,让我们一起探索更多关于 Firewalld 的奥秘 。
墨者安全 防护盾
墨者安全作为专业级别安全防护专家,在应对 Webshell 风险隐患方面展现出了卓越的能力。其拥有全面的检测机制,能够精准识别 Webshell 的各种类型和变体,无论是复杂的大马,还是隐蔽的内存马,都难逃其敏锐的监测。
墨者安全防护盾具备强大的实时监控功能,对服务器的各项活动进行 7*24 小时不间断的监视。一旦发现任何可疑的 Webshell 活动迹象,立即发出警报,并迅速采取隔离和清除措施,将风险扼杀在萌芽状态。
在防护策略上,墨者安全防护盾采用了多层次的防御体系。不仅能够在网络层面阻挡外部的恶意访问和攻击,还能深入系统内部,对服务器的文件系统、进程等进行深度检查和保护,确保 Webshell 无法植入和运行。
同时,墨者安全防护盾拥有快速的应急响应能力。当 Webshell 攻击事件发生时,专业的安全团队能够迅速介入,进行深入的分析和处理,最大程度减少攻击带来的损失,并帮助用户快速恢复服务器的正常运行。
墨者安全防护盾还注重用户教育和培训,为用户提供关于 Webshell 防范的专业知识和最佳实践,帮助用户提升自身的安全意识和防范能力,共同构建坚实的网络安全防线。