︿
Top

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.4 (1709) Kernel 3.10.0-693.el7.x86_64) 映像檔,也就是新版 CentOS 7.4 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




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


本文實作環境採用 CentOS 7.4 Minimal Install,並於安裝完成後預設採用「Public」這個區域的防火牆規則及組態設定,同時預設僅允許「dhcpv6-client 及 SSH」流量允許通過。你可以查看「/etc/firewalld/zones/public.xml」內容,或使用指令「firewall-cmd --list-all」確認目前採用的 Firewalld Zone 及套用的防火牆規則。
# 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:


那麼,該如何確認 Firewalld 防火牆預設支援哪些公用服務? 只要透過「firewall-cmd --get-services」指令即可列出,並使用「firewall-cmd --info-service=ssh」指令搭配公用服務名稱,即可查詢該公用服務的相關資訊。
# 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 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
# firewall-cmd --info-service=ssh
ssh
  ports: 22/tcp
  protocols:
  source-ports:
  modules:
  destination:


此外,當管理人員需要調整 Firewalld 防火牆允許其它連接埠,例如,TCP Port 8080。那麼,只要修改「/etc/firewalld/zones/public.xml」內容,加上「<port protocol="tcp" port="8080"/>」後,接著使用「firewall-cmd --reload」指令即可載入新的防火牆規則並套用生效。
# 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:




CentOS 7.4 基礎設定系列文章:

文章標籤: ,