从CentOS6迁移到7系列,变化有点多,其中防火墙就从iptables变成了默认Firewalld服务。firewalld网上资料很多,但没有说得太明白的。一番摸索后,总结了这篇文章,用于快速上手。

1.概览

CentOS7.2.1511 默认防火墙如下图:

这里升级到最新的,相对于默认的这里增加了几个配置,是firewalld更灵活。

2.区域(zone)

firewalld是centos7的一大特性,最大的好处有两个:
(1)支持动态更新,不用重启服务;
(2)引入了防火墙的“zone”概念,简单来说就是为用户预先准备了几套防火墙策略模板,然可根据不同场景选择相应的策略,类似于我们常见windows下网络连接时候选择的工作区(工作网络,家庭网络,公共网络)。
关于第二点的特性实现就使用到了一个区域(zone)的概念。对应到上图中的是1号位置
通过下面命令查看所有的区域
下表给出了所有区域解释
 

3.过滤规则

target:区域放行策略,类似iptables中的target,例如public区域设置target:default,该区域的规则为白名单模式。如果target:ACCEPT,则该区域的网络接口全放行(为什么这里是说的网络接口?下面interface项详细解释)。设置target使用下面命令:
 
这里有两个问题:
1.第一次命令失败,提示必须要加上参数--permanent
    在firewalld-cmd执行的命令中,如果是规则相关的,加上--permanent参数不会立即生效,只会被记录到配置文件。如果要生效需要调用firewall-cmd --reload重载;如果不加--permanent则是立即生效,但如果--reload会被清掉。
    此外,在firewall-cmd命令中有些命令需要必须加--permanent参数,比如这里的--set-target。下面执行--reload
icmp-block-inversion:这个是一个禁ping的参数,默认关闭
interfaces:该区域绑定的网络接口。firewalld的优势就是分了不同的区域,通过这个参数可以为不同的网络接口指定规则。图中ens192网卡被指定到了public区域,所有这个网卡上的请求都应用这个区域的规则。
使用命令 firewall-cmd --change-interface=ens192 --zone=public 修改网卡绑定区域
关于这个有两点注意:
1.网路接口可以不被指定在任何区域,在这种情况下,没有被指定区域的网络接口使用默认zone。下面两条命令获取/设置默认zone
2.interfaces的优先级别没有source高。优先级为:source>interface>firewalld.conf
firewalld是封装的iptables,所以看iptables规则更直接。例如有以下配置,网络接口在public中,trusted区域中放行10.10.10.10源,其他区域默认不修改:
public (active)
target: default
icmp-block-inversion: no
interfaces: ens192
sources:
... trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 10.10.10.10/32
...
通过iptables查看source区域在前面,所以优先级比interface高。
 
sources:根据源ip放行
services:根据服务进行放行,默认的里面有ssh和dhcpv6-client两个服务。ssh就是22端口。
如果需要自定义一个服务规则,怎么做呢?
在/etc/firewalld/services下面添加自定义配置test.xml,如
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Test Port</short>
<port protocol="tcp" port="5000"/>
</service>
然后就能通过--add-service以服务名test添加规则
 
ports:根据端口放行
protocols:协议类型,默认为空
masquerade:地址隐藏,默认是no,如果设置成yes,使用lo本地地址访问时候,会被转换成物理ip
forward-ports:
source-ports:
icmp-blocks:
rich rules:复杂规则。使用复杂规则能很统一的控制规则。一条完整的规则如下,规则中source,destination, port项都是可以根据需要缺省的
rule family="ipv4" source address="0.0.0.0" destination address="192.168.136.190" port port="3306" protocol="tcp" accept
添加规则使用命令:firewall-cmd --add-rich-rule='...'
同样使用--permanent参数为指定永久规则
 

4.firewalld配置

firewalld的配置在/etc/firewall下
在zones目录下,存放有所有区域的配置。进入到zones目录下,没有看到所有文件?
原因是firewalld在这个目录下没有找到配置的时候,会使用/usr/lib/firewalld/zones下配置。该目录下是服务默认配置,在/etc下不能找到相关配置则使用/usr/lib下的

5.接口封装

如果在接口中使用firewalld服务,调用shell命令的方式效率低。平均添加一条rich-rule需要0.7s的时间(8c,12G,CentOS7)。
这里推荐一种方式是,直接去操作/etc/firewalld/zone下的 xml 配置文件,最后使用 --reload 加载规则。这种方式下,写文件的时间可以忽略,所有的时间都耗费在 reload上。总共时间测试下来在2s以内。
示例文件:
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>Nothing</description>
  <service name="ssh"/>
  <rule family="ipv4">
    <source address="10.10.10.10"/>
    <destination address="10.10.10.10"/>
    <port protocol="tcp" port="1000"/>
    <accept/>
  </rule>
</zone>

import xml.etree.cElementTree as ET
tree = ET.ElementTree(file="/etc/firewalld/zones/public.xml")
root = tree.getroot() # 获取rich rule规则
for each_rule in root.findall('rule'):
# 打印地址协议
print 'family:' + str(each_rule.attrib)
# 打印源地址
source_obj = each_rule.find('source')
if source_obj is not None:
print 'source:' + str(source_obj.attrib)
# 打印目的地址
destination_obj = each_rule.find('destination')
if destination_obj is not None:
print 'destination:' + str(destination_obj.attrib)
# 打印端口
port_obj = each_rule.find('port')
if port_obj is not None:
print 'port:' + str(port_obj.attrib) # 删除rich rule规则,删除参数为rich rule字符串,记为 remove_str
# decode_obj(element) 将xml结构解析成字符串,返回值为字符串,注意字符串赋值顺序,语法细节参考添加规则
for each_rule in root:
if decode_obj(each_rule) == remove_str:
root.remove(each_rule) # 剩下的修改功能、查找功能可以参照上面实现,这里主要说明的是xml库的使用方法

这里再针对xml库说明下,从<zone>开始,每一层都是一个节点,然后形成的一棵树。每个节点是 ET.Element(tag, attrib={}),比如这里short, description, service , rule都是tag, family是attrib

需要访问节点的 tag 和 attrib,直接xmlobj.tag,xmlobj.attrib方式访问

获取子节点使用xmlobj.getchildren(),或者是获取指定tag的节点xmlobj.findall(tag)

 
 

firewalld 极速上手指南的更多相关文章

  1. Rancher 快速上手指南操作(1)

    Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...

  2. X下轻量级桌面WindowMaker上手指南

    layout: post title: 轻量级桌面WindowMaker上手指南 tags: x11, cygwin, raspi --- 最近工作上需要在远程Linux上运行一个桌面(我需要跑Net ...

  3. UnityShader快速上手指南(三)

    简介 这一篇还是一些基本的shader操作:裁剪.透明和法向量的应用 (纠结了很久写不写这些,因为代码很简单,主要是些概念上的东西) 先来看下大概的效果图:(从左到右依次是裁剪,透明,加了法向量的透明 ...

  4. Windows 8 系统完全上手指南 - 非常详尽的 Win8 系统入门学习手册与使用技巧专题教程!

    每次当有新版本的操作系统发布的时候,市面上总会冒出各种从入门到精通类的学习书籍,这次最新的 Windows 8 也不例外!不过,今天给大家送上免费的大礼——<Windows 8 完全上手指南&g ...

  5. Resharper上手指南

    原文http://www.cnblogs.com/renji/archive/2007/12/11/resharper.html Resharper上手指南 我是visual studio的忠实用户, ...

  6. NewLife.XCode 上手指南2018版(二)增

    目录 NewLife.XCode 上手指南2018版(一)代码生成 NewLife.XCode 上手指南2018版(二)增 NewLife.XCode 上手指南2018版(三)查 NewLife.XC ...

  7. NewLife.XCode 上手指南2018版(一)代码生成

    目录 NewLife.XCode 上手指南2018版(一)代码生成 NewLife.XCode 上手指南2018版(二)增 NewLife.XCode 上手指南2018版(三)查 NewLife.XC ...

  8. Gatsby上手指南 - 让你的静态网站用react来高逼格的写

    注意:Gatsby V2版本安装及使用问题请移步<Gastby V2安装过程中常见问题>,此文较旧,主要针对V1版Gatsby而介绍 前言 一直以来都是用之前比较流行的静态网站生成器Hex ...

  9. [转]Rancher 快速上手指南操作(1)

    本文转自:http://www.cppblog.com/zhiyewang/archive/2016/03/17/213053.aspx Rancher 快速上手指南操作(1)该指南知道用户如何快速的 ...

随机推荐

  1. MYSQL 之 JDBC(五): 增删改查(三)PreparedStatement

    是Statement的子接口,可以传入带占位符的sql语句,并且提供了补充占位符变量的方法. 使用Statement需要进行拼写SQL语句,很辛苦,很容易出错. 引号的问题处理很复杂,不利于维护. 可 ...

  2. 数据可视化之powerBI技巧(八)Power BI按多列排序的技巧

    目前PowerBI的表格已经支持多列排序,但是矩阵依然还不支持按多个字段排序,虽然这个需求很普遍,这里利用DAX提供一个变通的实现方式. 模拟数据如下,有两个数据指标: 对类别首先按[指标一]进行排序 ...

  3. 数据可视化之DAX篇(二十五)PowerBI常用的度量值:累计至今

    https://zhuanlan.zhihu.com/p/64999937 经常碰到本年至今.本月至今的数据计算,其实还有一类计算是,从历史最早日期至今的累计计算,比如从开业到现在总共卖出了多少件商品 ...

  4. 前端04 /css样式

    前端04 /css样式 目录 前端04 /css样式 昨日内容回顾 css引入 选择器 基础选择器 组合选择器 属性选择器 伪类选择器 伪元素选择器 优先级(权重) 通用选择器 css样式 1高度宽度 ...

  5. Java数据类型自动转换(++ ,+=)

    在算术表达式中的自动类型转换 数据从类型范围小的自动向数据范围大的转换 整数向浮点数转换(包括long类型向float转换) 例子: char类型的范围内与整数之间转换依据ASCII表 强制转换会丢失 ...

  6. linux 安装 mysql8

    1. 下载地址: https://dev.mysql.com/downloads/file/?id=484922 2. 安装 mysql80-community-release-el7-3.noarc ...

  7. Babel:下一代Javascript语法编译器

    定义 Babel是一个Javascript的编译器,通过它你可以将一些新版本的ECMAScript语法转换成低版本的语法.以便能够在低版本的浏览器或者其它环境平稳运行. 截至目前笔者写这篇文章的时候, ...

  8. Redis 分布式锁(一)

    前言 本文力争以最简单的语言,以博主自己对分布式锁的理解,按照自己的语言来描述分布式锁的概念.作用.原理.实现.如有错误,还请各位大佬海涵,恳请指正.分布式锁分两篇来讲解,本篇讲解客户端,下一篇讲解r ...

  9. Maven如何利用父工程对版本进行统一管理

    项目开发中我们该怎么对项目依赖的版本进行统一管理呢 答:创建一个父级工程,让所有的业务模块都继承该父级工程,即所有的业务都为Module 在父级工程pom文件添加<dependencyManag ...

  10. MSSQL系列 (一):数据库的相关操作(增删改查)

    1.创建数据库 --创建数据库 create database stuDb on primary ( --表示属于primary文件组 name='stuDb', --逻辑名称 fileName='D ...