firewalld,一个基于动态区的iptables/nftables守护程序,自2009年左右开始开发,最新版本 - 防火墙0.6.3 - 发布于2018年10月11日。主要的开发人员是托马斯·沃纳,他目前为红帽公司工作。这是因为费多拉 18 的默认防火墙机制, 随后在 Rhel7 和 Centos 7 中。

防火墙比旧的 iptable 机制有许多优势。值得注意的是,它解决了 iptable 要求每次更改时重新启动防火墙的问题,从而中断了任何状态连接。它还提供了丰富的深思熟虑的 D-Bus 方法、信号和属性。

这里并不是从firewalld操作使用方式来介绍firewalld的改名,想反,是介绍firewalld D-Bus API来检索信息或更改设置。

firewalld被配置为系统 D-Bus 服务,注意看 systemd file中的"``Type=dbus`"参数。

# cat /usr/lib/systemd/system/firewalld.service
[Unit]
Description=firewalld - dynamic firewall daemon
Before=network-pre.target
Wants=network-pre.target
After=dbus.service
After=polkit.service
Conflicts=iptables.service ip6tables.service ebtables.service ipset.service
Documentation=man:firewalld(1) [Service]
EnvironmentFile=-/etc/sysconfig/firewalld
ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
# supress to log debug and error output also to /var/log/messages
StandardOutput=null
StandardError=null
Type=dbus
BusName=org.fedoraproject.FirewallD1
KillMode=mixed [Install]
WantedBy=multi-user.target
Alias=dbus-org.fedoraproject.FirewallD1.service

实际上,手动运行 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid --debug 效果是一样的,这里的注册是通过dbus 高级API操作的。

此时由于已经了解到了,firewalld 服务 是基于D-Bus接口的,所以需要找到对应的 dbus interface

dbus-send --system --dest=org.freedesktop.DBus \
--type=method_call --print-reply \
/org/freedesktop/DBus org.freedesktop.DBus.ListNames | grep FirewallD

org.fedoraproject.FirewallD1 这个就是firewalld注册的dbus interface了。

dbus-send 命令可以向 D-Bus消息总线发送消息并显示该消息的返回结果。有两个众所周知的消息总线:system bus(Option -System) 和每个用户session bus( -session)。使用 firewall-cmd 也是通过 dbus interface 进行交互的。在使用dbus-send 时,必须指定其对应的消息接口 -dest,该参数是连接到对应总线上的接口名称,以将消息发送到对应的dbus firewalld-server进行对应iptables规则的翻译。

现在有了dbus接口,需要了解改接口支持的方法 methods,属性 properties ,信号signals 等信息。

dbus-send --system --dest=org.fedoraproject.FirewallD1 --print-reply \
/org/fedoraproject/FirewallD1 \
org.freedesktop.DBus.Introspectable.Introspect

通过上述输出列出了通过防火墙 D-Bus 接口提供的所有方法、单一和属性。这是基于D-Bus DTD 的输出格式。所有 dbus服务都需要实现 org.freedesktop.DBus.Introspectable.Introspect 方法。

知道了 方法 属性 信号,就可以直接对firewalld进行一个操作了。现在开始第一个例子。获取默认zone。

# firewall-cmd --get-default-zone

dbus-send --system --dest=org.fedoraproject.FirewallD1 \
--print-reply --type=method_call \
/org/fedoraproject/FirewallD1 \
org.fedoraproject.FirewallD1.getDefaultZone

通过dbus接口来检索区域列表

# firewall-cmd --get-zones

dbus-send --system \
--dest=org.fedoraproject.FirewallD1 \
--print-reply --type=method_call \
/org/fedoraproject/FirewallD1 \
org.fedoraproject.FirewallD1.zone.getZones

最常用的命令:查看当前zone所有策略

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

dbus-send --system \
--dest=org.fedoraproject.FirewallD1 \
--print-reply --type=method_call \
/org/fedoraproject/FirewallD1 \
org.fedoraproject.FirewallD1.getZoneSettings string:"public"

获得inerface的properties

其实这里在命令行根本用不到,但是在封装时却会可以用到。

dbus-send --system \
--print-reply --dest=org.fedoraproject.FirewallD1 \
/org/fedoraproject/FirewallD1 \
org.freedesktop.DBus.Properties.GetAll string:"org.fedoraproject.FirewallD1"

还可以通过其他的接口来查看对应的属性值

dbus-send --system --print-reply
--dest=org.fedoraproject.FirewallD1 \
/org/fedoraproject/FirewallD1 \
org.freedesktop.DBus.Properties.Get \
string:"org.fedoraproject.FirewallD1" \
string:"version" # dbus-send --system --print-reply \
--dest=org.fedoraproject.FirewallD1 \
/org/fedoraproject/FirewallD1 org.freedesktop.DBus.Properties.Get \
string:"org.fedoraproject.FirewallD1" \
string:"interface_version" # dbus-send --system --print-reply \
--dest=org.fedoraproject.FirewallD1 \
/org/fedoraproject/FirewallD1 \
org.freedesktop.DBus.Properties.Get \
string:"org.fedoraproject.FirewallD1" \
string:"state" # dbus-send --system --print-reply=literal \
--dest=org.fedoraproject.FirewallD1 \
/org/fedoraproject/FirewallD1 \
org.freedesktop.DBus.Properties.Get \
string:"org.fedoraproject.FirewallD1" \
string:"state"

查询规则

查询接口

dbus-send --system \
--dest=org.fedoraproject.FirewallD1 \
--print-reply \
--type=method_call \
/org/fedoraproject/FirewallD1 \
org.fedoraproject.FirewallD1.zone.getZoneOfInterface \
string:"eth0"

创建一个新zone

dbus-send --session \
--dest=org.freedesktop.DBus \
--type=method_call \
--print-reply /org/freedesktop/DBus \
org.fedoraproject.FirewallD1.config.addZone \
string:"testapi"

获得一个zone的所有规则(zonesettings

dbus-send --system \
--dest=org.fedoraproject.FirewallD1 \
--type=method_call \
--print-reply /org/fedoraproject/FirewallD1 \
org.fedoraproject.FirewallD1.getZoneSettings \
string:"public"

添加一个port

dbus-send --system \
--dest=org.fedoraproject.FirewallD1 \
--print-reply --type=method_call \
/org/fedoraproject/FirewallD1 \
org.fedoraproject.FirewallD1.zone.addPort \
string:"public" \
string:"81" \
string:"tcp" \
uint64:300

对应设置firewalld 面板所有属性的命令

firewall-cmd --zone=public --change-interface=eth0

firewall-cmd --zone=public --add-masquerade
firewall-cmd --zone=public --add-forward-port=port=1122:proto=tcp:toport=22:toaddr=192.168.100.3
firewall-cmd --zone=public --add-forward-port=port=1122:proto=tcp:toport=22:toaddr=10.0.0.3 firewall-cmd --add-protocol=tcp
firewall-cmd --add-protocol=udp firewall-cmd --add-icmp-blocks=icmp
firewall-cmd --set-target=DROP firewall-cmd --add-icmp-block=redirect
firewall-cmd --add-icmp-block=network-unknown firewall-cmd --add-source-port=80/tcp
firewall-cmd --add-source-port=100/tcp firewall-cmd --add-source=10.0.0.1
firewall-cmd --add-source=10.0.0.2 firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.101/32 service name=telnet limit value=1/m accept' firewall-cmd --add-icmp-block-inversion firewall-cmd --new-zone=123 --permanen

执行远程命令

dbus接口支持远程命令的,通过dbus-send发送时,根据配置dbus的监听来完成远程的操作

DBUS_SESSION_BUS_ADDRESS=tcp:host=10.0.0.3,port=55557

根据上述,参考加上官方文档,了解如何通过D-Bus接口操作FirewallD,虽然此处是使用了 dbus-send,但是也可以通过 qt 或者 其他的来管理 基于 dbus api的应用了。

firewalld dbus接口使用指南的更多相关文章

  1. 微信公众平台自定义菜单接口API指南

    微信公众平台开发模式自定义菜单接口API指南 简介 开发者获取使用凭证(如何获取凭证)后,可以使用该凭证对公众账号的自定义菜单进行创建.查询和删除等操作. 自定义菜单接口可实现以下类型按钮: clic ...

  2. dbus客户端使用指南

    DBus是Linux使用的进程间通信机制,允许各个进程互相访问,而不需要为每个其他组件实现自定义代码.即使对于系统管理员来说,这也是一个相当深奥的主题,但它确实有助于解释linux的另一部分是如何工作 ...

  3. 微信公众平台消息接口API指南

    简介 微信公众平台消息接口为开发者提供了一种新的消息处理方式.微信公众平台消息接口为开发者提供与用户进行消息交互的能力.对于成功接入消息接口的微信公众账号,当用户发消息给公众号,微信公众平台服务器会使 ...

  4. DBus接口文档

    gitgit.projects.genivi.org / ipc / common-api-dbus-tools.git / blob? search: re 0544e985b6e4a6c83ddf ...

  5. 微信公众平台通用接口API指南

    微信公众平台 通用接口 消息接口 开发模式 作者:方倍工作室原文:http://www.doucube.com/index.php?m=Article&a=show&id=5 微信公众 ...

  6. 腾讯AI开放平台的接口调用指南

    最近无意发现腾讯AI开放平台上提供了大量好玩的人工智能云服务,而且是完全免费的.只需要用QQ号登录即可.这么好的东西,作为一个程序员,当然要试试了! 从上图可以看出腾讯AI开放平台提供的人工智能服务主 ...

  7. DBUS接口和三极管反向电路

    三极管反向电路,DR16的接收机接收的信号是反向的 电路描述:VEE为低电平时NPN三极管Q1截止,A点为高电平:VEE为高电平时NPN三极管Q1导通,A点为低电平:从而实现了电平反向.阻R1作用是在 ...

  8. Linux防火墙配置(iptables, firewalld)

    netfilter和底层实现 iptables firealld Linux中的防火墙 RHEL中有几种防火墙共存: iptables firewalld ip6tables ebtables 这些软 ...

  9. [CoreOS 转载] CoreOS实践指南(四):集群的指挥所Fleet

    转载:http://www.csdn.net/article/2015-01-14/2823554/2 摘要:CoreOS是采用了高度精简的系统内核及外围定制的操作系统.ThoughtWorks的软件 ...

随机推荐

  1. jQuery中的样式(七):addClass()、removeClass()、toggleClass()、hasClass()、css()、width()、height()等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  2. Java从文件路径中获取文件名的几种方法

    举例:String fName =" G:\Java_Source\navigation_tigra_menu\demo1\img\lev1_arrow.gif " 方法一: 1 ...

  3. Fllink学习

    1.Apache Flink 是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处 ...

  4. Workflow Core + asp.net core 5.0 实现简单审批工作流

    我们知道企业业务系统到处都可以审批工作流的,但也很少有像OA系统一样复杂多级多条件的审批工作流需要设计,所以我们需要一个轻量级的容易上手的workflow框架,通过GitHub,我发现danielge ...

  5. Node.js开发博客系统

    数据库设计 用户表: id phone password nickname head_img personal_sign level_id create_time update_time is_del ...

  6. 微信小程序从入门到实践(一)-设置底部导航栏

    微信小程序最多能加5个导航图标.因为我们只有两个默认页面,这里我们就添加两个导航图标 先看我们要达到的就是这么一个效果 接下来开始实践: (1)准备工作 找几个图标,将上述起好名字的图标 保存到 小程 ...

  7. Qt之类反射机制

    在java语言中,可以使用getObject(String)函数,从类型直接构建新的对象. 而在C++中是没有这种机制的,Qt虽然提供了元对象机制,但只可以获取对象的类名,不能反向构建. 所以搜索一下 ...

  8. 假期作业02:安装JDK与文本编辑器并编写第一个Java程序

    假期作业02:安装JDK与文本编辑器并编写第一个Java程序 一.安装JDK与文本编辑器并编写第一个java程序 首先在oracle官网(需要创建账号,进行登录后方可使用)按照自己的需求下载JDK(h ...

  9. 学习笔记之IdentityServer4(一)

    快速入门IdentityServer4 概述 将 IdentityServer 添加到 ASP.NET Core 应用程序 配置 IdentityServer 为各种客户发行代币 保护 Web 应用程 ...

  10. spring boot 系列之八:SpringBoot处理定时任务

    项目经常会用到定时任务,springboot自然是可以通过整合相关组件来实现的. 目前常用的定时任务的实现有两种: 通过spring 自带的定时器任务@Schedule来实现 通过Quartz来实现 ...