Firewalld 是可用于許多 Linux 發行版的防火牆管了解決方案,它充當 Linux 核心提供的 iptables 資料包過濾系統的前端。
在本教程中,介紹如何為伺服器設定防火牆,并使用 firewall-cmd 管理工具來管理防火牆添加 IP 白名單。
Firewalld 中的基本概念
區域(zone)
區域(zone)基本上是一組規則,它們決定了允許哪些流量,具體取決于你對計算機所連接配接的網絡的信任程度。為網絡接口配置設定了一個區域,以訓示防火牆應允許的行為。
Firewalld 一般已經預設内置了 9 個區域(zone),大部分情況下,這些已經足夠使用,按從最不信任到最受信任的順序為:
drop:最低信任級别。所有傳入的連接配接都将被丢棄而不會回複,并且隻能進行傳出連接配接。
block:與上述類似,但不是簡單地删除連接配接,而是使用 icmp-host-prohibitedor 和 icmp6-adm-prohibited 消息拒絕傳入的請求。
public:表示不信任的公共網絡。您不信任其他計算機,但可能會視情況允許選擇的傳入連接配接。預設情況下,此區域為激活狀态。
external:如果你使用防火牆作為網關,則為外部網絡。将其配置為 NAT 轉發,以便你的内部網絡保持私有但可通路。
internal:external 區域的另一側,用于網關的内部。這些計算機值得信賴,并且可以使用一些其他服務。
dmz:用于 DMZ (DeMilitarized Zone) 中的計算機(将無法通路網絡其餘部分的隔離計算機),僅允許某些傳入連接配接。
work:用于工作機。信任網絡中的大多數計算機。可能還允許其他一些服務。
home:家庭環境。通常,這意味着您信任其他大多數計算機,并且将接受其他一些服務。
trusted:信任網絡中的所有計算機。可用選項中最開放的,應謹慎使用。
安裝并啟用防火牆
Firewalld 是在某些 Linux 發行版上預設安裝的,但有時候需要手動安裝。CentOS 下的安裝指令如下:
$ sudo yum install firewalld
啟用 Firewalld 服務并允許自啟動
$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld
确認 Firewalld 服務是否正在運作
$ sudo firewall-cmd --state
傳回 running 則表示已經運作;not running 則表示沒有運作。
熟悉目前的防火牆規則
輸入以下指令,可以看到目前選擇哪個區域作為預設區域:
$ sudo firewall-cmd --get-default-zone
一般情況下會傳回 public
輸入以下内容進行确認哪個區域處于激活狀态:
$ sudo firewall-cmd --get-active-zones
一般情況下,在隻有一個網卡的情況下會傳回:
public
interfaces: eth0
擷取可用區域的清單,輸入以下指令:
$ sudo firewall-cmd --get-zones
傳回:
block dmz drop external home internal public trusted work
通過指定 –zone 的 –list-all 參數,我們可以看到與區域關聯的特定配置:
$ sudo firewall-cmd --zone=home --list-all
傳回值:
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:
擷取可用區域清單的詳細資訊,輸入以下指令:
$ sudo firewall-cmd --list-all-zones
使用 Firewalld 配置 IP 白名單
如前所述,Firewalld 有内置的區域,可以利用這些區域不同的特性,來簡單快捷地配置 IP 白名單。
具體做法就是,首先要收集你要允許的 IP 白名單清單,比如 Cloudflare 的所有 IP 範圍:
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/12
172.64.0.0/13
131.0.72.0/22
與此同時,你也要加入你自己的 IP 位址,否則白名單一旦生效,可能會将你阻擋在外而無法連接配接。
将這些 IP 清單逐一加入 trusted 區域,使用指令如下:
$ sudo firewall-cmd --permanent --zone=trusted --add-source=173.245.48.0/20
……
$ sudo firewall-cmd --permanent --zone=trusted --add-source=131.0.72.0/22
使 trusted 區域設定生效,使用指令如下:
$ sudo firewall-cmd --reload
确認 trusted 區域是否設定正确,使用指令如下:
$ sudo firewall-cmd --zone=trusted --list-all
trusted (active)
target: ACCEPT
sources: 173.245.48.0/20 …… 131.0.72.0/22
services:
因為此時已經設定了 trusted 區域,是以還需要切換預設區域從 public 到 drop,以達到無視所有接入連接配接的目的。使用指令如下:
$ sudo firewall-cmd --set-default-zone=drop
再将預設網卡 eth0 配置設定給 drop 區域,使用指令如下:
$ sudo firewall-cmd --permanent --zone=drop --change-interface=eth0
使白名單最終生效,使用指令如下(注意:請再次确認你的所有 IP 都加入了 trusted 區域):
至此,白名單設定正式生效。
後記
之是以要設定 IP 白名單,是因為最近遇到了 SYN_RECV 攻擊,大量的 IP 連接配接到伺服器的 80 和 443 端口,瞬間讓整個機器動彈不得。
因為網站使用了 Cloudflare 的 CDN 服務,是以設定了隻允許 Cloudflare 的所有 IP 以及自己的常用固定 IP 可以通路。
除此之外的 IP 則一律不許連接配接,這樣在保證網站正常的情況下,也可以防止 DDoS 攻擊。