firewalld dbus接口使用指南


firewalld dbus接口使用指南

firewalld,一個基於動態區的iptables/nftables守護程序,自2009年左右開始開發,CentOS7基於 firewalld-0.6.3 , 發布於2018年10月11日。主要的開發人員是托馬斯·沃納,他目前為紅帽公司工作。這是因為為Federal 18 的默認防火牆機制, 隨后在 Rhel7 和 Centos 7 中使用。

firewalld相對於舊的 iptables-service 機制有許多優勢。值得注意的是,它解決了 iptables 要求每次更改時重新啟動防火牆的問題,從而中斷了任何狀態連接。它還提供了豐富的 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的應用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM