RHEL/CentOS 7的FirewallD及其firewall-cmd命令概述

FirewallD是RHEL/CentOS 7+的一个防火墙服务的守护进程,对应系统的firewalld.service。其与iproute2软件包的iptables/ip6tables的关系如下,实质上都是通过iptables模块配置内核的netfilter模块:

RHEL/CentOS 7的FirewallD及其firewall-cmd命令概述_第1张图片

在RHEL/CentOS 7中,iptables.service/ip6tables.service已经被firewalld.service所替代。

FirewallD引入zone和service的概念以方便进行网络流量的管理。一个zone就是一个预定义的规则集,定义了网络连接及涉及的网卡的可信任等级。一个service就是一种预定义的规则(可能包含一系列操作),只有被加入到一个zone中时,service中的规则才会虽则zone而生效。

FirewallD可以通过NetworkManager GUI工具操作Zones。设置一个网卡归属于一个Zone,可以使用NetworkManager,也可以使用firewall-config GUI工具或firewall-cmd命令。事实上,firewall-config或firewall-cmd命令也是在操作NetworkManager的配置文件,所以也就是使用NetworkManager。对于新加入到NetworkManager的网卡,其从属于默认Zone(即public)。

1. Zones

Zones是若干个预定义的规则集。可以将若干个网卡和sources端口纳入一个Zone。根据用户对网卡连接的网络的信任等级,将网卡或sources端口划分到不同的Zones。通过任何一个网卡的网络连接,都只能属于其中一个Zone。一个Zone可能包含多个网卡的网络连接。

FirewallD基于端口进行流量过滤。对于untrusted的Zones中的端口,firewalld默认拒绝任何流量通过该端口。对于trusted的Zones中的端口,firewalld默认运行任何流量通过该端口。

预定义的Zones文件位于目录/usr/lib/firewalld/zones/,一个zone对应一个这里的XML文件。这些Zones文件如果被修改,则会被复制到/etc/firewalld/zones/目录。

预定义的Zones:

  • public,默认Zone,不信任网络中的其他主机。只有明确给出的外部到来的网络流量请求会被接收,其他都拒绝。
  • drop,任何外部到来的网络连接请求都会被拒绝,而且没有任何返回消息。只允许本机发起的网络连接。
  • block,任何外部到来的网络连接请求都会被拒绝,对于IPv4的请求会返回icmp-host-prohibited消息,对于IPv6的请求会返回icmp6-host-prohibited消息。只允许本机发起的网络连接。
  • external,不信任网络中的其他主机。只有明确给出的外部到来的网络流量请求会被接收,其他都拒绝。适合在外部网络中使用。
  • dmz,只有明确给出的外部到来的网络流量请求会被接收,其他都拒绝。
  • internal,信任网络中的其他主机。只有明确给出的外部到来的网络流量请求会被接收,其他都拒绝。
  • home,信任网络中的其他主机。只有明确给出的外部到来的网络流量请求会被接收,其他都拒绝。
  • work,信任网络中的其他主机。只有明确给出的外部到来的网络流量请求会被接收,其他都拒绝。
  • trusted,任何外部到来的网络连接请求都会被接受。

FirewallD本质上是通过NetworkManager关联一个网卡到一个zone的。但是,可以通过NetworkManager.service配置网卡的zone,也可以通过FirewallD的命令工具配置网卡的zone。如果没有明确配置,新加入到NetworkManager的网卡连接从属于系统的默认zone(即public)。

2. Services

Services是预定义的规则(或者说操作),包含支持某特定服务所必需的所有必要的设置。只有被加入到一个zone中时,service中的规则才会有效。一个Service就是一个关于网络地址、端口、协议、source端口和目标地址的列表。使用Service的初衷就是简化用户的操作,能够一步实现打开端口、定义协议、开启包转发等功能。

Service的配置文件是类似service-Myname.xml的XML文件。/usr/lib/firewalld/services/目录中有大量系统预定义的Services配置文件,但是默认没有被启用。对于用户定制的service配置文件,位于/etc/firewalld/services/(初始没有任何文件)。

3. firewall-cmd命令

FirewallD运行期间的任何firewall-cmd命令操作,都只对当前运行时立刻生效,但重启后都将消失。

当firewall-cmd命令带--permanent选项时,该命令不会对当前运行时生效,而是在重启firewalld之后才生效。所以紧接着执行firewall-cmd --reload命令,才会生效。

当执行了firewall-cmd命令改变了firewalld运行时之后,紧接着执行firewall-cmd --runtime-to-permanent命令,则对当前firewalld运行时的命令立刻生效,而且重启firewalld之后仍然生效。

FirewallD的常见操作:
        开机启动
        systemctl enable firewalld
        手工启动
        systemctl unmask firewalld
        systemctl start firewalld
        手工停止
        systemctl stop firewalld
        禁止开机启动
        systemctl disable firewalld
        禁止通过D-Bus接口启动
        systemctl mask firewalld
        查看状态
        firewall-cmd --state
        systemctl status firewalld
        查看配置参数
        firewall-cmd --list-all
        firewall-cmd --list-all-zones
        firewall-cmd --list-all --zone=home
        firewall-cmd --list-ports
        查看预定义的Zones
        firewall-cmd --get-zones
        默认Zone
        firewall-cmd --get-default-zone
        firewall-cmd --set-default-zone
        查看默认Zone中的网卡
        firewall-cmd --get-active-zones
        firewall-cmd --zone=< --change-interface=
        查看预定义的Services
        firewall-cmd --get-services
        查看启用的Services
        firewall-cmd --list-services
        在默认zone中,启用一个预定义的Service
        firewall-cmd --add-service=
        firewall-cmd --add-service=ssh --zone=public
        创建一个新的Service
        firewall-cmd --new-service=
        或
        firewall-cmd --new-service-from-file=service-name.xml --name=service-name
        将当前运行时的配置持久化,重启后继续生效
        firewall-cmd --runtime-to-permanent
        开放/关闭端口
        firewall-cmd --add-port=/
        firewall-cmd --remove-port=/
            其中,port-type可以是tcp, udp, sctp, dccp
 

参考链接:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls

你可能感兴趣的:(Linux)