Linux Firewalld 简明介绍
防火墙作为保护服务器不受外部网络流量影响的一种方式。可以让用户定义一系列规则来控制外部网络中流入的流量,从而达到允许或阻塞的效果。firewalld 是防火墙服务的一个守护程序,实现了动态修改拥有 D-Bus 接口基于主机的防火墙,也就是说在不需要重启防火墙程序的基础上,就可以实现对防火墙规则,增、删、改的操作。
firewalld 提供了域(Zone)和服务(Services)的概念,来简化流量的管理操作。在本篇文章中,会依次介绍这些概念,并记录一些常见防火墙的操作方法。
在阅读后,应该掌握如下的概念:
- 理解 Zone 概念,熟悉 Zone 中不同的 target 行为
- 理解 services 概念,明白和直接操作端口之间的区别
- 常见操作防火墙的方法
防火墙中的 Zone
其实 Zone 就是为了方便预先定义好的一组规则,让用户根据当前服务器所在网络中的位置(内网,公网)的受信任程度来选取不同 Zone 默认规则。但需要注意的是,一个网络连接只能被一个 zone 处理,但一个 zone 可以用于多个网络连接。
预先定义的 zone 规则被放在 /usr/lib/firewalld/zones/ 目录下。当修改 zone 的规则时,这些 zone 会被拷贝到 /etc/firewalld/zones/ 目录下,实际生效的防火墙会在该目录下的文件。
对于每一个 zone 都有一个默认的行为(target),来处理流入的流量。每个 target 会有四个选项:default, ACCEPT, REJECT 和 DROP.
ACCEPT 除了被明确写好的规则,会接受所有流入的数据包。
REJECT 除了被明确写好允许的规则,会拒绝所有流入的数据包, 会给发起连接的机器回复被拒绝的消息。
DROP 除了被明确写好允许的规则,会拒绝所有流入的数据包, 不会给发起连接的机器回复任何消息。
下面是对常见 Zone 的一些描述:
| Zone 名称 | Zone 描述 |
|---|---|
| block | 所有进入的网络连接都会被拒绝。对于 IPV4,回复 icmp-host-prohibited 消息。对于 IPV6,回复 icmp6-adm-prohibited 消息。只有由内部发起的网络连接可以通行。 |
| dmz | 对于在非军事区域的服务器,外部网络可以在受限制的情况下进入内网,只有特定的网络连接请求被接受。 |
| drop | 所有的进入的网络包都会被丢掉,并且没有任何的回应。只有向发起的连接请求可以被放行。 |
| external | 用于开始伪装的外部网络,特别是作为路由器。任务外部的网络会损坏你的计算机,只有特定的网络连接请求被接受。 |
| home | 在家使用,信任网络上的大多数计算机。只有特定的网络连接请求被接受。 |
| internal | 在内部网络使用,信任当前网络下其他的计算机。只有特定的网络连接请求被接受。 |
| public | 在公共网络使用,不信任网络上的其他计算机。只有特定的网络连接请求被接受。 |
| trusted | 所有的网络连接都会被接受。 |
| work | 在工作网络中使用,信任网络上的其他计算机。只有特定的网络连接请求被接受。 |
简单看一下配置的具体内容,把上面 target 和 zone 的概念联在一起:

target 表示当发来的数据包,没有匹配到任何的规则(比如端口号,服务等),采取的默认行为。
short 表示对 zone 的一个简短描述名字。
description 表示对 zone 的一段详细描述。
有关 zone 的操作
# 获取默认域
(base) [root@localhost zones]# firewall-cmd --get-default-zone
public
# 查询存在的所有域
(base) [root@localhost zones]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 设置默认域
(base) [root@localhost zones]# firewall-cmd --set-default-zone=public
# 查询某个域下的配置
(base) [root@localhost zones]# firewall-cmd --zone=public --list-all
# 查询指定网卡的域
(base) [root@localhost zones]# firewall-cmd --get-zone-of-interface=ens192
public
# 为某个网卡指定域
(base) [root@localhost zones]# firewall-cmd --zone=public --add-interface=ens33
# 修改网卡的域
(base) [root@localhost zones]# firewall-cmd --zone=block --change-interface=ens37
# 删除指定网卡的域
(base) [root@localhost zones]# firewall-cmd --zone=block --remove-interface=ens37
# 查询系统中正在使用的域
firewall-cmd --get-active-zones
关于预定义 Services 的概念
Services 在网络通信时,需要使用一个或者多个端口,地址。防火墙会基于端口来对通信的内容进行过滤。如果一个服务想要允许网络的流量进入,必须打开端口。firewalld 会默认的阻断所有未被显式打开的端口。换成自己的理解来说,在服务器提供的一些服务,常常需要打开很多端口,并且会限制一些源和目的 IP 甚至一些协议的访问,如果把这些同时都定义在 zone 中,会造成最后的 zone 配置文件很大,提取成 services 相当于是解耦的概念,有利于后期的维护。
和 zone 类似,在 /usr/lib/firewalld/services/ 目录中存放着一些默认的 services 配置,在 services 被修改或者添加时,这里的文件会被作为参考。目前正被使用的 services 配置会在 /etc/firewalld/services/ 目录。
# 查看正在使用的服务:
(base) [root@localhost firewalld]# firewall-cmd --list-services
ssh dhcpv6-client http https
# 查看服务的被使用情况,可以看到 zone 文件中引入了 services:
(base) [root@localhost firewalld]# cat zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<service name="http"/>
<service name="https"/>
<port protocol="tcp" port="8080"/>
<port protocol="tcp" port="3306"/>
</zone>
# 使用 service:
firewall-cmd --add-service=http --permanent
# 查看预先定义的 services:
firewall-cmd --get-services
# 增加一个空 services:
firewall-cmd --permanent --new-service=service-name.xml
# 增加和某个 services 相同的配置:
firewall-cmd --permanent --new-service-from-file=/etc/firewalld/services/service-name.xml --name service-name1.xml
# 修改 services 配置:
firewall-cmd --permanent --service=myservice --set-description=description
firewall-cmd --permanent --service=myservice --set-short=description
firewall-cmd --permanent --service=myservice --add-port=portid[-portid]/protocol
firewall-cmd --permanent --service=myservice --add-protocol=protocol
firewall-cmd --permanent --service=myservice --add-source-port=portid[-portid]/protocol
firewall-cmd --permanent --service=myservice --add-module=module
firewall-cmd --permanent --service=myservice --set-destination=ipv:address[/mask]
打开端口的方式,除了使用上面的 services ,也可以使用 port 直接添加:
# 端口操作,直接在 zone 的级别进行更改
# 查看并没有 http 端口
sudo firewall-cmd --list-ports
# 增加 80 端口
sudo firewall-cmd --add-port=80/tcp
# 永久增加 80 端口
firewall-cmd --add-port=80/tcp --permanent
# 删除端口
firewall-cmd --zone=public --remove-port=8080/tcp
# 将修改后的某些配置持久化保存:
firewall-cmd --runtime-to-permanent
# 其他查询端口的一些方式
netstat -ap | grep 8080
lsof -i:6800
# centos 7
ss -ant
# centos 7 before
netstat -ant
常见防火墙的操作
防火墙的运行相关操作:
# 查询防火墙状态
systemctl status firewalld
# 打开防火墙
systemctl start firewalld
# 在修改配置后,重载防火墙
firewall-cmd --reload
# 添加直接规则,例如 Keepalived。这里需要注意的是,当使用 zone 和 services 都无法满足要求时,再采用直接添加的方案。
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 查询配置的规则
firewall-cmd --direct --get-all-chains
firewall-cmd --direct --get-all-rules
遇到紧急情况的操作:
# 在遇到服务器正在被攻击时,切断所有网络连接
firewall-cmd --panic-on
# 恢复至正常的防火墙设置
firewall-cmd --panic-off
# 查询 panic mode 是否开启
firewall-cmd --query-panic
参考
Linux Firewalld 简明介绍的更多相关文章
- Linux Firewalld 基础介绍
互联网上提供了各种网络服务,而防火墙可以设置各种规则来限制访问,保护服务器. 概述 Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙. Linux系 ...
- 静态库(.a)与动态库(.so)的简明介绍
静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只 ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- Linux的简单介绍和常用命令的介绍
Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...
- Linux性能工具介绍
l Linux性能工具介绍 p CPU高 p 磁盘I/O p 网络 p 内存 p 应用程序跟踪 l 操作系统与应用程序的关系比喻为“唇亡齿寒”一点不为过 l 应用程序的性能问题/功能问 ...
- Spark如何使用Akka实现进程、节点通信的简明介绍
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- Linux core 文件介绍
Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个 ...
- Linux 启动参数介绍
Linux 启动参数介绍 取自2.6.18 kernel Documentation/i386/boot.txt 文件中介绍 vga= 这里的不是一个整数(在C语言表示法中,应是十进制,八进制或者十六 ...
- Linux系统启动过程介绍
Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...
随机推荐
- JavaWeb_(SSH论坛)_五、帖子模块
基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 回复帖子 分析回 ...
- Java容器——Set和顺序存储
当Set使用自己创建的类型时,存储的顺序如何维护,在不同的Set实现中会有不同,而且它们对于在特定的Set中放置的元素类型也有不同的要求: Set(interface) 存入Set的每个元素都必须是唯 ...
- Python列表解析和字典解析
python笔记_列表解析 相比于for循环,列表解析的语法是由底层c语言实现的,它和使用for循环遍历pyobject对象相比,性能会有很大的提升. 无条件子句的列表解析式 In [2]: [2*i ...
- 剑指offer31----栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对 ...
- MongoDB与mysql的对比
1.与Mql对照 MySQL MongoDB 说明 mysqld mongod 服务器守护进程 mysql mongo 客户端工具 mysqldump mongodump 逻辑备份工具 mysql m ...
- C# 判断两条直线是否相交
直接上代码,过程不复杂 /// <summary> /// 判断两条线是否相交 /// </summary> /// <param name="a"& ...
- sigmoid function的直观解释
Sigmoid function也叫Logistic function, 在logistic regression中扮演将回归估计值h(x)从 [-inf, inf]映射到[0,1]的角色. 公式为: ...
- Ruby小白入门笔记之<个人记录档>
书写缘由 快两年的JAVA开发,因为来到一家新公司,产品需要用Ruby开发,故此才有了这从头开始,一入编程深似海啊...... 因为入门时是JAVA,所以理念跟规范早已形成,故此感觉突然采用Ruby编 ...
- [ubuntu]如何实现双屏显示
一.首先直接运行xrandr命令,查看设备的相关信息: 运行之后会显示当前连接设备的屏幕信息,如下图 PS:我已经用HDMI线连接了外接显示器和主机 wangju@wangju-HP--G4:~$ x ...
- Closure - Mimicking block scope
The basic syntax of an anoymous function used as a block scope (often called a private scope) is as ...