1、firewalld简介
在RHEL7/CentOS7.x 版本上,firewalld已经替代iptables成为默认的防火墙软件,firewalld是centos7的一大特性,最大的好处有两个:
第一个:支持动态更新,不用重启服务,随时添加规则,随时生效,这个过程不需要重新装载netfilter内核模块,但是要求所有的规则都通过firewalld守护进程来实现,以确保守护进程内的防火墙状态和内核中的防火墙状态一致;守护进程firewalld,应用程序、守护进程和用户可以通过D-BUS请求一个防火墙特性,特性可以是预定义的防火墙功能,例如:服务、端口和协议的组合、端口/数据报转发、伪装、ICMP拦截或自定义的规则。原有的静态防火墙规则还可以继续使用,但是不能和firewalld同时存在,需要使用这两者中的任何一个时,停止另外一个的使用。
第二个就是加入了区域(zone)的概念
区域定义了网络连接的可信等级,这是一个一对多的关系,意味着一次连接可以仅仅是一个区域的一部分,一个区域可以用于很多连接。
区域的功能包括如下几个方面:
预定义的服务:服务是端口和/或协议入口的组合,备选内容包括netfilter助手模块以及IPv4、IPv6地址。
端口和协议:定义了tcp或udp端口,可以是一个端口或者一个端口范围;
ICMP阻塞:可以选择Internet控制报文协议的报文,这些报文可以是信息请求,也可以是对信息请求或错误条件创建的响应。
伪装(masqerading):私有网络地址可以被映射到公共的IP地址,这是一个正规的IP地址转换。
端口转发:端口可以映射到另外一个端口或者另外一台主机上的端口。
firewalld引入这一概念系统默认存在以下区域:
drop:默认丢弃所有包,不作出任何相应,只允许流出的网络连接
block:拒绝所有外部连接,并返回 IPv4 的 icmp-host-prohibited 报文或者 IPv6 的 icmp6-adm-prohibited 报文。只允许由该系统初始化的网络连接
public:用以可以公开的部分。你认为网络中其他的计算机不可信并且可能伤害你的计算机。只允许选中的连接接入
external: 用在路由器等启用伪装的外部网络。你认为网络中其他的计算机不可信并且可能伤害你的计算机,只允许选中的服务通过。
dmz:用以允许隔离区(dmz)中的电脑有限地被外界网络访问,只允许选中的服务通过。
work:用在工作网络,你新人网络中的大多数计算机不会影响你的计算机,只接受被选中的连接。
home:你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过
internal:用在内部网络。你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过。
trusted:允许所有网络连接,即使没有开放任何服务,那么使用此zone的流量照样通过(一路绿灯)。
2、安装firewalld
firewalld有图形界面和工具界面,本文以字符界面做介绍
firewalld的字符界面管理工具是 firewall-cmd
firewalld默认配置文件有两个:/usr/lib/firewalld/ (系统配置,尽量不要修改)和 /etc/firewalld/ (用户配置地址)
/usr/lib/firewalld/zones/用于配置默认和备用区域,/etc/firewalld/zones用于用户创建和自定义配置区域
root执行
yum install firewalld
3、配置firewalld
(1)为网络连接设置或者修改区域
在ifcfg-eth文件中修改,添加
zone=public(或者其他区域)
来为网卡指定区域,没有指定该参数的话就使用默认的区域
(2)使用firewalld
firewall-cmd
通用选项
查看版本
$ firewall-cmd -V | --version
查看帮助
$ firewall-cmd -h | --help
不显示状态信息
$ firewall-cmd -q | --quiet
状态选项
显示状态
$ firewall-cmd --state running
重新加载防火墙规则并保留原有的状态信息,如果不使用永久生效选项,则重启后规则消失
$ firewall-cmd --reload
重新完全加载防火墙,包括netfilter kernel模块。会因为丢失连接的状态信息而断开已经激活的连接,仅适用于严重的防火墙故障,例如在正确的防火墙规则下但是不能建立有效的连接。
$ firewall-cmd --complete-reload
永久选项
用来设置参数永久生效,这个选项配置的时候不会立即生效,而需要重启服务或者重启系统。没有使用这个参数的话,设置的规则重启防火墙或者重启系统后丢失。
$ firewall-cmd --permanent
区域选项(zone options)
获取默认区域
$ firewall-cmd --get-default-zone public
本机的默认区域是public
设置默认区域,流入默认区域的接口的新请求将由新的默认区域接收,当前已连接的不受影响。
$ firewall-cmd --set-default-zone=zone
显示出当前激活的zone以及zone绑定的端口和zone中使用的资源。输出格式如下
$ firewall-cmd --get-active-zone public interfaces: eno16777736
支持的服务(不一定已经启用),用空格分隔的列表
$ firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
获取所有支持的ICMP类型(不一定启用)
$ firewall-cmd --get-icmptypes destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded
可以看到现在firewalld默认支持的服务已经非常多了
列出全部启用的区域的特性
$ firewall-cmd --list-all-zones
输出某个区域的全部特性
$ firewall-cmd --zone=zone --list-all
查看指定接口所属区域
$ firewall-cmd --get-zone-of-interface=eth0
将接口增加到区域,如果接口不属于区域,接口被增加到这个区域,如果区域被省略,则使用默认区域。接口在小红心加载后重新应用。此时如果接口已经绑定到相应的zone上面以后,这样更改会出错,需要先在对应的zone里面把接口信息删除,然后才能添加
$ firewall-cmd --zone=zone --add-interface=<interface>
修改接口所属的区域
$ firewall-cmd --zone=zone --change-interface=<interface>
从区域中删除一个接口
$ firewall-cmd --zone=zone --remove-interface=<interface>
查询某个区域中是否包含这个接口
$ firewall-cmd --zone=zone --query-interface=<interface>
列出区域中启用的服务
$ firewall-cmd --zone=zone --list-services
启动应急模式阻断所有网络连接,以防出现紧急状况;
$ firewall-cmd --panic-on
禁用应急模式
$ firewall-cmd --panic-off
查看是否启用应急模式
$ firewall-cmd --query-panic
处理运行时区域
运行时模式下对区域进行的修改不是永久有效的,重新加载或者重启系统后修改将失效
启用某个区域中的一种服务,timeout参数设定该服务启动时间,permanet参数设置该服务永久生效(需要重启firewalld守护进程),timeout和permanet不可同时使用。
$ firewall-cmd [--permanet] --zone=zone --add-service [--timeout=seconds]
例如:使区域中的http服务生效5min
$ firewall-cmd --zone=public --add-service --timeout=300
禁止区域中的某种服务
$ firewall-cmd --zone=zone --remove-service
查询区域中是否启用了特定的服务
$ firewall-cmd --zone=zone --query-service
启用端口和协议的组合,端口可以是一个单独的端口或者一个端口范围,协议可以是tcp或udp
$ firewall-cmd --zone=zone --add-port=<port>/protocol [--timeout=seconds]
禁用端口和协议的组合
$ firewall-cmd --zone=zone --remove-port=<port>[-<port>]/<protocol>
查询区域中是否启用了端口和协议的组合,如果启用有返回值,反之没有。
$ firewall-cmd --zone=zone --query-port=<port>[-<port>]/<protocol>
启用区域中的IP伪装功能,私有网络地址被隐藏并映射到一个公有IP,常用于路由,由于内核的性质,仅可用于ipv4
$ firewall-cmd --zone=zone --add-masquerade
禁用IP伪装功能
$ firewall-cmd --zone=zone --remove-masquerade
查询区域的伪装状态
$ firewall-cmd --zone=zone --query-masquerade
启用区域的ICMP阻塞功能
$ firewall-cmd --zone=zone --add-icmp-block=<icmptype>
禁用区域的ICMP阻塞功能
$ firewall-cmd --zone=zone --remove-icmp-block=<icmptype>
查询区域的ICMP阻塞状态
$ firewall-cmd --zone=zone --query-icmp-block=<icmptype>
例如:阻塞区域的响应应答报文
$ firewall-cmd --zone=public --add-icmp-block=echo-reply
在区域中启用端口转发或者映射
$ firewall-cmd --zone=zone --add-forward-port=port=<port>-[<port>]:proto=<protocol> {:toport=<port>-[<port>] | :toaddr=<address> | :toport=<port>-[<port>]:toaddr=<address>}
端口映射到另外一个端口,端口映射到另外一个地址上的相同端口,端口映射到另外一台主机上的不同端口,仅限于ipv4使用;
将本机的80端口转发到8080端口 $ firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
将本机的80端口转发到后端192.168.1.249主机的80端口上 $ firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.249 success
在区域中禁用端口转发或者映射
$ firewall-cmd --zone=zone --remove-forward-port=port=<port>-[<port>]:proto=<protocol> {:toport=<port>-[<port>] | :toaddr=<address> | :toport=<port>-[<port>]:toaddr=<address>}
移除本机80到8080端口的转发 $ firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
移除本机80端口到后端主机192.168.1.249的80端口的映射 $ firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.249
在区域中查询端口转发或者映射
$ firewall-cmd --zone=zone --query-forward-port=port=<port>-[<port>]:proto=<protocol> {:toport=<port>-[<port>] | :toaddr=<address> | :toport=<port>-[<port>]:toaddr=<address>}
处理永久区域
永久选项不直接影响运行时的状态,这些选项尽在重载或者重启服务时可用。为了使用运行时和永久设置,需要分别设置两者,选项--permanent是永久设置的第一个参数,例如:
获取永久设置支持的服务
$ firewall-cmd --permanent --get-services
获取永久设置支持的ICMP类型列表
$ firewall-cmd --permanent --get-icmptypes
获取永久设置支持的区域
$ firewall-cmd --permanent --get-zones
将--permanent设置为第一个参数,即可将临时性的服务设置为永久性生效的服务(需要重启/载服务或重启系统)
直接选项
直接选项给予一个更直接访问防火墙的能力,这个选项要求用户知道一些基本的iptables概念,例如tables(filter/mangle/nat/...),chain(INPUT/OUTPUT,FORWARD/...),command(-A/-D/-I/...),参数(-p/-s/-d/-j/...)和目标(ACCEPT/DROP/REJECT/...)。当防火墙不能使用例如--add-service=service 或者 --add-rich-rule=‘rule‘这样的规则的时候,直接选项只能被用于作为一个最后的手段。每一个选项的第一个参数必须是ipv4或者ipv6或者eb。使用ipv4将适用于IPv4(iptables(8)),ipv6参数适用于IPv6(ipv6tables(8)),eb参数适用于网桥(ebtables(8))。
将命令传递给防火墙。参数 <args> 可以是 iptables, ip6tables 以及 ebtables 命令行参数。
$ firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>
为表 <table> 增加一个新链 <chain> 。
$ firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>
从表 <table> 中删除链 <chain> 。
$ firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>
查询 <chain> 链是否存在与表 <table>. 如果是,返回0,否则返回1.
$ firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>
如果启用,此命令将有返回值。此命令没有输出信息。
获取用空格分隔的表 <table> 中链的列表。
$ firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>
为表 <table> 增加一条参数为 <args> 的链 <chain> ,优先级设定为 <priority>。
$ firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
从表 <table> 中删除带参数 <args> 的链 <chain>。
$ firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
查询 带参数 <args> 的链 <chain> 是否存在表 <table> 中. 如果是,返回0,否则返回1.
$ firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
如果启用,此命令将有返回值。此命令没有输出信息。
获取表 <table> 中所有增加到链 <chain> 的规则,并用换行分隔。
$ firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>
当前的firewalld特性
D-BUS接口:提供防火墙状态信息,使防火墙的启用、挺有或查询设置成为可能。
区域:
服务:可以是一系列本地端口、目的端口记忆附加信息,也可以是服务启动时自动增加的防火墙助手模块。预定义服务的使用使得对服务的启用和禁用更加简单。
ICMP类型:Internet控制报文协议(ICMP)备用阿里交换保本和互联网协议(ip)的错误报文,在firewalld中可以使用ICMP类型来限制报文交换
直接接口:用于服务或者应用程序增加特定的防火墙规则,重载或者重启时需要重新提交。
运行时配置:
永久配置:
托盘小程序firewall-applet为用户显示防火墙状态和存在的问题,也可以用来配置用户允许修改的设置。(图形界面可用)
图形化配置工具firewall-config,支持防火墙的所有特性(除了直接接口)。
命令行客户端firewall-cmd
对于ebtables的支持:要满足libvirt daemon的全部需求,在内核netfilter级上放置iptables和ebtables间访问问题,ebtables支持是需要的,这些命令是访问相同的结构,因而不能同时使用。
/usr/lib/firewalld/中的默认/备用配置
/etc/firewalld/中的系统配置设置
正在开发的特性
富语言:提供了一种不需要了解iptables语法的通过高级语言配置复杂IPv4和IPv6防火墙规则的机制
锁定:为firewalld增加了锁定本地应用或者服务配置的简单配置方式,是一种轻量级的应用程序策略。
用就直接规则:能够提供保存直接规则和直接链的功能个
从iptables和ebtables服务迁移:尽可能提供由iptables,ip6tables和ebtables服务配置转为永久直接规则的脚本。
参考文献:
https://fedoraproject.org/wiki/FirewallD/zh-cn