CentOS 7下Firewalld使用讲解

介绍

firewalldiptables之间关系

firwalld与iptables之间关系

firwalld提供命令行和图形界面,与直接控制iptables相比有两个主要区别:

firewalld使用区域(zone)和服务而不是链式规则。
firewalld动态管理规则集,允许更新规则而不破坏现有会话和连接。

区域zone

区域(zone)简单的解释就是firewalld预先准备了几套防火墙策略,可以根据不同需求而选择合适的策略,默认是public。
默认带的区域(zone)及策略规则如下

trusted 允许所有的数据包
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量数相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量
public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关

安装与配置

CentOS7默认已安装firewalld,但购买的VPS不一定。

安装

yum install firewalld

需要图形界面的话,则再安装

yum install firewall-config

启动与停止

systemctl start firewalld    # 启动
systemctl enable firewalld   # 开机启动
systemctl stop firewalld     # 停止
systemctl disable firewalld  # 禁止开机启动
systemctl status firewalld   # 进程状态

配置firewalld

firewalld使用XML进行配置但通常不用,而是使用firewall-cmd直接管理。
配置文件所在目录

/usr/lib/firewalld 默认配置,如默认区域和公用服务。 避免修改它们,因为每次firewalld软件包更新时都会覆盖这些文件。
/etc/firewalld 系统配置文件。 这些文件将覆盖默认配置。

firewalld管理规则

命令行: firewall-cmd
图形化界面: firewall configuration(暂时不讲)

firewall-cmd具体的使用方法可以

firewall-cmd --help

注意如下两个参数,默认情况下firewall-cmd命令适用于运行时配置,要永久配置需使用--permanent参数,而且需要更新规则后生效firewall-cmd --reload

–permanent # 永久修改,--reload 后生效
–timeout=seconds # 持续效果,到期后自动移除,用于调试,不能与 --permanent 同时使用

过滤规则及优先级

source: 根据源地址过滤
interface: 根据网卡过滤
service: 根据服务名过滤
port: 根据端口过滤
icmp-block: icmp 报文过滤,按照 icmp 类型配置
masquerade: ip 地址伪装
forward-port: 端口转发
rule: 自定义规则

其中,过滤规则的优先级遵循如下顺序

  1. source
  2. interface
  3. firewalld.conf

具体使用

查看运行状态

firewall-cmd --state

查看默认区域

firewall-cmd --get-default-zone

修改默认区域

firewall-cmd --set-default-zone=internal

查看网络接口使用的区域

firewall-cmd --get-active-zones

查看eth0网络接口所在的区域:

firewall-cmd --get-zone-of-interface=eth0

特定区域的所有配置

firewall-cmd --zone=public --list-all

查看所有区域的所有配置

firewall-cmd --list-all-zones

查看重启后所有区域被允许的服务,即永久放行的服务

firewall-cmd --get-service --permanent

启动/关闭应急状况模式,阻断一切网络链接(远程登陆时慎用!!)

firewall-cmd --panic-on
firewall-cmd --panic-off

端口与协议组合

查看默认的可用服务

firewall-cmd --get-services

例如查询、启用、禁用HTTP服务:

firewall-cmd --zone=public --query-service=http
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --reload

允许/拒绝任意端口,端口范围
例如允许/禁用9999端口

firewall-cmd --zone=public --add-port=9999/tcp --permanent
firewall-cmd --zone=public --remove-port=9999/tcp --permanent
firewall-cmd --reload

查询端口是否启用

firewall-cmd --permanent --query-port=9999/tcp

查看允许的端口

firewall-cmd --permanent --list-port

例如允许10000-10100udp端口

firewall-cmd --zone=public --add-port=10000-10100/udp --permanent
firewall-cmd --reload

端口转发
同台服务器80端口转发到8888

firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8888

转发到其他服务器
激活masquerade

firewall-cmd --zone=public --add-masquerade

添加转发规则
例如80转发到111.111.111.111:8080

firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=111.111.111.111

删除规则
用参数--remove替换--add,例如

firewall-cmd --zone=public --remove-masquerade

使用富规则

例如拒绝111.111.111.0/255网段的所有用户访问本机的ssh服务

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="111.111.11.0/255" service name="ssh" reject"
firewall-cmd --reload

重新选择区域构建规则集

在所提供的区域里,dmz只允许SSH和ICMP。所以选择dmz。
将默认区域设为dmz

firewall-cmd --set-default-zone=dmz

将网卡接口添加到dmz区域

firewall-cmd --zone=dmz --add-interface=eth0

将http和https添加永久服务规则到dmz

firewall-cmd --zone=dmz --add-service=http --permanent
firewall-cmd --zone=dmz --add-service=https --permanent

更新规则使其生效

firewall-cmd --reload

此时查看dmz区域所有规则

firewall-cmd --zone=dmz --list-all

输出

dmz (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: http https ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

可以解读为
dmz区域为默认区域,它被用于 eth0 接口中所有网络的源地址和端口。 允许传入 HTTP(端口 80)、HTTPS(端口 443)和 SSH(端口 22)的流量,并且由于没有 IP 版本控制的限制,这些适用于 IPv4 和 IPv6。 不允许IP 伪装以及端口转发。 我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有丰富Rich规则,允许所有出站流量。

相关参考

本文参考
CentOS 7 下使用 Firewall
CentOS 上的 FirewallD 简明指南
第8章 Iptables与Firewalld防火墙

更详细请参考官方文档
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html
https://fedoraproject.org/wiki/FirewallD