1 Firewalld 概述
1. firewalld 简介
firewalld 的作用是为包过滤机制提供匹配规则(或称为策略),通过各种不同的规则, 告诉netfilter对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式。 为了更加方便地组织和管理防火墙,firewalld 提供了支持网络区域所定义的网络链接以及接 口安全等级的动态防火墙管理工具。它支持 IPv4、IPv6 防火墙设置以及以太网桥,并且拥 有两种配置模式:运行时配置与永久配置。它还支持服务或应用程序直接添加防火墙规则接 口。
2. firewalld 和 iptables 的关系
firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来 实现。也就是说 firewalld 和 iptables 一样,他们的作用都是用于维护规则,而真正使用规 则干活的是内核的 netfilter。
系统提供了图形化的配置工具 firewall-config、system-config-firewall, 提供命令行客户 端 firewall-cmd, 用于配置 firewalld 永久性或非永久性运行时间的改变:它依次用 iptables 工具与执行数据包筛选的内核中的 Netfilter 通信。firewalld 和 iptables 的逻辑关系如图所示。
从图中可以看到,iptables 服务和 firewalld 都是通过 iptables 命令与内核的 netfilter 进行交互的。在 centos7 中,我们仍然可以使用 iptables 命令来管理我们的防火墙。唯一不 同的是当我们重启服务器或重启 firewalld 时,iptables 命令管理的规则不会自动加载,反而 会被 firewalld 的规则代替。
3. firewalld 与 iptables service 的区别
- iptables service 在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里。
- 使 用 iptables service 每 一 个 单 独 更 改 意 味 着 清 除 所 有 旧 有 的 规 则 和 从 /etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的 规则;仅仅运行规则中的不同之处。因此,firewalld 可以在运行时间内,改变设置而不丢失 现行连接。
2 Firewalld 网络区域
firewalld 将所有的网络数据流量划分为多个区域,从而简化防火墙管理。根据数据包的 源 IP 地址或传入网络接口等条件,将数据流量转入相应区域的防火墙规则。对于进入系统 的数据包,首先检查的就是其源地址。
- 若源地址关联到特定的区域,则执行该区域所制定的规则。
- 若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所制定的规则。
- 若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则。
默认区域不是单独的区域,而是指向系统上定义的某个其他区域。默认情况下,默认区 域是 public,但是系统管理员可以更改默认区域。以上匹配规则,按照先后顺序,第一个匹 配的规则胜出。
在每个区域中都可以配置其要打开或者关闭的一系列服务或端口,firewalld 的每个预定 义的区域都设置了默认打开的服务。表中列出了 firewalld 的预定义区域说明。
区域 | 说明 |
trusted(信任区域) | 可接收所有的网络连接 |
public(公共区域) | 除非与传出流量相关,或与 ssh 或 dhcpv6-client 预定义服务匹配,否则拒绝流量传 入,在公共区域内,不能相信网络内的其他计算机不会对计算机造成危害,只能接收 经过选择的连接。并且,该区域是新添加网络接口的默认区域 |
work(工作区域) | 除非与传出流量相关,或与 ssh、ipp-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于工作区。相信网络内的其他计算机不会危害计算机,仅接收经过选 择的连接 |
home(家庭区域) | 除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client 预 定义服务匹配,否则拒绝流量传入,用于家庭网络。信任网络内的其他计算机不会危 害计算机,仅接收经过选择的连接 |
internal(内部区域) | 除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client 预 定义服务匹配,否则拒绝流量传入,用于内部网络。信任网络内的其他计算机不会危 害计算机,仅接收经过选择的连接 |
external(外部区域) | 除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入。通过此区域转 发的 IPv4 传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络 |
dmz(隔离区域也称为 非军事区域) | 除非与传出的流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入 |
block(限制区域) | 除非与传出流量相关,否则拒绝所有传入流量 |
drop(丢弃区域) | 除非与传出流量相关,否则丢弃所有传入流量,并且不产生包含 ICMP(Internet Control Message Protocol,互联网控制报文协议)的错误响应 |
3 Firewalld 防火墙的配置方法
在 CentOS7 系统中,可以使用三种方式配置 firewalld 防火墙:
- firewall-config 图形工具。
- firewall-cmd 命令行工具。
- /etc/firewalld/中的配置文件。
1 firewall-config 图形工具
firewall-config 图形化配置工具支持防火墙所有的特性,系统管理员可以通过它来改变 系统或用户策略。通过 firewall-config 图形化配置工具,可以实现配置防火墙允许通过的服 务、端口、伪装、端口转发、ICMP 过滤器等功能。在 CentOS 7 系统中单击“应用程序”中 的“杂项”,选择“防火墙”即可打开如图所示的 firewall-config 工作界面,或者直接在终端 中输入 firewall-config 命令也可以打开此界面。
firewall-config 工作界面主要分为三个部分,上面是主菜单,中间是配置选项,下面是 区域、服务、IPsets、ICMP 类型、直接配置、锁定白名单设置选项卡。其中,ICMP 类型、 直接配置和锁定白名单选项卡只在从“查看”下拉菜单中选择之后才能看见。最底部是状态栏 从左到右显示了四个信息,依次是连接状态、默认区域、锁定状态、应急模式。
firewall-config 主菜单包括四个菜单项:文件、选项、查看、帮助。其中,“选项”菜单是 最重要的,主要包括以下几个选项。
- 重新加载防火墙:重新加载防火墙规则,当前的永久配置将变成新的运行时配置。例如, 所有的当前运行的配置规则如果没有在永久配置中操作,系统重新加载后就会丢失。
- 更改连接区域:更改网络连接的所属区域和接口。
- 改变默认区域:更改网络连接的默认区域。
- 应急模式:表示丢弃所有的数据包。
- 锁定:可以对防火墙的配置进行加锁,只允许白名单上的应用程序进行修改。
图中的“配置”选项包括运行时和永久两种。运行时配置为当前使用的配置规则,永 久配置规则在系统或服务重启时生效。在 firewall-config 界面中主要需要了解的是区域、服 务、ICMP 等设置的选项卡。
1.“区域”选项卡
“区域”选项卡是一个主要设置的界面。“区域”选项卡下面还包含服务、端口、协议、源 端口、伪装等一系列子选项卡。所以说,区域是服务、端口、协议、IP 伪装、ICMP 过滤等 组合的意思,同时区域也可以绑定到接口和源地址。
(1)“服务”子选项卡
“服务”子选项卡可以定义区域中哪些服务是可信的,可信的服务可以被绑定到该区域的 任意连接、接口和源地址访问,如图所示。
(2)“端口”子选项卡
“端口”子选项卡用于设置允许访问的主机或网络访问的端口范围,如图所示。
(3)“协议”子选项卡
用于添加所有主机或网络均可访问的协议,如图所示。
(4)“源端口”子选项卡
可以添加额外的源端口或范围,连接到这台主机的所有主机或网 络均可访问,如图所示。设置源端口时,可以设置某一个端口号或者是端口范围,同时 还需要选择对应的 TCP 或 UDP 协议。
(5)“伪装”子选项卡
用于把私有网络地址映射到公有的 IP 地址,该功能目前只适用于 IPv4,如图 所示。
(6)“端口转发”子选项卡
可以将指定端口映射到另一个端口或其他主机的指定端口,如 图所示。在设置端口转发时同样需要选择协议类型,且该功能也仅支持 IPv4。
(7)“ICMP 过滤器”子选项卡
ICMP 主要用于在联网的计算机间发送出错信息,但也 发送类似 ping 请求以及回应等信息。在“ICMP 过滤器”子选项卡中可以选择应该被拒绝的 ICMP 类型,其他所有的 ICMP 类型则被允许通过防火墙。默认设置是没有限制,如图所示。
2. “服务”选项卡
服务是端口、协议、模块和目标地址的组合,并且“服务”选项卡只能在“永久”配置视图 中修改,“运行时”配置中的服务是不可以修改的。与“区域”选项卡不同,“服务”选项卡仅包含 五个子选项卡。其中,“端口”“协议”“源端口”这些子选项卡的作用及配置方法与“区域”选项卡 中的相同。
“模块”子选项卡是用于设置网络过滤的辅助模块,如图所示。
“目标地址”子选项卡:如果某服务指定了目标地址,服务项目仅限于目标地址和类型, 如果 IPv4 与 IPv6 均为空,则没有限制,如图所示。
3. 改变防火墙设置
要立刻改变现在的防火墙设置,须确定当前视图设定在运行时。或者,从下拉菜单中选 择永久(Permanent)如见图所示,编辑下次启动系统或者防火墙重新加载时执行的设定。
在运行时(Runtime)模式下更改防火墙的设定时,一旦您启动或者清除连接服务器的复选框,选择立即生效。在 Permanent 模式下更改防火墙的设定,仅仅在重新加载防火墙或者系统重启之后生效。可以使用文件菜单下的重新加载图标,或者点击选项菜单,选择重新加载防火墙。
4. 修改默认分区
要设定一个将要被分配新接口的分区作为默认值,则启动 firewall-config,从菜单栏 选择选项卡,由下拉菜单中选择修改默认区域,出现默认区域窗口如图所示。
2 firewall-cmd 命令
1. firewalld 服务管理
在安装 CentOS7 系统时,会自动安装 firewalld 和图形化工具 firewall-config。执行以 下命令可以启动 firewalld 并设置为开机自启动状态。
[root@localhost ~]# systemctl start firewalld //启动 firewalld
[root@localhost ~]# systemctl enable firewalld //设置 firewalld 为开机自启动
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.
service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service
to /usr/lib/systemd/system/firewalld.service.
如果 firewalld 正在运行,通过 systemctl status firewalld 或 firewall-cmd 命令可以查 看其运行状态。
[root@localhost ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor
preset: enabled)
Active: active (running) since 三 2017-09-20 08:08:14 CST; 46s ago
Docs: man:firewalld(1)
Main PID: 3556 (firewalld)
CGroup: /system.slice/firewalld.service
└─3556 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
9 月 20 08:08:11 localhost.localdomainsystemd[1]: Starting firewalld - dynamic
firewall daemon...
9 月 20 08:08:14 localhost.localdomainsystemd[1]: Started firewalld - dynamic
firewall daemon.
或
[root@localhost ~]# firewall-cmd --state
running
如果想要禁用 firewalld,执行以下命令即可实现。
[root@localhost ~]# systemctl stop firewalld //停止 firewalld
[root@localhost ~]# systemctl disable firewalld //设置 firewalld 开机不自启动
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
2. 获取预定义信息
irewall-cmd 预定义信息主要包括三种:可用的区域、可用的服务以及可用的 ICMP 阻 塞类型,具体的查看命令如下所示。
[root@localhost ~]# firewall-cmd --get-zones //显示预定义的区域
work drop internal external trusted home dmz public block
[root@localhost ~]# firewall-cmd --get-service //显示预定义的服务
RH-Satellite-6 amanda-client amanda-k5-client baculabacula-client cephceph-
mondhcp dhcpv6 dhcpv6-client dnsdocker-registry dropbox-lansyncfreeipa-ldap
freeipa-ldapsfreeipa-replication ftp high-availability http https imapimaps
ippipp-clientipseciscsi-target kadminkerberoskpasswdldapldapslibvirt
libvirt-tlsmdns mosh mountdms-wbtmysqlnfsntpopenvpnpmcdpmproxypmwebapi
pmwebapis pop3 pop3s postgresqlprivoxy proxy-dhcpptppulseaudiopuppetmaster
radiusrpc-bindrsyncd samba samba-client sane smtpsmtpssnmpsnmptrap squid ssh
synergy syslog syslog-tls telnet tftptftp-client tinc tor-socks transmission- clientvdsmvnc-serverwbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
[root@localhost ~]# firewall-cmd --get-icmptypes //显示预定义的 ICMP 类型
destination-unreachable echo-reply echo-request parameter-problem redirect router
-advertisement router-solicitation source-quench time-exceeded timestamp-reply
timestamp-request
firewall-cmd --get-icmptypes 命令的执行结果中各种阻塞类型的含义分别如下所示。
- destination-unreachable:目的地址不可达。
- echo-reply:应答回应(pong)。
- parameter-problem:参数问题。
- redirect:重新定向。
- router-advertisement:路由器通告。
- router-solicitation:路由器征寻。
- source-quench:源端抑制。
- time-exceeded:超时。
- timestamp-reply:时间戳应答回应。
- timestamp-request:时间戳请求。
3. 区域管理
使用 firewall-cmd 命令可以实现获取和管理区域,为指定区域绑定网络接口等功能。表中列出了 firewall-cmd 命令的区域管理选项说明。
选项 | 说明 |
--get-default-zone | 显示网络连接或接口的默认区域 |
--set-default-zone= | 设置网络连接或接口的默认区域 |
--get-active-zones | 显示已激活的所有区域 |
--get-zone-of-interface=<interface> | 显示指定接口绑定的区域 |
--zone= --add-interface=<interface> | 为指定接口绑定区域 |
--zone= --change-interface=<interface> | 为指定的区域更改绑定的网络接口 |
--zone= --remove-interface=<interface> | 为指定的区域删除绑定的网络接口 |
--list-all-zones | 显示所有区域及其规则 |
[--zone=] --list-all | 显示所有指定区域的所有规则,省略--zone=时表示仅 对默认区域操作 |
(1)显示当前系统中的默认区域。
[root@localhost ~]# firewall-cmd --get-default-zone
public
(2)显示默认区域的所有规则。
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
(3)显示网络接口 ens33 对应区域。
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public
(4)将网络接口 ens33 对应区域更改为 internal 区域。
[root@localhost ~]# firewall-cmd --zone=internal --change-interface=ens33
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[root@localhost ~]# firewall-cmd --zone=internal --list-interfaces
ens33
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
internal
(5)显示所有激活区域。
[root@localhost ~]# firewall-cmd --get-active-zones
internal
interfaces: ens33
4. 服务管理
service 配置具有以下优点。
- 通过服务名字来管理规则更加人性化。
- 通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服 务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
选择 | 说明 |
[--zone=] --list-services | 显示指定区域内允许访问的所有服务 |
[--zone=] --add-service=<service> | 为指定区域设置允许访问的某项服务 |
[--zone=] --remove-service=<service> | 删除指定区域已设置的允许访问的某项服务 |
[--zone=] --list-ports | 显示指定区域内允许访问的所有端口号 |
[--zone=] --add-port=<portid>[-<portid>]/<protocol> | 为指定区域设置允许访问的某个/某段端口号(包括 协议名) |
[--zone=] --remove-port=<portid>[-<portid>]/<protocol> | 删除指定区域已设置的允许访问的端口号(包括协 议名) |
[--zone=] --list-icmp-blocks | 显示指定区域内拒绝访问的所有 ICMP 类型 |
[--zone=] --add-icmp-block=<icmptype> | 为指定区域设置拒绝访问的某项 ICMP 类型 |
[--zone=] --remove-icmp-block=<icmptype> | 删除指定区域已设置的拒绝访问的某项 ICMP 类 型,省略--zone=时表示对默认区域操作 |
(1)为默认区域设置允许访问的服务。
[root@localhost ~]# firewall-cmd --list-services
//显示默认区域内允许访问的所有服务
dhcpv6-clientssh
[root@localhost ~]# firewall-cmd --add-service=http
//设置默认区域允许访问 http 服务
success
[root@localhost ~]# firewall-cmd --add-service=https
//设置默认区域允许访问 https 服务
success
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client ssh http https
(2)为 internal 区域设置允许访问的服务。
[root@localhost ~]# firewall-cmd --zone=internal --add-service=mysql
//设置 internal 区域允许访问 mysql 服务
success
[root@localhost~]# firewall-cmd --zone=internal --remove-service=samba-client
//设置 internal 区域不允许访问 samba-client 服务
success
[root@localhost ~]# firewall-cmd --zone=internal --list-services
//显示 internal 区域内允许访问的所有服务
ssh mdns dhcpv6-client mysql
5. 端口管理
在进行服务配置时,预定义的网络服务可以使用服务名配置,服务所涉及的端口就会自 动打开。但是,对于非预定义的服务只能手动为指定的区域添加端口。
[root@localhost ~]# firewall-cmd --zone=internal --add-port=443/tcp
success
若想实现在 internal 区域禁止 443/TCP 端口访问,可执行以下命令。
[root@localhost ~]# firewall-cmd --zone=internal --remove-port=443/tcp
success
6. 两种配置模式
firewall-cmd 命令工具与配置模式相关的选项有三个。
- --reload:重新加载防火墙规则并保持状态信息,即将永久配置应用为运行时配置。
- --permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动 firewalld 或重新加载防火墙规则时才会生效;若不带有此选项,表示用于设置运行时规 则。
- --runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。