前言
Firewalld 是一个本地的网络策略管理软件,与 iptables 启相同的作用
Firewalld provides a dynamically managed firewall with support for network/firewall zones that define the trust level of network connections or interfaces. It has support for IPv4, IPv6 firewall settings, ethernet bridges and IP sets. There is a separation of runtime and permanent configuration options. It also provides an interface for services or applications to add firewall rules directly
从 RHEL7/Centos7 开始,系统默认的防火墙软件从 iptables 替换成了 firewalld
这的确是一个不小的变化,从而让很多以前熟悉 iptables 的运维小伙伴一下子变得无所适从
相对于 iptables, firewalld 的确有一些更先进的管理理念,不过也在挑战传统的运维体验
这里就 firewalld 的基础概念进行一个讲解和介绍
参考 A service daemon with D-Bus interface 和 USING FIREWALLS
Documentation
Tip: 当前最新的版本为 firewalld 0.6.0 release
基础
软件架构
firewall-cmd/firewall-config/firewall-applet/firewall-offline-cmd 用于对 firewalld 的网络规则进行配置
firewall-cmd/firewall-config/firewall-applet 通过 D-bus 来对 firewalld 进行配置(可以同时实现 runtime 和 permanent 的配置)
firewall-offline-cmd 直接修改 firewalld 配置文件,然后应用配置文件,来实现间接的控制
两层结构
firewalld 分成两层结构
- D-Bus
- Core
D-Bus
D-Bus 提供一个抽象的接口层,用于与外层的客户端软件进行通讯,并且修改 firewalld 行为
D-Bus 是一个提供简便进程间通信的消息总线系统,包含一个能以全系统或者针对一个用户会话运行的守护进程,和一系列提供与 D-Bus 通信的库
D-Bus是一個进程间通讯及远程过程调用机制,可以让多个不同的计算机程序(即进程)在同一台电脑上同时进行通讯, D-Bus作为freedesktop.org专案的一部份,其最初的设计目的是使Linux桌面环境(如GNOME与KDE等)提供的服務标准化
Tip: Centos7 中的 systemd 也是依赖 D-Bus 实现的
Core
Core 又可以分为两层
- 模型的实例层
- 后端支持层
模型的实例层用于管理配置文件,和根据配置文件来初始化模型实例,用于将 DSL 与 网络规则进行互化
后端支持层的职能是调用基础工具来实现模型所表达的网络规则,也可以理解为调用基础工具或者基础网络类库来与内核中的模块通讯,以支持和实现 DSL 所表达的网络策略
这是应用层到内核层的边界
Note: firewalld 并不是强依赖 NetworkManager,但是还是建议使用 NetworkManager,因为任何网络变更都会被 NetworkManger 及时通知到 firewalld,这样 firewalld 就可实时了解到真实的网络环境,如果不使用 NetworkManager 也不影响 firewalld 的已有配置与规则,但是如果网络发生了临时性的变更,那么 firewalld 并不会自动有感知的,于是之前的配置很可能就会不符合当前的新的网络环境,于是产生一些意想不到的网络表现(由于规则与实情不匹配导致的)
模型的实例层
模型的实例层用于管理配置文件,和根据配置文件来初始化模型实例,用于将 DSL 与 网络规则进行互化
config
firewalld 支持两个配置路径
默认配置路径
/usr/lib/firewalld
里包含了 icmptypes, services 和 zones 的默认配置
[root@ds1 ~]# tree /usr/lib/firewalld/
/usr/lib/firewalld/
├── helpers
│ ├── amanda.xml
│ ├── ftp.xml
│ ├── h323.xml
│ ├── irc.xml
│ ├── netbios-ns.xml
│ ├── pptp.xml
│ ├── Q.931.xml
│ ├── RAS.xml
│ ├── sane.xml
│ ├── sip.xml
│ ├── snmp.xml
│ └── tftp.xml
├── icmptypes
│ ├── address-unreachable.xml
│ ├── bad-header.xml
│ ├── beyond-scope.xml
│ ├── communication-prohibited.xml
│ ├── destination-unreachable.xml
│ ├── echo-reply.xml
│ ├── echo-request.xml
│ ├── failed-policy.xml
│ ├── fragmentation-needed.xml
│ ├── host-precedence-violation.xml
│ ├── host-prohibited.xml
│ ├── host-redirect.xml
│ ├── host-unknown.xml
│ ├── host-unreachable.xml
│ ├── ip-header-bad.xml
│ ├── neighbour-advertisement.xml
│ ├── neighbour-solicitation.xml
│ ├── network-prohibited.xml
│ ├── network-redirect.xml
│ ├── network-unknown.xml
│ ├── network-unreachable.xml
│ ├── no-route.xml
│ ├── packet-too-big.xml
│ ├── parameter-problem.xml
│ ├── port-unreachable.xml
│ ├── precedence-cutoff.xml
│ ├── protocol-unreachable.xml
│ ├── redirect.xml
│ ├── reject-route.xml
│ ├── required-option-missing.xml
│ ├── router-advertisement.xml
│ ├── router-solicitation.xml
│ ├── source-quench.xml
│ ├── source-route-failed.xml
│ ├── time-exceeded.xml
│ ├── timestamp-reply.xml
│ ├── timestamp-request.xml
│ ├── tos-host-redirect.xml
│ ├── tos-host-unreachable.xml
│ ├── tos-network-redirect.xml
│ ├── tos-network-unreachable.xml
│ ├── ttl-zero-during-reassembly.xml
│ ├── ttl-zero-during-transit.xml
│ ├── unknown-header-type.xml
│ └── unknown-option.xml
├── ipsets
│ └── README
├── services
│ ├── amanda-client.xml
│ ├── amanda-k5-client.xml
│ ├── bacula-client.xml
│ ├── bacula.xml
│ ├── bitcoin-rpc.xml
│ ├── bitcoin-testnet-rpc.xml
│ ├── bitcoin-testnet.xml
│ ├── bitcoin.xml
│ ├── ceph-mon.xml
│ ├── ceph.xml
│ ├── cfengine.xml
│ ├── condor-collector.xml
│ ├── ctdb.xml
│ ├── dhcpv6-client.xml
│ ├── dhcpv6.xml
│ ├── dhcp.xml
│ ├── dns.xml
│ ├── docker-registry.xml
│ ├── dropbox-lansync.xml
│ ├── elasticsearch.xml
│ ├── freeipa-ldaps.xml
│ ├── freeipa-ldap.xml
│ ├── freeipa-replication.xml
│ ├── freeipa-trust.xml
│ ├── ftp.xml
│ ├── ganglia-client.xml
│ ├── ganglia-master.xml
│ ├── high-availability.xml
│ ├── https.xml
│ ├── http.xml
│ ├── imaps.xml
│ ├── imap.xml
│ ├── ipp-client.xml
│ ├── ipp.xml
│ ├── ipsec.xml
│ ├── iscsi-target.xml
│ ├── kadmin.xml
│ ├── kerberos.xml
│ ├── kibana.xml
│ ├── klogin.xml
│ ├── kpasswd.xml
│ ├── kshell.xml
│ ├── ldaps.xml
│ ├── ldap.xml
│ ├── libvirt-tls.xml
│ ├── libvirt.xml
│ ├── managesieve.xml
│ ├── mdns.xml
│ ├── mosh.xml
│ ├── mountd.xml
│ ├── mssql.xml
│ ├── ms-wbt.xml
│ ├── mysql.xml
│ ├── nfs3.xml
│ ├── nfs.xml
│ ├── nrpe.xml
│ ├── ntp.xml
│ ├── openvpn.xml
│ ├── ovirt-imageio.xml
│ ├── ovirt-storageconsole.xml
│ ├── ovirt-vmconsole.xml
│ ├── pmcd.xml
│ ├── pmproxy.xml
│ ├── pmwebapis.xml
│ ├── pmwebapi.xml
│ ├── pop3s.xml
│ ├── pop3.xml
│ ├── postgresql.xml
│ ├── privoxy.xml
│ ├── proxy-dhcp.xml
│ ├── ptp.xml
│ ├── pulseaudio.xml
│ ├── puppetmaster.xml
│ ├── quassel.xml
│ ├── radius.xml
│ ├── RH-Satellite-6.xml
│ ├── rpc-bind.xml
│ ├── rsh.xml
│ ├── rsyncd.xml
│ ├── samba-client.xml
│ ├── samba.xml
│ ├── sane.xml
│ ├── sips.xml
│ ├── sip.xml
│ ├── smtp-submission.xml
│ ├── smtps.xml
│ ├── smtp.xml
│ ├── snmptrap.xml
│ ├── snmp.xml
│ ├── spideroak-lansync.xml
│ ├── squid.xml
│ ├── ssh.xml
│ ├── synergy.xml
│ ├── syslog-tls.xml
│ ├── syslog.xml
│ ├── telnet.xml
│ ├── tftp-client.xml
│ ├── tftp.xml
│ ├── tinc.xml
│ ├── tor-socks.xml
│ ├── transmission-client.xml
│ ├── vdsm.xml
│ ├── vnc-server.xml
│ ├── wbem-https.xml
│ ├── xmpp-bosh.xml
│ ├── xmpp-client.xml
│ ├── xmpp-local.xml
│ └── xmpp-server.xml
├── xmlschema
│ ├── check.sh
│ ├── icmptype.xsd
│ ├── ipset.xsd
│ ├── service.xsd
│ └── zone.xsd
└── zones
├── block.xml
├── dmz.xml
├── drop.xml
├── external.xml
├── home.xml
├── internal.xml
├── public.xml
├── trusted.xml
└── work.xml
6 directories, 180 files
[root@ds1 ~]#
这个里面的配置不应该修改,因为 firewalld 的升级会对这里的配置进行覆盖,从而导致了修改信息的丢失
额外的 icmptypes, services 和 zones 信息应该以包的形式或者创建新配置的方式来添加
系统指定的配置路径
/etc/firewalld
里包含了系统或者用户创建的 icmptypes, services 和 zones 的配置信息
[root@ds1 ~]# tree /etc/firewalld/
/etc/firewalld/
├── firewalld.conf
├── helpers
├── icmptypes
├── ipsets
├── lockdown-whitelist.xml
├── services
└── zones
├── public.xml
└── public.xml.old
5 directories, 4 files
[root@ds1 ~]#
这里的配置会覆盖掉默认配置
如果要手动修改,就将 icmptypes, zones or services 的预定义信息放置到相应的配置目录里
如果没有 /etc/firewalld
的话,firewalld 会直接使用默认的配置来初始化自己
zone
firewalld 在系统中从安全到不安全根据信任的级别预先定义了几个区域
ZONE | DESC | Note |
---|---|---|
drop | 丢弃 | 任何接收的网络数据包都被丢弃,没有任何回复,仅能有发送出去的网络连接 |
block | 阻塞 | 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝,只有从内部发起的连接被允许 |
external | 外部 | 特别是为路由器启用了伪装功能的外部网,不能信任来自网络的其他计算,不能相信它们不会对计算机造成危害,只能接收经过选择的连接 |
public | 公共 | 在公共区域内使用,不能相信网络内的其他计算机不会对这台计算机造成危害,只能接收经过选取的连接 |
dmz | 非军事区 | 用于非军事区内的电脑,此区域内可公开访问,可以有限地进入内部网络,仅仅接收经过选择的连接 |
work | 工作 | 用于工作区,可以基本相信网络内的其他电脑不会危害电脑,仅仅接收经过选择的连接 |
home | 家庭 | 用于家庭网络,可以基本信任网络内的其他计算机不会危害这台计算机,仅仅接收经过选择的连接 |
internal | 内部 | 用于内部网络,可以基本上信任网络内的其他计算机不会威胁计算机,仅仅接受经过选择的连接 |
trusted | 信任 | 可接受所有的网络连接 |
其中只有一个可以被设定为 default zone
被 NetworkManager 管理的网络接口会被默认放到 default zone
一旦安装,firewalld 的 default zone 默认为 public zone
default zone 可以被修改
可以参考 Predefined Zones
代码语言:javascript复制[root@ds1 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@ds1 ~]#
[root@ds1 ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
drop
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh mdns samba-client dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh mdns samba-client dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1 eth2
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ds1 ~]#
service
firewalld 可以将以下对象打包成 service 来统一管理
- port
- protocol
- source-port
- module
- destination
[root@ds1 ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
[root@ds1 ~]# cat /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
[root@ds1 ~]#
ipset
firewalld 可以通过 ipset 来管理一批 ip 对象
代码语言:javascript复制[root@ds1 ~]# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
[root@ds1 ~]#
[root@ds1 ~]# firewall-cmd --permanent --get-ipsets
[root@ds1 ~]#
helper
helper 主要调用一些内核模块来进行流量追踪
代码语言:javascript复制A firewalld helper defines the configuration that are needed to be able to use a netfilter connection tracking helper if automatic helper assignment is turned off, which is then the secure use of connection tracking helpers
[root@ds1 ~]# firewall-cmd --get-helpers
Q.931 RAS amanda ftp h323 irc netbios-ns pptp sane sip snmp tftp
[root@ds1 ~]# ll /usr/lib/firewalld/helpers/
total 48
-rw-r--r--. 1 root root 125 Apr 11 04:52 amanda.xml
-rw-r--r--. 1 root root 119 Apr 11 04:52 ftp.xml
-rw-r--r--. 1 root root 85 Apr 11 04:52 h323.xml
-rw-r--r--. 1 root root 134 Apr 11 04:52 irc.xml
-rw-r--r--. 1 root root 141 Apr 11 04:52 netbios-ns.xml
-rw-r--r--. 1 root root 136 Apr 11 04:52 pptp.xml
-rw-r--r--. 1 root root 122 Apr 11 04:52 Q.931.xml
-rw-r--r--. 1 root root 122 Apr 11 04:52 RAS.xml
-rw-r--r--. 1 root root 122 Apr 11 04:52 sane.xml
-rw-r--r--. 1 root root 158 Apr 11 04:52 sip.xml
-rw-r--r--. 1 root root 135 Apr 11 04:52 snmp.xml
-rw-r--r--. 1 root root 120 Apr 11 04:52 tftp.xml
[root@ds1 ~]# cat /usr/lib/firewalld/helpers/snmp.xml
<?xml version="1.0" encoding="utf-8"?>
<helper module="nf_conntrack_snmp" family="ipv4">
<port protocol="udp" port="161"/>
</helper>
[root@ds1 ~]# cat /usr/lib/firewalld/helpers/ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<helper module="nf_conntrack_ftp">
<port protocol="tcp" port="21"/>
</helper>
[root@ds1 ~]#
icmptype
用来管理定义 icmp 的响应类型
代码语言:javascript复制[root@ds1 ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
[root@ds1 ~]#
[root@ds1 ~]# ll /usr/lib/firewalld/icmptypes/
total 180
-rw-r--r--. 1 root root 385 Apr 11 04:52 address-unreachable.xml
-rw-r--r--. 1 root root 258 Apr 11 04:52 bad-header.xml
-rw-r--r--. 1 root root 294 Apr 11 04:52 beyond-scope.xml
-rw-r--r--. 1 root root 279 Apr 11 04:52 communication-prohibited.xml
-rw-r--r--. 1 root root 222 Apr 11 04:52 destination-unreachable.xml
-rw-r--r--. 1 root root 173 Apr 11 04:52 echo-reply.xml
-rw-r--r--. 1 root root 210 Apr 11 04:52 echo-request.xml
-rw-r--r--. 1 root root 261 Apr 11 04:52 failed-policy.xml
-rw-r--r--. 1 root root 280 Apr 11 04:52 fragmentation-needed.xml
-rw-r--r--. 1 root root 266 Apr 11 04:52 host-precedence-violation.xml
-rw-r--r--. 1 root root 257 Apr 11 04:52 host-prohibited.xml
-rw-r--r--. 1 root root 242 Apr 11 04:52 host-redirect.xml
-rw-r--r--. 1 root root 239 Apr 11 04:52 host-unknown.xml
-rw-r--r--. 1 root root 247 Apr 11 04:52 host-unreachable.xml
-rw-r--r--. 1 root root 229 Apr 11 04:52 ip-header-bad.xml
-rw-r--r--. 1 root root 355 Apr 11 04:52 neighbour-advertisement.xml
-rw-r--r--. 1 root root 457 Apr 11 04:52 neighbour-solicitation.xml
-rw-r--r--. 1 root root 250 Apr 11 04:52 network-prohibited.xml
-rw-r--r--. 1 root root 248 Apr 11 04:52 network-redirect.xml
-rw-r--r--. 1 root root 239 Apr 11 04:52 network-unknown.xml
-rw-r--r--. 1 root root 247 Apr 11 04:52 network-unreachable.xml
-rw-r--r--. 1 root root 239 Apr 11 04:52 no-route.xml
-rw-r--r--. 1 root root 328 Apr 11 04:52 packet-too-big.xml
-rw-r--r--. 1 root root 225 Apr 11 04:52 parameter-problem.xml
-rw-r--r--. 1 root root 233 Apr 11 04:52 port-unreachable.xml
-rw-r--r--. 1 root root 256 Apr 11 04:52 precedence-cutoff.xml
-rw-r--r--. 1 root root 249 Apr 11 04:52 protocol-unreachable.xml
-rw-r--r--. 1 root root 185 Apr 11 04:52 redirect.xml
-rw-r--r--. 1 root root 244 Apr 11 04:52 reject-route.xml
-rw-r--r--. 1 root root 241 Apr 11 04:52 required-option-missing.xml
-rw-r--r--. 1 root root 227 Apr 11 04:52 router-advertisement.xml
-rw-r--r--. 1 root root 223 Apr 11 04:52 router-solicitation.xml
-rw-r--r--. 1 root root 248 Apr 11 04:52 source-quench.xml
-rw-r--r--. 1 root root 236 Apr 11 04:52 source-route-failed.xml
-rw-r--r--. 1 root root 253 Apr 11 04:52 time-exceeded.xml
-rw-r--r--. 1 root root 233 Apr 11 04:52 timestamp-reply.xml
-rw-r--r--. 1 root root 228 Apr 11 04:52 timestamp-request.xml
-rw-r--r--. 1 root root 258 Apr 11 04:52 tos-host-redirect.xml
-rw-r--r--. 1 root root 257 Apr 11 04:52 tos-host-unreachable.xml
-rw-r--r--. 1 root root 272 Apr 11 04:52 tos-network-redirect.xml
-rw-r--r--. 1 root root 269 Apr 11 04:52 tos-network-unreachable.xml
-rw-r--r--. 1 root root 293 Apr 11 04:52 ttl-zero-during-reassembly.xml
-rw-r--r--. 1 root root 256 Apr 11 04:52 ttl-zero-during-transit.xml
-rw-r--r--. 1 root root 259 Apr 11 04:52 unknown-header-type.xml
-rw-r--r--. 1 root root 249 Apr 11 04:52 unknown-option.xml
[root@ds1 ~]# cat /usr/lib/firewalld/icmptypes/host-unreachable.xml
<?xml version="1.0" encoding="utf-8"?>
<icmptype>
<short>Host Unreachable</short>
<description>This error message is sent if the destination host is unreachable.</description>
<destination ipv4="yes"/>
<destination ipv6="no"/>
</icmptype>
[root@ds1 ~]#
direct
可以直接使用 direct 来添加 iptables 的规则
使用 direct 的方式,跟直接运用 iptables 添加规则的语法非常类似
代码语言:javascript复制[root@ds1 ~]# firewall-cmd --direct --get-rules ipv4 filter IN_public_allow
[root@ds1 ~]# firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 666 -j ACCEPT
success
[root@ds1 ~]# firewall-cmd --direct --get-rules ipv4 filter IN_public_allow0 -m tcp -p tcp --dport 666 -j ACCEPT
[root@ds1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1 eth2
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ds1 ~]# firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 666 -j ACCEPT
success
[root@ds1 ~]# firewall-cmd --direct --get-rules ipv4 filter IN_public_allow
[root@ds1 ~]#
代码语言:javascript复制它可以直接通过 iptables、ip6tables 和 ebtables 的规则,它适用于应用程序,而不是用户,firewalld 保持对所增加项目的追踪,所以它还能质询 firewalld 和发现由使用直接端口模式的程序造成的更改,直接端口由增加 –direct 选项到 firewall-cmd 命令来使用直接端口模式适用于服务或者程序,以便在运行时间内增加特定的防火墙规则,这些规则不是永久性的,它们需要在每次通过 D-BU S 从 firewalld 接到启动、重新启动和重新加载信息后运用
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
后端支持层
后端支持层的职能是调用基础工具来实现模型所表达的网络规则,也可以理解为调用基础工具或者基础网络库来与内核中的模块通讯,以支持和实现 DSL 所表达的网络策略
这是应用层到内核层的边界
了解网络环境
firewalld 并不是强依赖 NetworkManager,但是还是建议使用 NetworkManager,因为任何网络变更都会被 NetworkManger 及时通知到 firewalld,这样 firewalld 就可实时了解到真实的网络环境,如果不使用 NetworkManager 也不影响 firewalld 的已有配置与规则,但是如果网络发生了临时性的变更,那么 firewalld 并不会自动有感知的,于是之前的配置很可能就会不符合当前的新的网络环境,于是产生一些意想不到的网络表现(由于规则与实情不匹配导致的)
modules
可以通过动态加载内核来实现 firewalld 的功能扩展
以实现更高级更复杂或者对特定领域的高效解决模块功能的扩展
各种基础工具
- iptables
- ip6tables
- ipset
- ebtables
使用这些工具以实现与 netfilter 的对话
各种基础库
- nft
- libnftnl
使用这些库以实现与 netfilter 的对话
总结
firewalld 是一个更为先进的 firewall 配置软件
对于防火墙的管理有一套更为强大和灵活的管理方法
正确理解概念是轻松掌握领域知识的捷径
后面再讲讲 firewalld 的一些实例