CentOS7下自带防火墙firewalld使用手册

  • 内容
  • 评论
  • 相关

防火墙是 Linux 系统的主要的安全工具,可以提供基本的安全防护,在 Linux 历史上已经使用过的防火墙工具包括:ipfwadm、ipchains、iptables。随着CentOS 7的发布,防火墙也已经升级为firewalld。

firewalld 提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。以前的 iptables 防火墙是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。而模块的卸载将会破坏状态防火墙和确立的连接。现在 firewalld 可以动态管理防火墙。

firewalld划分的区域(安全等级):

drop 丢弃所有进入的包,而不给出任何响应
block 拒绝所有外部发起的连接,允许内部发起的连接
public 允许指定的进入连接
external 同上,对伪装的进入连接,一般用于路由转发
dmz 允许受限制的进入连接
work 允许受信任的计算机被限制的进入连接,类似 workgroup
home 同上,类似 homegroup
internal 同上,范围针对所有互联网用户
trusted 信任所有连接

说明:firewalld 的缺省区域是 public。

过滤规则:

source根据源地址过滤
interface根据网卡过滤
service根据服务名过滤
port根据端口过滤
icmp-blockicmp 报文过滤,按照 icmp 类型配置
masqueradeip 地址伪装
forward-port端口转发
rule自定义规则

使用以下命令可以获取到firewalld的可用区域列表

$ firewall-cmd --get-zones

block drop work internal external home dmz public trusted

将当前区域设置为家庭:

$ firewall-cmd --set-default-zone=home

查看当前的区域:

$ firewall-cmd --get-active-zones

设置当前的区域的接口:

$ firewall-cmd --get-zone-of-interface=enp03s

显示所有公共区域(public):

$ firewall-cmd --zone=public --list-all

临时修改网络接口 enp0s3 为 内部区域(internal):

$ firewall-cmd --zone=internal --change-interface=enp03s

永久修改网络接口 enp0s3 为 内部区域(internal):

$ firewall-cmd --permanent --zone=internal --change-interface=enp03s

firewalld的服务管理

显示所有服务列表:

$ firewall-cmd --get-services

 cluster-suite pop3s bacula-client smtp ipp radius 
 bacula ftp mdns samba dhcpv6-client https 
 openvpn imaps samba-client http dns telnet libvirt 
 ssh ipsec ipp-client amanda-client tftp-client nfs tftp libvirt-tls

允许 ftp 服务通过:

$ firewall-cmd --enable service=ftp

禁止 ftp 服务通过:

$ firewall-cmd --disable service=ftp

临时允许 smtp 服务通过 600 秒:

$ firewall-cmd --enable service=smtp --timeout=600

把 ssh 服务加入到home分区,即允许 ssh 接入home:

$ firewall-cmd --zone=home --add-service=ssh 

把 ssh 服务移出home分区:

$ firewall-cmd --zone=home --remove-service=ssh

如何添加一个新服务可以参考filewalld官网的这篇文章: https://firewalld.org/documentation/howto/add-a-service.html

firewalld的端口管理

查看public分区的全部开放的端口列表:

$ firewall-cmd --zone=public --list-ports

查询public分区的80/tcp端口是否开放:

$ firewall-cmd --zone=public --query-port=80/tcp

永久打开public分区的80/tcp端口:

$ firewall-cmd --zone=public --add-port=80/tcp --permanent

永久关闭public分区的80/tcp端口:

$ firewall-cmd --zone= public --remove-port=80/tcp --permanent

打开转发(伪装):

$ firewall-cmd --zone=external --add-masquerade #ip转发前必须打开

将外部区域的 tcp 22 端口至 8888 端口:

$ firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=8888

转发 22 端口数据至IP192.168.0.88的相同端口上:

$ firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=192.168.0.88

转发 22 端口数据至IP192.168.0.88 的 8888 端口上:

$ firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=8888:toaddr=192.168.0.88

IP伪装

查询是否允许伪装:

$ firewall-cmd --zone=external --query-masquerade

关闭伪装:

$ firewall-cmd --zone=external --remove-masquerade

禁封IP(屏蔽IP)或解封IP(解除屏蔽IP):

禁封IP(屏蔽IP)单个IP:

$ firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.11 reject' --permanent

查看屏蔽是否生效:

$ firewall-cmd --list-all

解除对单个IP的屏蔽:

$ firewall-cmd --remove-rich-rule='rule family=ipv4 source address=192.168.0.11 reject' --permanent

屏蔽某一段IP:

$ firewall-cmd --remove-rich-rule='rule family=ipv4 source address=142.128.0.0/16 reject' --permanent #解封和禁封单个IP时一致remove对应规则就行

firewalld的状态管理:

$ systemctl start firewalld  #启动firewalld防火墙
$ systemctl restart firewalld #重启firewalld防火墙
$ systemctl stop firewalld #关闭firewalld防火墙
$ systemctl status firewalld #查看firewalld防火墙服务状态
$ firewall-cmd --state #查看firewalld运行状态
$ systemctl enable firewalld #打开firewalld开机启动
$ systemctl disable firewalld #禁止firewalld开机启动
$ firewall-cmd --reload #重载防火墙规则

当前是哪条防火墙规则在生效?

大家通过前面的介绍应该都知道了firewalld中每个zone就是一套规则集,但是有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

  1. source,也就是源地址。
  2. interface,接收请求的网卡
  3. firewalld.conf中配置的默认zone,即缺省值。

这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个。

PS:上面教程都没有明确注明,但是大家必须要注意每次修改完防火墙规则的时候都必须重载规则才会生效,如果需要规则永久生效需要加上 --permanent 参数,这个是重点,很多新手在这块踩坑!


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,非商业性质可转载须署名链接,详见本站版权声明。

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注