firewalld 基础知识整理

本贴最后更新于 1938 天前,其中的信息可能已经时过境迁

什么是动态防火墙?

我们首先需要弄明白的第一个问题是到底什么是动态防火墙。为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式:用户将新的防火墙规则添加进 /etc/sysconfig/iptables 配置文件当中,再执行命令 service iptables reload 使变更的规则生效。在这整个过程的背后,iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。

如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

这里有必要说明一下 firewalld 和 iptables 之间的关系, firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。firewalld 使用 python 语言开发,在新版本中已经计划使用 c++ 重写 daemon 部分。

什么是区域(zone)?
firewalld 将网卡对应到不同的区域(zone),zone 默认共有 9 个,block dmz public external home internal public trusted work.
不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在 CentOS7 系统中,默认区域被设置为 public.
在最新版本的 fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。

在/etc/firewalld/的区域设定是一系列可以被快速执行到网络接口的预设定。列表并简要说明如下:
drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
指定其中一个区域为默认区域是可行的。当接口连接加入了 NetworkManager,它们就被分配为默认区域。安装时,firewalld 里的默认区域被设定为公共区域。

使用下面的命令分别列出所有支持的 zone 和查看当前的默认 zone:

firewall-cmd --get-zones block dmz public external home internal public trusted work firewall-cmd --get-default-zone public

基本指令参数:

Target:目标
icmp-block-inversion:ICMP 协议类型黑白名单开关(yes/no)
Interfaces:关联的网卡接口
sources:来源,可以是 IP 地址,也可以是 mac 地址
services:允许的服务
ports:允许的目标端口,即本地开放的端口
protocols:允许通过的协议
masquerade:是否允许伪装(yes/no),可改写来源 IP 地址及 mac 地址
forward-ports:允许转发的端口
source-ports:允许的来源端口
icmp-blocks:可添加 ICMP 类型,当 icmp-block-inversion 为 no 时,这些 ICMP 类型被拒绝;当 icmp-block-inversion 为 yes 时,这些 ICMP 类型被允许。
rich rules:富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。

什么是服务?
在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等.
与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用.
当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中.
service 配置的好处显而易见:
第一,通过服务名字来管理规则更加人性化,
第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。

每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 种加载的 service:

firewall-cmd --get-services RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec 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 samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https firewall-cmd --list-services dhcpv6-client ssh
动态添加一条防火墙规则如下: 假设自定义的 ssh 端口号为 12222,使用下面的命令来添加新端口的防火墙规则: firewall-cmd --add-port=12222/tcp --permanent firewall-cmd --remove-port=80/tcp --permanent 如果需要使规则保存到 zone 配置文件,则需要加参数 –permanent

以下举几个在工作中常用的例子:

  • 获取默认区域的网络设置
firewall-cmd --get-default-zone public
  • 设置默认区域
firewall-cmd --set-default-zone=work success

注意:流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。

  • 获取活动的区域

firewall-cmd --get-active-zones

  • 根据接口获取区域

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

  • 将接口增加到区域

firewall-cmd [--zone=<zone>] --add-interface=<interface>

如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。

  • 修改接口所属区域

firewall-cmd [--zone=<zone>] --change-interface=<interface>

这个选项与 –add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。

  • 从区域中删除一个接口

firewall-cmd [--zone=<zone>] --remove-interface=<interface>

  • 查询区域中是否包含某接口

firewall-cmd [--zone=<zone>] --query-interface=<interface>

  • 在 public 区域开放 https 服务

firewall-cmd --zone=public --add-service=https

  • 取消开放 https 服务,即禁止 https 服务

firewall-cmd --zone=public --remove-service=https

  • 开放 8080 和 8081 端口

firewall-cmd --zone=public --add-port=8080-8081/tcp

  • 查询 public 区域开放了哪些端口

firewall-cmd --zone=public --list-ports

  • 允许 icmp 协议流量,即允许 ping

firewall-cmd --zone=public --add-protocol=icmp

  • 取消允许 icmp 协议的流量,即禁 ping

firewall-cmd --zone=public --remove-protocol=icmp

  • 查询 public 区域开放了哪些协议

firewall-cmd --zone=public --list-protocols

  • 将原本访问本机 888 端口的流量转发到本机 22 端口

firewall-cmd --zone=public --add-forward-port=port=888:proto=tcp:toport=22

  • 在区域中启用端口转发或映射

firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

将原本访问本机 888 端口的流量转发到 ip 为 192.168.2.208 的主机的 22 端口,需要开启 masquerade

  • 永久禁止区域的端口转发或者端口映射

firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

  • 查询区域的端口转发或者端口映射状态
firewall-cmd --zone=public --add-masquerade firewall-cmd --zone=public --add-forward port=port=888:proto=tcp:toport=22:toaddr=192.168.2.208

接下来我们来看富规则的设置,即 rich rules

  • 允许 192.168.2.208 主机的所有流量

firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"

  • 允许 192.168.2.208 主机的 icmp 协议,即允许 192.168.2.208 主机 ping

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept"

  • 取消允许 192.168.2.208 主机的所有流量

firewall-cmd --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"

  • 允许 192.168.2.208 主机访问 ssh 服务

firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept"

  • 禁止 192.168.2.208 访问 https 服务,并返回错误信息

firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="https" reject"
注:如果是 public 的话是直接丢弃,会返回 timeout(连接超时)

  • 允许 192.168.2.0/24 网段的主机访问 22 端口

firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept"

  • 允许新的 ipv4 和 ipv6 连接 ftp,并使用日志和审核,每分钟允许访问一次

firewall-cmd --add-rich-rule="rule service name=ftp log limit value="1/m" audit accept"

  • 拒绝来自 192.168.2.0/24 网段的连接,10 秒后自动取消

firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10

  • 将来自 192.168.2.0/24 网段访问本机 80 端口的流量转发到本机的 22 端口

firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22"

  • 将来自 192.168.2.0/24 网段访问本地 80 端口的流量转发到 192.168.2.208 主机的 22 端口

firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208"

  • 伪装,将来自局域网 192.168.2.0/24 网段访问外网的流量映射为网络出口公网 IP,即修改源 IP 地址
firewall-cmd --zone=public --add-masquerade firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    368 引用 • 1846 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 159 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 264 关注
  • gRpc
    11 引用 • 9 回帖 • 90 关注
  • OpenCV
    15 引用 • 36 回帖 • 5 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 813 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 107 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 6 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 591 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    32 引用 • 99 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 1 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 788 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 676 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 638 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    589 引用 • 3538 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 365 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 92 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 177 关注
  • abitmean

    有点意思就行了

    37 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 708 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 655 关注
  • AWS
    11 引用 • 28 回帖 • 9 关注