首页 > 编程笔记

Linux firewalld防火墙使用教程

前面学习了 iptables 的概念及其用法(阅读《Linux iptables命令详解》一节),那么在本节中将学习 firewalld 的使用方法。

firewalld简介

firewalld 是 CentOS7 中的特性之一,它不仅支持动态的更新,不需要重新启动服务,而且引入了防火墙的“zone”概念。

firewalld 是配置和监控防火墙规则的系统守护进程。firewalld 通过“zones”来管理防火墙规则。每一个进入系统的数据包,都会首先检查它的源 IP 地址和接口(进出的网卡接口),如果地址与某个 zone 匹配,则该 zone 中的规则将生效。而每个 zone 都会有开启或关闭的服务和端口的列表,以实现允许或拒绝连接服务和端口。

如果数据包的源IP地址和网卡接口都不能和任何 zone 匹配,则该数据包将匹配默认 zone,一般情况下是一个名称为 public 的默认 zone。firewalld 会提供 block、dmz、drop、external、home、internal、public、trusted、work 这 9 个zone。

大部分 zone 都定义有自己的允许规则,规则通过端口/协议(631/udp)或者预定义的服务(ssh)这种形式设置,如果数据包没有匹配这些允许的规则,则该数据包会被防火墙拒绝。但有一个名称为 trusted 的 zone,默认会运行所有的数据流量,如果有一个数据包进入了该 zone,则被允许访问所有的资源。

firewalld 预定义的 zone 名称及其功能如表 1 所示。

表 1 zone名称及其功能
zone名称 功 能
trusted 允许所有的数据包
home 允许其他主机入站访问本机的 ssh, mdns, ipp-client, samba-client 或者 dhcpv6-client 这些预定义的服务;本机访问其他主机后,对方返回的入站数据,都将被允许;拒绝其他所有入站的数据包
internal 允许其他主机入站访问本机的ssh, mdns, ipp-client, samba-client 或者 dhcpv6-client 这些预定义的服务;本机访问其他主机后,对方返回的入站数据,都将被允许;拒绝其他所有入站的数据包
work 允许其他主机入站访问本机的 ssh 或 dhcpv6-client 这些预定义的服务;本机访问其他主机后,对方返回的入站数据,都将被允许;拒绝其他所有入站的数据包
public 允许其他主机入站访问本机的 ssh 或 dhcpv6-client 这些预定义的服务;本机访问其他主机后,对方返回的入站数据,都将被允许;拒绝其他所有入站的数据包
external 允许其他主机入站访问本机的 ssh 服务;本机访问其他主机后,对方返回的入站数据,都将被允许; 拒绝其他所有入站的数据包;通过本 zone 进行转发的 IPv4 数据包,都将会进行 NAT 后再转发出去
dmz 允许其他主机入站访问本机的 ssh 服务;本机访问其他主机后,对方返回的入站数据,都将被允许; 拒绝其他所有入站的数据包
block 本机访问其他主机后,对方返回的入站数据,都将被允许;拒绝其他所有入站的数据包
drop 本机访问其他主机后,对方返回的入站数据,都将被允许;丢弃掉所有其他入站的数据包

firewalld的管理工具

对于系统的管理员来说,可以使用 firewalld-cmd 命令来管理防火墙规则。

一般情况下,CentOS7 中已经安装 firewalld;如果系统中没有的话,需要安装 firewalld 软件包,系统就会提供该命令工具。安装 firewalld 软件包的命令如下:

[root@bogon ~] # yum install firewalld firewall-config


firewalld-cmd 命令的基本格式如下:

[root@bogon ~] # firewalld-cmd [选项]

firewalld-cmd 命令的常用选项及功能如表 2 所示。

表 2 firewalld-cmd命令的常用选项及功能
选 项 功 能
--get-default-zone 获取默认的 zone 信息
--set-default-zone <zone> 设置默认的 zone
--get-active-zones 显示当前正在使用的 zone 信息
--get-zones 显示系统预定义的zone
--get-services 显示系统预定义的服务名称
--get-zones-of-interface=<interface> 查询某个接口与哪个zone匹配
--get-zones-of-source=<source>[/<mask>] 查询某个源地址与哪个zone匹配
--list-all-zones 显示所有的zone信息的所有规则
--add-service=<service> 向zone中添加允许访问的服务
--add-port=<portid>[-<portid>]/<protocol> 向zone中添加允许访问的端口
--add-interface=<interface> 将接口与zone绑定
--add-source=<source>[/<mask>] 将源地址与zone绑定
--list-all 列出某个zone的所有规则
--remove-service=<service> 从zone中移除允许某个服务的规则
--remove-port=<portid>[-<portid>]/<protocol> 从zone中移除允许某个端口的规则
--remove-source=<source>[/<mask>] 将源地址与zone解除绑定
--remove-interface=<interface> 将网卡接口与zone解除绑定
--permanent 设置永久的有效规则,默认规则都是临时的
--reload 重新加载防火墙规则

systemctl 是 CentOS 7 的服务管理工具中主要的工具,它把 service 和 chkconfig 的功能融为一体。firewalld 的使用包括以下几个方面:
例如:

1) 查看默认的zone。命令以及输出结果如下所示:

[root@bogon ~] # firewalld-cmd --get-default-zone
public


2) 设置默认 zone 为 trusted。命令以及输出结果如下所示:

[root@bogon ~] # firewalld-cmd --set-default-zone=trusted
success


3) 显示系统预定义的 zone,默认为 9 个 zone,如下所示:

[root@bogon ~] # firewalld-cmd --get-zones
block  dmz  drop  external  home  internal  public  trusted  work


4) 显示所有的 zone 以及对应的规则信息,显示的部分结果如下所示:

[root@bogon ~] # firewalld-cmd --list-all-zones
block
.......
dmz
.......

读者可自行运行该命令,查看输出结果,这里不再展示。


5) 向 public 的 zone 中添加允许访问 FTP 服务的规则,添加之后的结果如下所示:

[root@bogon ~] # firewalld-cmd --add-service=ftp--zone=public
success

优秀文章