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-block | icmp 报文过滤,按照 icmp 类型配置 |
masquerade | ip 地址伪装 |
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是通过三种方法来判断的:
- source,也就是源地址。
- interface,接收请求的网卡
- firewalld.conf中配置的默认zone,即缺省值。
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个。
PS:上面教程都没有明确注明,但是大家必须要注意每次修改完防火墙规则的时候都必须重载规则才会生效,如果需要规则永久生效需要加上 --permanent 参数,这个是重点,很多新手在这块踩坑!
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,非商业性质可转载须署名链接,详见本站版权声明。
发表评论