天天看点

CentOS 7.9 firewalld使用详解

一、简介:

1、firewalld简介:

      firewalld是firewall daemon,CentOS 7上默认的防火墙管理工具,拥有运行时配置和永久配置选项,也支持允许服务或应用程序直接添加防火墙规则的接口。firewalld使用zones和services的概念,而iptables使用chains和rules。与iptables相比,firewalld提供了更灵活的方式来管理防火墙。firewalld自身并不具备防火墙功能,而是和iptables一样需要通过内核的netfilter来实现。

CentOS 7.9 firewalld使用详解

2、firewalld中区域zone的概念:

       相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙访问控制策略集合(模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现策略之间的快速切换。基于用户对网络中设备和通信所给与的信任程度,firewalld可用于将网络划分成不同的区域,为每个区域提供不同级别的安全性,区域类型如下:

  • block:限制,任何接收的网络连接都被IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息所拒绝。
  • dmz:非军事区,外部受限地访问内部网络,仅接收经过选定的网络连接。
  • drop:丢弃,任何接收的网络数据包都被丢弃,且没有任何回复,仅能有发送的网络连接。
  • external:外部,为路由器启用了伪装功能的外部网络,不信任网络内的其它计算机,仅接收经过选定的网络连接。
  • home:家庭,网络内的其它计算机通常是可信任的,仅接收经过选定的网络连接。
  • internal:内部,网络内的其它计算机通常是可信任的,仅接收经过选定的网络连接。
  • public:公共,也是初始默认区域,不信任网络内的其它计算机,仅接收经过选定的网络连接。当网络接口连接加入了NetworkManager,它们就被绑定至默认区域。
  • trusted:信任,接受所有网络连接。
  • work:工作,网络内的其它计算机通常是可信任的,仅接收经过选定的网络连接。

3、firewalld中预先定义服务service的概念:

      firewalld的service配置是预定义的服务,如果启用了服务,则会自动加载。使用预定义服务可以使用户更轻松地启用和禁用对服务的访问。

4、安装firewalld:

      CentOS 7中firewalld默认已安装,如未安装,可使用命令yum -y install firewalld进行安装。

5、firewalld的三种主要配置方式:

  • 图形化工具:firewall-config
  • 命令行工具:firewall-cmd
  • 直接编辑XML相关配置文件

6、firewalld的两类配置文件保存路径:

  • 系统配置文件(不能编辑修改,为默认设定准备):/usr/lib/firewalld/{services, zones, ...}
  • 用户自定义配置文件:/etc/firewalld/{services, zones, ...}

备注:

  • 默认情况下,在/etc/firewalld/zones目录下只有一个xml配置文件,如果其它zone做了改动并永久保存,会自动生成对应的XML配置文件
  • 以“ZONE=区域名称”的形式保存在/etc/sysconfig/network-scripts/ifcfg-ensXX网络接口配置文件中,重启网络生效
  • 以“DefaultZone=区域名称”的形式保存在/etc/firewalld/firewalld.conf配置文件中,reload防火墙生效
  • 预定义服务XML配置文件位于/usr/lib/firewalld/services目录,每个服务配置文件都记录了该服务使用的tcp或udp端口。当默认提供的服务不够用或需要自定义某服务端口时,需要将/usr/lib/firewalld/services/XML服务配置文件复制至/etc/firewalld/services目录中(默认为空)进行编辑修改。/etc/firewalld目录下的自定义配置文件读取优先级高于/usr/lib/firewalld目录下的系统配置文件。

二、firewalld相关命令:

启动:

# systemctl start firewalld           

关闭:

# systemctl stop firewalld           

重启:

# systemctl restart firewalld           

在保存状态信息的情况下重载防火墙规则:

# systemctl reload firewalld           

查看状态:

# systemctl status firewalld           

开机自启:

# systemctl enable firewalld           

开机禁用:

# systemctl disable firewalld           

查看是否开机自启:

# systemctl is-enabled firewalld           

查看所有开机自启服务:

# systemctl list-unit-files | grep enabled           

三、命令行工具firewall-cmd常用命令:

1、基础命令:

查看帮助:

# firewall-cmd -h           

查看版本:

# firewall-cmd -V           
# firewall-cmd --state           
# firewall-cmd --reload           

启用紧急模式(拒绝所有数据包,强制关闭所有网络连接):

# firewall-cmd --panic-on           

禁用紧急模式:

# firewall-cmd --panic-off           

查看是否启用紧急模式:

# firewall-cmd --query-panic           

2、区域相关命令:

查看所有可用区域:

# firewall-cmd --get-zones           

查看当前默认区域:

# firewall-cmd --get-default-zone           

查看默认区域所有配置:

# firewall-cmd --list-all           

查看特定区域所有配置:

# firewall-cmd --zone=home --list-all           

查看所有可用区域所有配置:

# firewall-cmd --list-all-zones           

设置默认区域:

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

创建新区域:

# firewall-cmd --new-zone=test --permanent           

删除存在特定区域:

# firewall-cmd --delete-zone=test --permanent           

查看当前所有活动区域和对应绑定网络接口:

# firewall-cmd --get-active-zones           

3、网络接口相关命令:

查看特定网络接口绑定区域:

# firewall-cmd --get-zone-of-interface=ens33           

修改特定网络接口绑定区域:

# firewall-cmd --zone=home --change-interface=ens33 --permanent           

将特定网络接口绑定至特定区域:

# firewall-cmd --zone=home --add-interface=ens33 --permanent           

将特定网络接口从默认区域中删除:

# firewall-cmd --remove-interface=ens33 --permanent           

查看特定网络接口是否绑定至默认区域:

# firewall-cmd --query-interface=ens33           

查看默认区域绑定网络接口:

# firewall-cmd --list-interfaces           

备注:一个区域能被多个网络接口绑定,但一个网络接口只能绑定一个区域

4、端口基础命令:

查看默认区域已开放端口:

# firewall-cmd --list-ports           

开放默认区域特定单个端口:

# firewall-cmd --add-port=80/tcp --permanent           

开放默认区域特定多个端口:

# firewall-cmd --add-port=5000-5010/udp --permanent           

关闭默认区域特定端口:

# firewall-cmd --remove-port=80/tcp --permanent           

查看默认区域特定端口是否开放:

# firewall-cmd --query-port=80/tcp           

5、IP伪装相关命令:

启用默认区域IP伪装:

# firewall-cmd --add-masquerade --permanent           

禁用默认区域IP伪装:

# firewall-cmd --remove-masquerade --permanent           

查看默认区域IP伪装是否启用:

# firewall-cmd --query-masquerade           

6、端口转发相关命令:

将本机默认区域80端口流量转发至本机8080端口:

# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent           

将本机默认区域80端口流量转发至服务器192.168.0.120的80端口:

# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.120 --permanent           

将本机默认区域80端口流量转发至服务器192.168.0.120的8080端口:

# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.120 --permanent           

禁用默认区域IPv4端口转发:

# firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=8080 --permanent           

查看默认区域IPv4端口转发是否启用:

# firewall-cmd --query-forward-port=port=80:proto=tcp:toport=8080           

查看默认区域IPv4端口转发:

# firewall-cmd --list-forward-ports           
  • 端口转发是一种将接收的网络数据包从一个端口转发至另一个端口的方法
  • 启用端口转发必须先启用IP伪装
  • 端口转发可以转发至同一台服务器的不同端口,也可以转发至不同服务器的任意端口
  • 源端口和目标端口可以是一个单独的端口,也可以是端口范围
  • 转发的目标IP如果不指定,默认为本机,如果指定了IP却没指定端口,则默认使用源端口
  • 协议可以是tcp或udp
  • 受内核限制,端口转发仅可用于IPv4

7、服务相关命令:

查看默认区域所有支持服务:

# firewall-cmd --get-services           

启用默认区域特定单个服务:

# firewall-cmd --add-service=samba --permanent           

启用默认区域特定多个服务:

# firewall-cmd --add-service={http,https} --permanent           

临时启用默认区域特定单个服务:

# firewall-cmd --add-service=samba --timeout=60s           

禁用默认区域特定服务:

# firewall-cmd --remove-service=samba --permanent           

查看默认区域是否启用特定服务:

# firewall-cmd --query-service=samba           

查看默认区域已启用服务:

# firewall-cmd --list-services           

查看特定服务所有信息:

# firewall-cmd --info-service=samba           

备注:--timeout选项可用时间单位s、m、h

8、ICMP过滤相关命令:

查看默认区域所有支持ICMP类型:

# firewall-cmd --get-icmptypes           

启用默认区域ICMP:

# firewall-cmd --add-icmp-block=echo-reply --permanent           

禁用默认区域ICMP:

# firewall-cmd --remove-icmp-block=echo-reply --permanent           

查询默认区域是否启用ICMP:

# firewall-cmd --query-icmp-block=echo-reply           

查看默认区域已启用ICMP类型:

# firewall-cmd --list-icmp-blocks           

9、富语言规则相关命令:

禁ping(丢弃所有ICMP包):

# firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent           

删除禁ping:

# firewall-cmd --remove-rich-rule='rule protocol value=icmp drop' --permanent           

查看禁ping:

# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'           

允许来自192.168.0.0/24所有网络连接:

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 accept' --permanent           

允许来自192.168.0.0/24网络连接访问ssh服务:

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 service name=ssh accept' --permanent           

拒绝来自192.168.0.0/24网络连接访问ssh服务:

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 service name=ssh reject' --permanent           

允许来自192.168.0.120网络连接访问3306端口:

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.120 port port=3306 protocol=tcp accept' --permanent           

拒绝来自192.168.0.120网络连接访问3306端口:

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.120 port port=3306 protocol=tcp reject' --permanent           

允许来自192.168.0.120网络连接访问3306-3310端口:

# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.120 port port=3306-3310 protocol=tcp accept' --permanent           

查看默认区域已启用富语言规则:

# firewall-cmd --list-rich-rules           
  • 富语言规则允许使用易于理解的命令创建更复杂的防火墙规则
  • accept:所有新的连接请求都会被允许
  • reject:连接将被拒绝,连接来源将接收到一个拒绝信息,拒绝的类型可以被设定为另一种值
  • drop:所有数据包都会被丢弃,且不会向来源地址发送任何信息

10、重要说明:

  • 如果上述命令中没有加入“--permanent”选项,执行后立即生效,但不会写入配置文件,一旦reload防火墙或重启服务或重启系统都会失效
  • 如果上述命令中加入了“--permanent”选项,需要手动reload防火墙或重启服务或重启系统才会永久生效,同时配合“--zone=区域名称”选项决定应用于哪个区域,未指定区域名则表示默认区域

11、帮助文档:

firewalld命令行选项说明:

# man firewalld           

firewalld命令行客户端选项说明:

# man firewall-cmd           

firewalld.conf配置文件参数说明:

# man firewalld.conf           

zone.xml配置文件参数说明:

# man firewalld.zone           

service.xml配置文件参数说明:

# man firewalld.service           

icmptype.xml配置文件参数说明:

# man firewalld.icmptype           

富语言规则参数说明:

# man firewalld.richlanguage           

direct.xml配置文件参数说明:

# man firewalld.direct           

官方文档:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls#sec-Introduction_to_firewalld

四、firewalld使用示例:

1、服务器192.168.0.122禁ping:

配置规则之前:

CentOS 7.9 firewalld使用详解

服务器192.168.0.122执行如下操作:

# firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent
# firewall-cmd --reload
# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
# firewall-cmd --list-rich-rules           
CentOS 7.9 firewalld使用详解

配置规则之后:

CentOS 7.9 firewalld使用详解

2、将服务器192.168.0.122默认区域80端口流量转发至服务器192.168.0.120的8080端口:

服务器192.168.0.120执行如下操作:

# yum -y install epel-release
# yum -y install nginx
# vim /etc/nginx/nginx.conf --> listen 8080;
# systemctl start nginx
# ss -tunlp | grep -w 8080
# systemctl stop firewalld
# firewall-cmd --state           

浏览器访问192.168.0.120:8080

CentOS 7.9 firewalld使用详解
# systemctl start firewalld
# firewall-cmd --state
# firewall-cmd --add-masquerade --permanent
# firewall-cmd --reload
# firewall-cmd --query-masquerade
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.120 --permanent
# firewall-cmd --reload
# firewall-cmd --query-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.120
# firewall-cmd --list-forward-ports           
CentOS 7.9 firewalld使用详解

浏览器访问192.168.0.122

CentOS 7.9 firewalld使用详解
# echo "<h3>port forwarding succeeded</h3>" > /usr/share/nginx/html/test.html           

浏览器访问192.168.0.120:8080/test.html

CentOS 7.9 firewalld使用详解

浏览器访问192.168.0.122/test.html

CentOS 7.9 firewalld使用详解

备注:服务器192.168.0.122不必事先监听自身80端口

# systemctl stop firewalld
# systemctl disable firewalld
# yum -y install iptables-services
# systemctl start iptables
# systemctl enable iptables           

继续阅读