西安 田立軍 解寶琦
隨著各Gnu/Linux 系統(tǒng)廠商以及社區(qū)逐步開始采用新的內(nèi)核作為其發(fā)行版本的默認(rèn)內(nèi)核,防火墻機(jī)制采用了更新的nftables 防火墻機(jī)制,盡管紅帽公司提供了“firewalld.service”防火墻服務(wù)組件以及相關(guān)的配置管理命令“firewallconfig”“firewall-cmd”來對(duì)防火墻進(jìn)行管理,但該服務(wù)組件目前還沒有在其他發(fā)行版或者社區(qū)版本內(nèi)得到統(tǒng)一使用。
為了更好的幫助讀者朋友們理解該防火墻機(jī)制,筆者將自己在工作中直接使用nftables 進(jìn)行手工創(chuàng)建配置,從而使系統(tǒng)具有本地IPS能力的過程進(jìn)行總結(jié)。
目前多數(shù)主流的新發(fā)行版Gnu/Linux 系統(tǒng),在默認(rèn)安裝完成后的“Systemd”系統(tǒng)和服務(wù)管理器中就已經(jīng)添加了新的“nftables.serivce”子服務(wù)配置文件,同時(shí)依然支持iptables 規(guī)則和iptables 命令格式。
不過為了徹底將防火墻升級(jí)到nftables 機(jī)制,我們可以在沒有“firewalld.service”的發(fā)行版系統(tǒng)中直接啟用“nftables.service”服務(wù)來使用新的防火墻。通過命令“vi/lib/systemd/system/nftables.service”,從該文件中的語句“ExecStart=/usr/sbin/nft -f/etc/nftables.conf”,我們可以清楚的看到nftables 防火墻的默認(rèn)配置和規(guī)則文件一般都放置在系統(tǒng)的/etc/nftables.conf目錄中,不過該默認(rèn)配置文件中只包含一個(gè)名為“inet filter”的簡單IPv4/IPv6防火墻列表。inet 表中可以同時(shí)適用于IPv4 和IPv6的規(guī)則,但不能用于nat 類型的鏈,只能用于filter 類型的鏈。
為了保持和iptables防火墻的規(guī)則類比,便于用戶熟悉,我們可以使用如下nftables 命令創(chuàng)建相應(yīng)的表和鏈來建立一個(gè)類似于傳統(tǒng)iptables 防火墻框架,創(chuàng)建過程如下:
1.創(chuàng)建nft 表,表包含鏈。與iptables中的表不同,nftables 中沒有內(nèi)置表,表的數(shù)量和名稱由用戶決定,但每個(gè)表只有一個(gè)地址簇,并且只適用于該簇的數(shù)據(jù)包。
表可以指定五個(gè)(IP、IPv6、inet、ARP、bridge)簇中的一個(gè),用戶可以依次執(zhí)行如下“nft add table filter”“nft add table ip6 filter”“nft add table bridge filter”三條命令,nftables 將為我們分別建立三個(gè)IP、IPv6、bridge 簇并且表名均為filter 的防火墻框架。
2.創(chuàng)建鏈,鏈的目的是保存規(guī)則。與iptables 中的鏈不同,nftables 沒有內(nèi)置鏈。這意味著與iptables不同,如果鏈沒有使用netfilter 框架中的任何類型或鉤子,則流經(jīng)這些鏈的數(shù)據(jù)包不會(huì)被nftables 觸及。
鏈有兩種類型:基本鏈?zhǔn)莵碜跃W(wǎng)絡(luò)棧的數(shù)據(jù)包的入口點(diǎn),其中指定了鉤子值,其實(shí)可以理解為iptables 防火墻的默認(rèn)規(guī)則;常規(guī)鏈可以理解為其它用戶自定義的規(guī)則鏈。
使用如下命令為每一個(gè)表建立“INPUT”“FORWARD”“OUTPUT”鏈,并且設(shè)置基礎(chǔ)鏈,其中IP 簇filter 表“INPUT”鏈默認(rèn)為丟棄所有數(shù)據(jù)包,的相應(yīng)的命令格式如下:
(1)添 加IP 簇filter表相應(yīng)鏈命令集。
(2)添加IPv6 簇filter表相應(yīng)鏈命令集。
(3)添 加bridge 簇filter 表相應(yīng)鏈命令集。
3.添加規(guī)則,規(guī)則由語句或表達(dá)式構(gòu)成,包含在鏈中。
將一條規(guī)則添加到鏈中使用如下語法:
nft add rule family table chain handle handle statement
規(guī)則添加到handle 處,這是可選的。如果不指定,則規(guī)則添加到鏈的末尾,類似于“iptables -A”方法。
將規(guī)則插入到指定位置使用如下語法:
如果未指定handle,則規(guī)則插入到鏈的開頭,類似于“iptables -I”方法。
以下是用戶根據(jù)自己的實(shí)際情況添加的具體規(guī)則:
(1)放行本地回環(huán)接口“l(fā)o”的所有流量。
(2)放 行established、related 狀態(tài)的數(shù)據(jù)包,這一點(diǎn)很重要,因?yàn)槎鄶?shù)對(duì)外訪問的數(shù)據(jù)包在收到對(duì)端主機(jī)回包時(shí)多為這兩種狀態(tài),如果在INPUT 鏈中不放行該類型數(shù)據(jù)包,即使本機(jī)的OUTPUT 鏈默認(rèn)為ACCEPT,讓所有數(shù)據(jù)包出站,系統(tǒng)也會(huì)主動(dòng)在INPUT 鏈中丟棄掉相應(yīng)的回包而導(dǎo)致數(shù)據(jù)無法交互。具體命令如下:
(3)阻斷存在重大安全隱患的系統(tǒng)端口,包括已經(jīng)公布的比如勒索病毒等端口,nftables 在配置過程中,當(dāng)用戶使用端口進(jìn)行添加后,nftables 會(huì)自動(dòng)將端口轉(zhuǎn)換為service 模式,用戶可以通過使用命令”nft describe tcp dport”對(duì)照查看。阻斷安全隱患的系統(tǒng)端口具體命令如下:
(4)對(duì)服務(wù)進(jìn)行限流控制,防止DDoS 攻擊或者CC攻擊造成系統(tǒng)服務(wù)中斷,可以通過limit 限制通信速率,以下是接受一個(gè)每秒最多10個(gè)Web 或者HTTPS 或 者DNS查詢請(qǐng)求的數(shù)據(jù)包,同時(shí)可以有2個(gè)包超出限制的規(guī)則具體命令:
經(jīng)過以上配置后,我們的主機(jī)就具有了很好的本機(jī)IPS 能力,從而應(yīng)對(duì)不論是面向南北跨路由器的訪問流量,還是本地網(wǎng)絡(luò)內(nèi)的東西訪問流量,常規(guī)的惡意掃描或者惡意攻擊基本是夠用了。
之后用戶可以使用命令“nft list ruleset >/etc/nftables.conf”將 這些規(guī)則保存在nftables的默認(rèn)配置文件中,并使用“systemctl enable nftables.service”打開該服務(wù)的默認(rèn)啟動(dòng)模式,之后系統(tǒng)將在開機(jī)時(shí)自動(dòng)啟動(dòng)nftables 防火墻并應(yīng)用相應(yīng)規(guī)則。用戶也可以通過命令“vi/etc/nftables.conf”來直接按照相應(yīng)規(guī)則編輯該文件來修改防火墻配置,以確保自己的系統(tǒng)處于本機(jī)防火墻IPS 能力的保護(hù)之下。
希望本文對(duì)通過使用新的Gnu/Linux 系統(tǒng)提供的nftables 防火墻機(jī)制,建設(shè)屬于自己的本機(jī)IPS 能力有用,并能幫助到讀者。