前言
最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64)映像檔,也就是新版 CentOS 7.3最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪實作環境
- Windows Server 2016 Hyper-V
- CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64)
- firewalld-0.4.3.2-8.el7.noarch
Firewalld 防火牆
在過去 CentOS 5 / 6版本中預設採用的防火牆為 IPTables,而新版 CentOS 7版本中預設採用的防火牆則是 Firewalld。雖然 IPTables / Firewalld這兩者都是使用 iptables tools 來與 Kernel Packet Filter進行溝通,但是在實際運作上仍然有差異。首先,在防火牆組態設定的部分,過去 IPTables防火牆會將組態設定儲存於「/etc/sysconfig/iptables、/etc/sysconfig/ip6tables」檔案中,而新一代 Firewalld則是將防火牆組態設定儲存於「/usr/lib/firewalld、/etc/firewalld」的 XML檔案內。其次,在防火牆規則套用生效的部分,傳統的 IPTables防火牆運作環境中,每當調整防火牆規則時 IPTables 防火牆將會重新讀取所有防火牆規則並重新建立及套用 (套用生效的過程中,原有連線將會中斷)。新一代 Firewalld防火牆則不會重建所有防火牆規則 (僅套用差異的防火牆規則部分),因此在套用新的防火牆規則時 Firewalld 不會中斷現有已經允許且連線中相關的防火牆規則連線。
圖、IPTables 及 Firewalld 防火牆堆疊運作架構示意圖
圖、Firewalld 防火牆運作架構示意圖
調整 Firewalld 防火牆規則
預設情況下,Firewalld 防火牆有多個不同的「區域」(Zone)並內含許多預設的防火牆規則,以便因應企業及組織不同的運作環境需求。你可以查看「/usr/lib/firewalld/zones」路徑內容,即可發現 Firewalld 防火牆預設有「Drop、Block、Public、External、DMZ、Work、Home、Internal、Tursted」等區域,詳細資訊請參考 RHEL 7 Document - Security Guide - Using FIrewalls文件內容。# ls -l /usr/lib/firewalld/zones/
total 36
-rw-r--r--. 1 root root 299 Nov 12 2016 block.xml
-rw-r--r--. 1 root root 293 Nov 12 2016 dmz.xml
-rw-r--r--. 1 root root 291 Nov 12 2016 drop.xml
-rw-r--r--. 1 root root 304 Nov 12 2016 external.xml
-rw-r--r--. 1 root root 369 Nov 12 2016 home.xml
-rw-r--r--. 1 root root 384 Nov 12 2016 internal.xml
-rw-r--r--. 1 root root 315 Nov 12 2016 public.xml
-rw-r--r--. 1 root root 162 Nov 12 2016 trusted.xml
-rw-r--r--. 1 root root 311 Nov 12 2016 work.xml
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
倘若,管理人員需要調整 Firewalld 防火牆規則允許其它公用服務通過,例如,http、https。那麼只要在「/etc/firewalld/zones/public.xml」XML 組態設定檔內容中,加入「<service name="http"/> 及 <service name="https"/>」後,接著使用「firewall-cmd --reload」指令即可載入新的防火牆規則並套用生效。
# grep -E "http|https" /etc/firewalld/zones/public.xml
<service name="http"/>
<service name="https"/>
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: http https ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
# firewall-cmd --get-services
RH-Satellite-6 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
# firewall-cmd --info-service=ssh
ssh
ports: 22/tcp
protocols:
source-ports:
modules:
destination:
# grep 8080 /etc/firewalld/zones/public.xml
<port protocol="tcp" port="8080"/>
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules: