防火墙指的是一个由软件和硬件设备组合而成,内部和外部网络的环境间产生一种保护的屏障,是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,从而实现对计算机不安全网络因素的阻断。本文主要介绍Linux firewalld防火墙的使用配置。

1、 Linux 防火墙简介

Linux 防火墙是一种位于内部网络与外部网络之间的网络安全系统,是一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙主要通过Netfilter与TCPwrappers两个机制来管理的。

管理防火墙的两种方式:

1)iptables

使用较为复杂,但功能强大。iptables 是交由内核层面的netfilter网络过滤器来处理。

2)firewalld

使用相对简单,firewalld是交由内核层面的nftables包过滤框架来处理。相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

2、firewalld常用的区域

firewalld中将过滤规则集合称之为zone。一个zone就是一套过滤规则,数据包必须要经过某个zone才能入站或出站。firewalld将网卡对应到不同的区域(zone),zone 默认共有9个,分别为block、dmz、drop external、home、internal、public、trusted、work。不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public。firewalld 中最上层的组织是区域。如果一个包匹配区域相关联的网络接口或源 IP/掩码 ,它就是区域的一部分。

常用区域如下表,

区域

说明

trusted (信任区域)

可接收所有的网络连接

public (公共区域)

除非与传出流量相关。或与ssh或dhcpv6-

client预定义服务匹配,否则拒绝流量传入,

在公共区域内,

不能相信网络内的其他计算机不会对计算机造成危害,

只能接收经过选择的连接。

该区域是新添加网络接口的默认区域。

work (工作区域)

除非与传出流量相关,或与ssh、

ipelieat、dhepv-client 预定义服务匹配,

否则拒绝

流量传入,用于工作区。

相信网络内的其他计算机不会危害计算机,

仅接收经过选择 的连接

home (家庭区域)

除非与传出流量相关,

或与ssh、ip-client. mdns、

samba-client、dhepv6-clicnt 预定

义服务匹配,否则拒绝流量传入,用于家庭网络。

信任网络内的其他计算机不会危害 计算机,

仅接收经过选择的连接

internal (内部区域)

除非与传出流量相关,

或与ssh、ipelient、mdns、 

samba-client. dbepv6-client 预定

义服务匹配,否则拒绝流量传入,用于内部网络。

信任网络内的其他计算机不会危害 计算机,

仅接收经过选择的连接

extemal (外部区域)

除非与传出流量相关,或与ssh预定义服务匹配,

否则拒绝流量传入。通过此区域转

发的IPv4传出流量将进行地址伪装,

可用于为路由器启用了伪装功能的外部网络。

dmz (隔离区域也称为非军事区域)

除非 与传出的流量相关,或与ssh预定义服务匹配,

否则拒绝流量传入

block (限制区城)

除非与传出流量相关,否则拒绝所有传入流量

drop (丢弃区域)

除非与传出流量相关,否则丢弃所有传入流量,

并且不产生包含ICMP(Intermet Control Message

Protocol,互联网控制报文协议》的错误响应

3、firewalld-cmd终端管理工具

可以使用 firewalld-cmd 命令来管理我们的防火墙规则,安装 firewalld 这个软件包,系统就会提供该命令工具。firewalld-cmd有两种模式,Runtime模式是当前立即生效,重启后失效。Permanent模式是当前不生效,重启后生效。firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且会随着系统的重启而失效。如需让配置策略一直存在,可以使用永久(Permanent)模式了,只需用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,此时配置的防火墙策略就可以永久生效。但永久生效模式设置的策略只有在系统重启之后才能自动生效。如让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

用法如下:

firewalld-cmd [OPTIONS…]

参数选项:

参数

作用

--get-default-zone

查询默认的区域名称

--set-default-zone=<区域名称>

设置默认的区域,使其永久生效

--get-zones

显示可用的区域

--get-services

显示预先定义的服务

--get-active-zones

显示当前正在使用的区域与网卡名称

--add-source=

将源自此 IP 或子网的流量导向指定的区域

--remove-source=

不再将源自此 IP 或子网的流量导向某个指定区域

--add-interface=<网卡名称>

将源自该网卡的所有流量都导向某个指定区域

--change-interface=<网卡名称

将某个网卡与区域进行关联

--list-all

显示当前区域的网卡配置参数、资源、端口,

以及服务等信息

--list-all-zones

显示所有区域的网卡配置参数、资源、端口,

以及服务等信息

--add-service=<服务名>

设置默认区域允许该服务的流量

--add-port=<端口号/协议>

设置默认区域允许该端口的流量

--remove-service=<服务名>

设置默认区域不再允许该服务的流量

--remove-port=<端口号/协议>

设置默认区域不再允许该端口的流量

--reload

让“永久生效”的配置规则立即生效,

并覆盖当前的配置规则

--panic-on

开启应急状况模式

--panic-off

关闭应急状况模式

使用示例:

1)查看firewalld服务当前所使用的区域

$ firewall-cmd --get-default-zone
public
$

2)查询指定网卡在firewalld服务中绑定的区域

$ firewall-cmd --get-zone-of-interface=ens160
public
$

3)firewalld服务的默认区域设置为public

$ firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
$

4)启动和关闭firewalld防火墙服务的应急状况模式

如果想在1s内或其它情况下阻断一切网络连接,可以使用此模式。该模式会切断一切网络连接,使用时需慎重。

$ firewall-cmd --panic-on
success
$ firewall-cmd --panic-off
success
$

5)查询SSH和HTTPS协议的流量是否允许放行

$ firewall-cmd --zone=public --query-service=ssh
yes
$ firewall-cmd --zone=public --query-service=https
no
$

6)将HTTPS协议的流量设置为永久允许放行

$ firewall-cmd --permanent --zone=public --add-service=https
success
$ firewall-cmd --reload
success
$ firewall-cmd --zone=public --query-service=https
yes
$

注意:执行firewall-cmd --reload命令后设置才会生效

7)将HTTP协议的流量设置为永久拒绝

默认情况下HTTP协议的流量就没有被允许,则会提示“Warning: NOT_ENABLED: http”

$ firewall-cmd --permanent --zone=public --remove-service=http
Warning: NOT_ENABLED: http
success
$ firewall-cmd --reload 
success
$

注意:执行firewall-cmd --reload命令后设置才会生效

8)将运行时配置保存为永久配置

firewall-cmd --runtime-to-permanent

4、常用命令

1)基本操作

查看状态

systemctl status firewalld 

或者 

firewall-cmd --state

启动

systemctl start  firewalld

停止

 systemctl stop firewalld

开机启动

 systemctl enable firewalld

禁用启动

systemctl disable firewalld

2)配置firewalld

查看版本

 firewall-cmd --version

查看帮助

 firewall-cmd --help

查看设置

                显示状态: firewall-cmd --state

                查看区域信息:  firewall-cmd --get-active-zones

                查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0

拒绝所有包

firewall-cmd --panic-on

取消拒绝状态

 firewall-cmd --panic-off

查看是否拒绝

 firewall-cmd --query-panic

更新防火墙规则

firewall-cmd --reload
firewall-cmd --complete-reload

注意firewall-cmd --reloadfirewall-cmd --complete-reload区别是第一个无需断开连接,也是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务 将接口添加到区域,默认接口都在public。 

firewall-cmd --zone=public --add-interface=eth0

注意:永久生效需加上 --permanent 然后reload防火墙

设置默认接口区域

firewall-cmd --set-default-zone=public

查看所有打开的端口

firewall-cmd --zone=dmz --list-ports

添加一个端口到区域

firewall-cmd --zone=dmz --add-port=8080/tcp

注意:若要永久生效参考上述方法

添加服务

服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹

firewall-cmd --zone=work --add-service=smtp

移除服务

firewall-cmd --zone=work --remove-service=smtp

例如,

#拒绝172.27.10.0/22网络用户访问ssh
firewall-cmd --permanent --zone=classroom --add-rich-rule='rule
  family=ipv4 source address=172.27.10.0/22 service name=ssh reject'
#端口转发 :将来自172.25.0.0/24子网5432的端口流量转发到本地的80端口
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source
 address=172.25.0.0/24 forward-port port=5423 protocol=tcp to-port=80'
#在默认区域中,允许每分钟对ftp有两次新连接,临时生效
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
#丢弃来自默认区域中任何位置的所有传入IPsec esp协议包。
firewall-cmd --permanet --add-rich-rule='rule protocol value=esp drop'
#在192.168.10/24子网中的vnc区域,接受端口7900~7905上的所有TCP包。
firewall-cmd --permanent --zone=vnc --add-rich-rule='family-ipv4 
source address=192.168.1.0/24 port prt=7900-7905 protocol=tcp accept'
#允许172.25.1.0/32子网访问http,并记录此流量,但限制每秒3个新连接
firewall-cmd --permanet --add-rich-rle='rule familiy-ipv4 source address=172.25.0.0/32 
service name="http" log level=notice prefix="NEW HTTP" limit value="3/s" accept'

5、端口流量转发

端口流量转发就是把一个端口的数据转发到另外一个端口。可以实现用户通过其他端口号也能访问ssh服务,不需要修改ssh的端口。

命令写法:

firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>

例如,

$ firewall-cmd --permanent --zone=public --add-forward-port=port=28974:proto=tcp:toport=22:toaddr=192.168.10.10
success
$ firewall-cmd --reload
success
$

推荐文档