CentOS 7 firewalld 配置教程

firewalld 概述

  1. 动态防火墙后台程序 firewalld 提供了一个 动态管理的防火墙, 用以支持网络 “ zones”, 以分配对一个网络及其相关链接和界面一定程度的信任。它具备对 IPv4 和 IPv6 防火墙设置的支持。它支持以太网桥, 并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。

  2. 系统提供了图像化的配置工具 firewall-config、system-config-firewall, 提供命令行客户端 firewall-cmd, 用于配置 firewalld 永久性或非永久性运行时间的改变: 它依次用 iptables 工具与执行数据包筛选的内核中的 Netfilter 通信

20170605144638140.png

基于用户对网络中设备和交通所给与的信任程度, 防火墙可以用来将网络分割成不同的区域 NetworkManager 通知 firewalld 一个接口归属某个区域, 新加入的接口被分配到默认区域。

网络区名称 默认配置

trusted(信任)    可接受所有的网络连接
home(家庭)       用于家庭网络, 仅接受 ssh、mdns、ipp-client、samba-client、或 dhcpv6-client   服务连接
internal(内部)   用于内部网络, 仅接受 ssh、mdns、ipp-client、samba-client、dhcpv6-client 服务连接
work(工作)       用于工作区, 仅接受 ssh、ipp-client 或 dhcpv6-client 服务连接
public(公共)     在公共区域内使用, 仅接受 ssh 或 dhcpv6-client 服务连接, 为 firewalld 的默认区域
external(外部)   出去的 ipv4 网络连接通过此区域伪装和转发, 仅接受 ssh 服务连接
dmz(非军事区)     仅接受 ssh 服务接连
block(限制)      拒绝所有网络连接
drop(丢弃)       任何接收的网络数据包都被丢弃, 没有任何回复

我们知道每个 zone 就是一套规则集, 但是有那么多 zone, 对于一个具体的请求来说应该使用哪个 zone (哪套规则) 来处理呢?这个问题至关重要, 如果这点不弄明白其他的都是空中楼阁, 即使规则设置的再好, 不知道怎样用、在哪里用也不行

对于一个接受到的请求具体使用哪个 zone, firewalld 是通过三种方法来判断的

  1. source, 也就是源地址 优先级最高
  2. interface, 接收请求的网卡 优先级第二
  3. firewalld.conf 中配置的默认 zone 优先级最低

这三个的优先级按顺序依次降低, 也就是说如果按照 source 可以找到就不会再按 interface 去查找, 如果前两个都找不到才会使用第三个, 也就是在前面给大家讲过的在 firewalld.conf 中配置的默认 zone

管理防火墙

安装防火墙软件

yum install firewalld firewall-config -y

firewalld 操作命令

# 查看版本
firewall-cmd --version

# 查看帮助
firewall-cmd --help

# 显示状态
firewall-cmd --state

# 查看所有可用区域
firewall-cmd --get-zones

# 查看区域信息
firewall-cmd --get-active-zones

# 查看默认网络区域
firewall-cmd --get-default-zone

# 列出指定域的所有设置
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

# 列出所有预设服务 (这样将列出 /usr/lib/firewalld/services/ 中的服务器名称。注意: 配置文件是以服务本身命名的 service-name.xml)
firewall-cmd –-get-services


# 查看指定接口所属区域
firewall-cmd --get-zone-of-interface=eth0

# 拒绝所有包
firewall-cmd --panic-on

# 取消拒绝状态
firewall-cmd --panic-off

# 查看是否拒绝
firewall-cmd --query-panic

# 打开端口 (貌似这个才最常用)
# 查看 dmz 区域所有打开的端口
firewall-cmd --zone=dmz --list-ports

# 加入一个端口到 dmz 区域
firewall-cmd --zone=dmz --add-port=8080/tcp

# 若要永久生效方法同上
# 永久生效再加上 --permanent, 然后 reload 防火墙

# 更新防火墙规则
# 两者的区别就是第一个无需断开连接, 就是 firewalld 特性之一动态添加规则
# 第二个需要断开连接, 类似重启服务
firewall-cmd --reload
firewall-cmd --complete-reload

# 打开一个服务, 类似于将端口可视化, 服务需要在配置文件中添加, /etc/firewalld 目录下有services 文件夹
firewall-cmd --zone=work --add-service=smtp

# 移除 work 区域服务
firewall-cmd --zone=work --remove-service=smtp

手动编辑服务文件

firewalld 的配置文件以 xml 格式为主 (主配置文件 firewalld.conf 例外), 他们有两个存储位置

  1. /etc/firewalld/ 用户配置文件
  2. /usr/lib/firewalld/ 系统配置文件, 预置文件

限制 SSH 只能由特定的 IP 连接

vim /etc/firewalld/zones/dmz.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
    <short>DMZ</short>
    <description>(文字说明省略)</description>
    <rule family="ipv4">
        <source address="211.72.188.188"/>
        <service name="ssh"/>
        <!-- <log prefix="sshlog" level="info"/> -->
        <accept/>
    </rule>
</zone>

注意事项

  1. 无须考虑 ICMP 封包的问题, 除非有特别想阻挡的 ICMP 项目
  2. 配置里, 要注解某一行时, 请用 <!-- -->
  3. <rule> 里的 <service>, 只能有一个 <service>
  4. 将 source address 换成你允许开放连接的 IP
  5. 上面的例子 <log> 是无作用, 若要记录此规则的相关连接日志, 可以将 <!-- --> 删除, 它会将资料记录在 /var/log/messages
  6. 若语法有错误, 重新载入时, 会将错误写在 /var/log/firewalld

zone 配置只能限制访问 ip 和设置允许的服务
端口设置要在服务里面设置, 也就是自定义服务至少需要两个文件
一个 zone (区域) xml, 一个是要开启端口 (服务) xml


原文

firewalld的配置
centos7&redhat 之 firewalld 详细介绍配置
CentOS 7 - firewalld防火牆基本概念

最后更新于 2018-01-01
使用 Hugo 构建
主题 StackJimmy 设计