1 firewall的原理

firewall有9个域zone,默认是public域

名称功能配置文件
阻塞区域(block)任何传入的网络数据包都将会被阻止block.xml
工作区域(work)相信网络上的其他计算机不会损害自己的计算机work.xml
家庭区域(home)相信网络上的其他计算机不会损害自己的计算机home.xml
公共区域(public)不相信网络上的任何计算机,只有选择接受传入的网络计算机public.xml
隔离区域(DMZ)隔离区域也被叫做非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接dmz.xml
信任区域(trusted)所有的网络连接都可以接受trusted.xml
丢弃区域(drop)任何传入的网络连接都被拒绝,且不响应drop.xml
内部区域(internal)信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接internal.xml
外部区域(external)不相信网络上的其他计算机,不会损害你的计算机,只有选择接受传入的网络连接external.xml

这些zone的配置文件都保存在/usr/lib/firewallld/zones目录下。默认情况下在/etc/firewalld/zones下面只有一个public.xml。如果给另外一个zone做一些改动,并永久保存,那么就会自动生成对应的配置文件。
比如给work zone增加一个端口

firewall-cmd --permanent --zone=work --add-prot=1000/tcp

那么就会在/usr/lib/firewalld/zones/目录下生成对应的work.xml配置文件。
由此可见,firewalld的配置文件其实有两个主要的目录

  1. /usr/lib/firewalld/系统配置文件,尽量不要修改
  2. /etc/firewalld/用户配置文件,可以自行修改

/etc/firewalld配置文件目录下面,不止保存了zones的配置文件,还有services文件,也就是/usr/lib/firewalld/services/目录中,每个文件分别对应一项具体的网络服务,通过名字来管理更加高效。

2 Firewall服务的配置和使用

2.1 systemctl对防火墙的管理

systemctl start firewalld    # 起服务
systemctl stop firewalld #停服务
systemctl enable firewalld # 设置防火墙开机自启
systemctl disable firewalld # 关闭防火墙开机自启
systemctl status firewalld # 查看firewalld服务的状态
systemctl mask firewalld.service    # 注销服务,执行后无法使用systemctl控制该服务的开启与关闭且开机不会加载该服务
systemctl unmask firewalld.service # 取消注销

2.2 firewall-cmd对防火墙的管理

firewall-cmd --state    # 显示状态
firewall-cmd --reload    # 重载防火墙策略,无需断开链接,动态加载规则
firewall-cmd --complete-reload # 重启防火墙,类似于重启服务
firewall-cmd --panic-on        # 任何人都不能访问我这台计算机
firewall-cmd --panic-off    # 与上一条命令对应

2.3 对zone和服务的全览(泛查询)

firewall-cmd --get-zones    # 查看所有的zone
firewall-cmd --get-default-zone    # 查看默认的zone
firewall-cmd --get-active-zones    # 查看活跃的zone
firewall-cmd --get-zone-of-interface=ens33    # 查看ens33接口所属区域
firewall-cmd --get-services    # 查看所有的服务

2.4 对某个zone下的服务查看,可以配合”–zone=域”使用

firewall-cmd --list-all    # 列出指定的zone的规则,如果不指定zone默认查看当前活跃zone的规则
firewall-cmd --list-source    # 列出源IP
firewall-cmd --list-source-ports    # 列出源端口
firewall-cmd --list-ports    # 列出端口
firewall-cmd --list-services    # 列出活跃zone下的服务

2.5 对服务、端口等的设置与添加,策略的设置

firewall-cmd --set-default-zone=work    # 设置默认zone
firewall-cmd --add-interface=ens33    # 添加接口
firewall-cmd --add-source=192.168.0.21    # 添加源地址
firewall-cmd --add-service=dhcp    # 添加服务
firewall-cmd --add-port=80/tcp    # 添加端口
firewall-cmd --add-masquerade    # 开启内核路由转发功能,其等同于以下改法
vim /etc/sysctl.conf修改net.ipv4.ip_forward = 1
firewall-cmd --add-icmp-block=echo-request    # 禁止ping
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 设置80到8080端口转发,add-forward-prot=后面的内容以冒号分隔,正好是三对,源端口:协议:目标端口

2.6 对策略的删除

firewall-cmd --remove-sevice=dhcp    # 删除服务
firewall-cmd --remove-port=80/tcp    # 删除端口
firewall-cmd --panic-on    # 丢弃
firewall-cmd --query-panic    # 查询丢弃状态
firewall-cmd --panic-off    # 取消丢弃

2.7 永久生效

firewall-cmd --permanent ...    # 如果想要永久生效,就在firewall-cmd后边加一个--permanent参数

3 富规则

rule
    [source]
    [destination]
    service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
    [log]
    [audit]
    [accept|reject|drop|mark]
firewall-cmd --add-rich-rules='rule family=ipv4 source not address=192.168.0.200 destination address=192.168.0.33 accept'
# 源地址不是192.168.0.200目标地址是192.168.0.33的情况,允许通过