firewalld dbus介面使用指南
firewalld,一個基於動態區的iptables/nftables守護程式,自2009年左右開始開發,CentOS7基於 firewalld-0.6.3
, 釋出於2018年10月11日。主要的開發人員是托馬斯·沃納,他目前為紅帽公司工作。這是因為為Federal 18 的預設防火牆機制, 隨後在 Rhel7 和 Centos 7 中使用。
firewalld比舊的 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的應用了。