FirewallD 是 CentOS 7 服務器上默認可用的防火牆管理工具。基本上,它是 iptables 的封裝,有圖形配置工具 firewall-config 和命令行工具 firewall-cmd
。使用 iptables 服務,每次改動都要求刷新舊規則,並且從 /etc/sysconfig/iptables
讀取新規則,然而 firewalld 只應用改動了的不同部分。
安裝並查看狀態
yum install firewalld
啟動服務,並在系統引導時啟動該服務:
systemctl start firewalld
systemctl enable firewalld
停止並禁用:
systemctl stop firewalld
systemctl disable firewalld
檢查防火牆狀態。輸出應該是 running 或者 not running
# firewall-cmd --state
running
默認情況下,firewalld 處於運行狀態,並拒絕所有傳入流量,但有幾個例外,如 SSH。
查看 FirewallD 守護進程的狀態:
systemctl status firewalld
FirewallD 的區域(zone)
FirewallD 使用服務(service) 和區域(zone)來代替 iptables 的規則(rule)和鏈(chain)。
默認情況下,有以下的區域(zone)可用:
- drop – 丟棄所有傳入的網絡數據包並且無回應,只有傳出網絡連接可用。
- block — 拒絕所有傳入網絡數據包並回應一條主機禁止的 ICMP 消息,只有傳出網絡連接可用。
- public — 只接受被選擇的傳入網絡連接,用於公共區域。
- external — 用於啟用了地址偽裝的外部網絡,只接受選定的傳入網絡連接。
- dmz — DMZ 隔離區,外部受限地訪問內部網絡,只接受選定的傳入網絡連接。
-
**work** — 對於處在你工作區域內的計算機,只接受被選擇的傳入網絡連接。
- home — 對於處在你家庭區域內的計算機,只接受被選擇的傳入網絡連接。
- internal — 對於處在你內部網絡的計算機,只接受被選擇的傳入網絡連接。
- trusted — 所有網絡連接都接受。
要列出所有可用的區域,運行:
# firewall-cmd --get-zones
work drop internal external trusted home dmz public block
列出默認的區域 :
# firewall-cmd --get-default-zone
public
改變默認的區域 :
# firewall-cmd --set-default-zone=dmz
# firewall-cmd --get-default-zone
dmz
特定區域的所有配置:
# firewall-cmd --zone=public --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
所有區域的配置:
# firewall-cmd --list-all-zones root@Test-Linux
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: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
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: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
FirewallD 服務
FirewallD 服務使用 XML 配置文件,記錄了 firewalld 服務信息。
列出所有可用的服務:
# firewall-cmd --get-services
amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap 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
XML 配置文件存儲在 /usr/lib/firewalld/services/
和 /etc/firewalld/services/
目錄下。
配置文件位於兩個目錄中:
- /usr/lib/FirewallD 下保存默認配置,如默認區域和公用服務。 避免修改它們,因為每次 firewall 軟件包更新時都會覆蓋這些文件。
- /etc/firewalld 下保存系統配置文件。 這些文件將覆蓋默認配置。
配置集
FirewallD 使用兩個配置集:“運行時”和“持久”。 在系統重新啟動或重新啟動 FirewallD 時,不會保留運行時的配置更改,而對持久配置集的更改不會應用於正在運行的系統。
默認情況下,firewall-cmd
命令適用於運行時配置,但使用 --permanent
標志將保存到持久配置中。要添加和激活持久性規則,你可以使用兩種方法之一。
1、 將規則同時添加到持久規則集和運行時規則集中。
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=http
2、 將規則添加到持久規則集中並重新加載 FirewallD。
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload
reload
命令會刪除所有運行時配置並應用永久配置。因為 firewalld 動態管理規則集,所以它不會破壞現有的連接和會話。
用 FirewallD 配置你的防火牆
作為一個例子,假設你正在運行一個 web 服務器,SSH 服務端口為 7022 ,以及郵件服務,你可以利用 FirewallD 這樣配置你的服務器:
首先設置默認區為 dmz。
# firewall-cmd --set-default-zone=dmz
# firewall-cmd --get-default-zone
dmz
為 dmz 區添加持久性的 HTTP 和 HTTPS 規則:
# firewall-cmd --zone=dmz --add-service=http --permanent
# firewall-cmd --zone=dmz --add-service=https --permanent
開啟端口 25 (SMTP) 和端口 465 (SMTPS) :
firewall-cmd --zone=dmz --add-service=smtp --permanent
firewall-cmd --zone=dmz --add-service=smtps --permanent
開啟 IMAP、IMAPS、POP3 和 POP3S 端口:
firewall-cmd --zone=dmz --add-service=imap --permanent
firewall-cmd --zone=dmz --add-service=imaps --permanent
firewall-cmd --zone=dmz --add-service=pop3 --permanent
firewall-cmd --zone=dmz --add-service=pop3s --permanent
因為將 SSH 端口改到了 7022,所以要移除 ssh 服務(端口 22),開啟端口 7022:
firewall-cmd --remove-service=ssh --permanent
firewall-cmd --add-port=7022/tcp --permanent
要應用這些更改,重新加載防火牆:
firewall-cmd --reload
最后可以列出這些規則:
# firewall-cmd –list-all
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: http https imap imaps pop3 pop3s smtp smtps
ports: 7022/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
放行80和443端口
# firewall-cmd --permanent --add-port=80/tcp
# firewall-cmd --permanent --add-port=443/tcp
# firewall-cmd --reload # 將這些規則應用於當前會話
查看當前防火牆上的設置
# firewall-cmd --list-services
http https ssh