Firewalld 防火牆配置 CentOS7

以往CentOS6以前,防火牆使用iptables來運作,但是每次重設規則後,
必須清除原有規則,會影響到原有的連線狀態,CentOS 7 Firewalld
最大的好處有兩個:
  1、支援動態更新,不用重啟服務;
  2、加入了防火牆的“zone”概念
因此在使用上靈活度比iptables更高,運用firewall-cmd 指令來操作
須注意的是兩者會衝突不能共用,接來來介紹如何安裝及使用 CentOS 7 防火牆

安裝firewalld

yum install firewalld

檢查 firewalld 服務是否有啟動,如顯示active表示已啟動

systemctl status firewalld

● firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor prese t: enabled)
Active: active (running) since Mon 2020-11-02 15:14:16 CST; 4h 36min ago
Docs: man:firewalld(1)
Main PID: 2995 (firewalld)
CGroup: /system.slice/firewalld.service
└─2995 /usr/bin/python -Es /usr/sbin/firewalld –nofork –nopid

或是是輸入,顯示為running(表示啟動)

firewall-cmd --state

firewalld 啟動與關閉

啟動 firewalld 服務

systemctl start firewalld

停止 firewalld 服務

systemctl stop firewalld

重新啟動 firewalld 服務

service firewalld restart

firewalld 在開機時自動啟動

systemctl enable firewalld

firewalld的使用是由firewall-cmd 命令作為開頭再加上區域(zone)或是指令動作

先決定要設定的zone,再輸入規則,

如果需要永久啟動此規則最後加入–permanent

最後sudo firewall-cmd –reload

Zone 區域

區域 描述
drop 任何往內的封包都會被丟棄,只允許往外傳送的封包。
block 任何來自於外部的連線都會被阻擋,只允許自己系統主動建立的連線。
public 公開區域,預設不信任其他電腦與網路,只有被允許的連線才能進入。通常大部分的連線設定都會放在這裡。
external 公開區域,適用於 NAT 網路環境。
dmz 非軍事區域(demilitarized zone,有點像是放在外頭的危險區域),允許外部的連線進入,但其對內的連線則有限制,只有被允許的連線才能連進內部網路。
work 公司內部等工作區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
home 家裡頭的網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
internal 內部網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。
trusted 完全信任的區域,接受所有連線。

了解區域的描述之後,接著區域設定

列出所有的區域

firewall-cmd --get-zones
block dmz drop external home internal public trusted work
詳細區域內容
firewall-cmd --list-all-zones
….略
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上述為預設 public zone 區域,開啟兩個服務 dhcpv6-client ssh,

其他服務關閉,

查詢永久設定值

firewall-cmd --zone=public --list-all --permanent

區域的服務

若要在防火牆上開啟一些連接埠,讓對外的服務使用,可以再區域設定中新增一些服務設定。firewalld 中有預先定義一些常用的服務名稱

列出預先定義的服務名稱
firewall-cmd --get-services

RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-t estnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm d ropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia -master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin ke rberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls managesieve mdns minidlna mongodb mosh moun td ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansyn c squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-cl ient upnp-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

大部分常見的網路服務都有在這個列表中,

若要將指定的服務新增至指定的區域中,例如:

將 http 服務新增至 public 區域中

firewall-cmd --zone=public --add-service=http

永久http 服務新增至 public 區域中

firewall-cmd --zone=public --add-service=http --permanent

列出 public 區域永久的服務設定

firewall-cmd --zone=public --list-services --permanent

將 https 服務新增至 public 區域中

firewall-cmd --zone=public --add-service=https

永久將 https 服務新增至 public 區域中

firewall-cmd --zone=public --add-service=https --permanent

設定預設區域

當網路介面或是連線沒有指定區域時,就會直接納入預設區域中。

查詢目前預設的區域:

firewall-cmd --get-default-zone

public

若要更改 firewalld 預設的區域,例如將public改為home

firewall-cmd --set-default-zone=home

再次確認預設區域

firewall-cmd --get-default-zone

home

新增一個zone

firewall-cmd --new-zone=zone-name

永久新增一個zone

firewall-cmd --new-zone=zone-name --permanent

介面所屬區域

列出目前所有運作中的區域,以及各個網路介面所屬的區域

firewall-cmd --get-active-zones

public
interfaces: eth0

暫時將 eth0 網路介面設定至 home 區域

sudo firewall-cmd –zone=home –change-interface=eth0

永久將eth0 網路介面設定至 home 區域,則需要到/etc/sysconfig/network-scripts/修改

vi /etc/sysconfig/network-scripts/ifcfg-eth0

ZONE=home

自訂開啟連接埠

基本上 firewalld 有內定的服務都可以使用上面這種方式開啟,如果我們想要開啟的連接埠不在 firewalld 內建的服務名單中,也可以直接指定通訊協定(tcp 或 udp)與埠號:

–zone:指定區域
–add-port:加入欲開啟的連接埠,並指定通訊協定
–remove-port:移除開啟的連接埠,並指定通訊協定

查看已開啟連接埠

firewall-cmd --list-ports

開啟 tcp 的 8080 連接埠

firewall-cmd --zone=public --add-port=8080/tcp

永久開啟 tcp 的 8080 連接埠

firewall-cmd --zone=public --add-port=8080/tcp --permanent

埠號的部分也可以用範圍的方式指定,一次開通多個連接埠

開啟 udp 的 4990 至 4999 連接埠

firewall-cmd --zone=public --add-port=4990-4999/udp

永久開啟 udp 的 4990 至 4999 連接埠

firewall-cmd --zone=public --add-port=4990-4999/udp --permanent

重新載入設定後生效

firewall-cmd --reload

移除服務與埠號

將指定的服務從某個區域中移除

將 http 服務從 public 區域中移除

firewall-cmd --zone=public --remove-service=http

永久將 http 服務從 public 區域中移除

firewall-cmd --zone=public --remove-service=http --permanent

移除自訂的通訊協定與埠號

關閉 tcp 的 8080 連接埠

firewall-cmd --zone=public --remove-port=8080/tcp

永久關閉 tcp 的 8080 連接埠

firewall-cmd --zone=public --remove-port=8080/tcp --permanent

重新載入設定後生效

firewall-cmd --reload

新增服務名稱

建立一個新的服務,有利於整個防火牆的規劃,管理開啟的埠號會更直覺化

新增一個名為test服務

firewall-cmd --new-service=test --permanent

新增描述

firewall-cmd --service=test --set-description="Test Service" --permanent

新增short描述

firewall-cmd --service=test --set-short=test --permanent

新增服務所使用的連接埠

firewall-cmd --service=test --add-port=10030/tcp --permanent

重新載入

firewall-cmd --reload

Port Forwarding 連接埠轉發

利用–add-forward-port參數,將來自連接埠A的資料轉發至連接埠B

將Port=22的資料轉發至Port=2288

firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2288

將port22的資料轉發到192.168.8.100

firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toaddr=192.168.8.100

將port22的資料轉發到192.168.8.100的port2288

firewall-cmd --zone=public --add-forward-port=port=22:proto=tcp:toport=2288:toaddr=192.168.8.100

偽裝IP

如果是不同主機之間需要轉發,則需啟動masquerade來偽裝

檢查是否允許偽裝IP

firewall-cmd --query-masquerade

允許防火牆偽裝IP

firewall-cmd --add-masquerade

禁止防火牆偽裝IP

firewall-cmd --remove-masquerade

永久啟用public區域中的偽裝

firewall-cmd --zone=public --add-masquerade --permanent

臨時禁用public區域中的 IP 偽裝

firewall-cmd --zone=public --remove-masquerade

永久禁用public區域中的偽裝

firewall-cmd --zone=public --remove-masquerade --permanent

查詢public區域的偽裝狀態

firewall-cmd --zone=public --query-masquerade

查詢public區域中的偽裝的永久狀態

firewall-cmd --zone=public --query-masquerade --permanent

Rich rules 的使用

查詢已加入的rich rules

firewall-cmd --list-rich-rules

IP白名單

允許來自192.168.8.100的連線

firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.8.100 accept'

永久允許來自192.168.8.100的連線

firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.8.100 accept' --permanent

允許來自 192.168.8.1 ~ 192.168.8.254 的所有 ssh 連線

firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.8.0/24" service name="ssh" accept' --permanent

IP黑名單

拒絕來自192.168.8.100的連線

firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.8.100" reject' --permanent

拒絕來自192.168.8.100的22埠號連

firewall-cmd --add-rich-rule 'rule family="ipv4" source address="92.168.8.100" port port="22" drop' --permanent