如何使用 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
icmp-block-inversion: no
interfaces:
sources: 173.245.48.0/20 …… 131.0.72.0/22
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
因為此時已經設置了 trusted 區域,所以還需要切換默認區域從 public 到 drop,以達到無視所有接入連接的目的。使用命令如下:

$ sudo firewall-cmd --set-default-zone=drop
再將默認網卡 eth0 分配給 drop 區域,使用命令如下:

$ sudo firewall-cmd --permanent --zone=drop --change-interface=eth0
使白名單最終生效,使用命令如下(注意:請再次確認你的所有 IP 都加入了 trusted 區域):

$ sudo firewall-cmd --reload
至此,白名單設置正式生效。

后記
之所以要設置 IP 白名單,是因為最近遇到了 SYN_RECV 攻擊,大量的 IP 連接到服務器的 80 和 443 端口,瞬間讓整個機器動彈不得。
因為網站使用了 Cloudflare 的 CDN 服務,所以設置了只允許 Cloudflare 的所有 IP 以及自己的常用固定 IP 可以訪問。
除此之外的 IP 則一律不許連接,這樣在保證網站正常的情況下,也可以防止 DDoS 攻擊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM