天天看點

如何使用 FirewallD 開啟 IP 白名單

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 攻擊。

繼續閱讀