Linux防火牆:iptables和firewalld詳解


Linux防火牆:iptables和firewalld詳解


如何使用iptables和firewalld工具來管理Linux防火牆連接規則。

本文摘自我的書“Linux in Action”和第二個尚未發佈的Manning項目。

防火牆

防火牆是一組規則。當數據包流入或流出受保護的網絡空間時,將根據防火牆規則測試其內容(特別是有關其來源,目標和計劃使用的協議的信息),以確定是否應允許其通過。 這是一個簡單的例子:

Linux防火牆:iptables和firewalld詳解


防火牆可以根據協議或基於目標的規則過濾請求


一方面,iptables是一種在Linux機器上管理防火牆規則的工具。

另一方面,firewalld也是用於管理Linux機器上的防火牆規則的工具。

你對此有看法?如果我告訴你那裡還有另一種叫做nftables的工具,會破壞你一天的心情嗎?

好吧,我承認整個事情確實有點搞笑,所以讓我解釋一下。這一切都始於Netfilter,它控制Linux內核模塊級別的網絡堆棧訪問。幾十年來,用於管理Netfilter鉤子的主要命令行工具是iptables規則集。

因為調用這些規則所需的語法可能會有點神秘,ufw和firewalld等各種用戶友好的實現被引入為更高級別的Netfilter解釋器。但是,Ufw和firewalld主要用於解決獨立計算機所面臨的各種問題。構建全網絡解決方案通常需要額外的iptables,或者自2014年以來,它需要更換nftables(通過nft命令行工具)。

iptables沒有去任何地方,仍然被廣泛使用。實際上,應該期望在未來許多年內作為管理員在工作中遇到受iptables保護的網絡。但是nftables通過添加到經典的Netfilter工具集,帶來了一些重要的新功能。

從這裡開始,我將通過示例演示firewalld和iptables如何解決簡單的連接問題。

使用firewalld配置HTTP訪問

正如你可能從其名稱中猜到的那樣,firewalld是systemd系列的一部分。 firewalld可以安裝在Debian/Ubuntu機器上,但默認情況下它安裝在Red Hat和CentOS上。如果計算機上運行了像Apache這樣的Web服務器,則可以通過瀏覽到服務器的Web根目錄來確認防火牆是否正常工作。如果該站點無法訪問,那麼firewalld正在完成其工作。

你將使用firewall-cmd工具從命令行管理firewalld設置。添加-state參數將返回當前防火牆狀態:

# firewall-cmd --state

running

默認情況下,firewalld將處於活動狀態,並將通過一些例外來拒絕所有傳入流量,例如SSH。這意味著你的網站不會有太多的訪問者,這肯定會為你節省大量的數據傳輸成本。但是,由於這可能不是你對Web服務器的想法,因此你需要打開按照慣例分別指定為80和443的HTTP和HTTPS端口。firewalld提供了兩種方法。一種是通過-add-port參數直接引用端口號以及它將使用的網絡協議(在本例中為TCP),-permanent參數告訴firewalld每次服務器啟動時加載此規則:

# firewall-cmd --permanent --add-port=80/tcp

# firewall-cmd --permanent --add-port=443/tcp

-reload參數將這些規則應用於當前會話:

# firewall-cmd --reload

對防火牆的當前設置很好奇? 運行-list-services:

# firewall-cmd --list-services

dhcpv6-client http https ssh

假設你已按前面所述添加了瀏覽器訪問權限,現在應該打開HTTP,HTTPS和SSH端口以及dhcpv6-client,這樣Linux就可以從本地DHCP服務器請求IPv6 IP地址。

使用iptables配置鎖定的自助服務終端

我相信你已經看到了自助服務終端,它們是平板電腦,觸摸屏和類似ATM機的電腦,機場,圖書館和商家都在四處閒逛,邀請客戶和路人瀏覽內容。關於大多數自助服務終端的事情是,你通常不希望用戶像在自己家裡對待自己的設備一樣使用它們。它們通常不用於瀏覽,觀看YouTube視頻或針對五角大樓發起拒絕服務攻擊。因此,為了確保它們不會被濫用,你需要鎖定它們。

一種方法是應用某種自助服務終端模式,無論是通過巧妙地使用Linux顯示管理器還是在瀏覽器級別。但是為了確保你已經封鎖所有漏洞,你可能還想通過防火牆添加一些硬網絡控制。在下一節中,我將描述如何使用iptables進行操作。

關於使用iptables,有兩件重要的事情需要記住:你提供規則的順序至關重要,並且iptables規則本身不會在重啟後繼續存在。我會一次一個地解決這些問題。

自助服務終端項目

為了說明這一切,讓我們假設我們為一家名為BigMart的大型連鎖店的商店工作。他們已經存在了幾十年;事實上,我們想象中的祖父母可能在那裡長大。但如今,在BigMart公司總部工作的人可能只是在計算亞馬遜把他們永遠幹掉的時間。

儘管如此,BigMart的IT部門正在盡力而為,他們向你發送了一些支持WiFi的自助服務終端設備,你希望這些設備可以安裝在整個商店的戰略位置。他們的想法是,他們將顯示登錄BigMart.com產品頁面的Web瀏覽器,允許他們查找商品功能,過道位置和庫存水平。自助服務終端還需要訪問bigmart-data.com,其中存儲了許多圖像和視頻媒體。

除此之外,你還需要允許更新,並在必要時允許包下載。最後,你只想從本地工作站允許入站SSH訪問,並阻止其他所有人。下圖說明了它將如何工作:

Linux防火牆:iptables和firewalld詳解


自助服務終端的流量由iptables控制

腳本

以下是這些將適合Bash腳本的方式:

#!/bin/bash

iptables -A OUTPUT -p tcp -d bigmart.com -j ACCEPT

iptables -A OUTPUT -p tcp -d bigmart-data.com -j ACCEPT

iptables -A OUTPUT -p tcp -d ubuntu.com -j ACCEPT

iptables -A OUTPUT -p tcp -d ca.archive.ubuntu.com -j ACCEPT

iptables -A OUTPUT -p tcp --dport 80 -j DROP

iptables -A OUTPUT -p tcp --dport 443 -j DROP

iptables -A INPUT -p tcp -s 10.0.3.1 --dport 22 -j ACCEPT

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

我們規則的基本闡述從-A開始,告訴iptables我們要添加以下規則。OUTPUT表示此規則應成為OUTPUT鏈的一部分。-p表示此規則僅適用於使用TCP協議的數據包,正如-d告訴我們的那樣,目標是bigmart.com。 -j標誌指向ACCEPT,作為數據包與規則匹配時要採取的操作。在第一條規則中,該操作是允許或接受請求。但更進一步,可以看到將被刪除或拒絕的請求。

請記住,訂單很重要。這是因為iptables將通過其每個規則運行請求,但只有在匹配之後才會運行。因此,對youtube.com的傳出瀏覽器請求將傳遞前四個規則,但是當它到達-dport 80或-dport 443規則時,取決於它是HTTP還是HTTPS請求,它將被丟棄。iptables不會再費心檢查因為那是一場比賽。

另一方面,當ubuntu.com達到其適當的規則時,系統請求ubuntu.com進行軟件升級。顯然,我們在這裡做的是允許僅向我們的BigMart或Ubuntu目的地發送HTTP或HTTPS請求而不允許其他目的地。

最後兩條規則將處理傳入的SSH請求。它們不會被前兩個丟棄規則拒絕,因為它們不使用端口80或443,而是22。在這種情況下,將接受來自我的工作站的登錄請求,但是其他任何地方的請求都將被刪除。這很重要:確保用於端口22規則的IP地址與用於登錄的計算機的地址相匹配,如果不這樣做,將立即被鎖定。當然,這沒什麼大不了的,因為它當前配置的方式,你只需重新啟動服務器,iptables規則都將被刪除。如果使用LXC容器作為服務器並從LXC主機登錄,則使用主機用於連接容器的IP地址,而不是其公共地址。

如果機器的IP發生變化,需要記住更新此規則,否則,你會被鎖定。

在家裡測試(希望是在一臺丟棄的虛擬機上)?太好了,創建自己的腳本。現在可以保存腳本,使用chmod使其可執行,並以sudo的方式運行它。不要擔心bigmar -data.com沒有發現錯誤——當然不會發現,它不存在。

chmod +X>

sudo ./scriptname.sh

可以使用cURL從命令行測試防火牆,請求ubuntu.com工作,但manning.com失敗。

curl ubuntu.com

curl manning.com

配置iptables以在系統引導時加載

現在,如何在每次自助服務終端啟動時自動加載這些規則?第一步是使用iptables-save工具將當前規則保存到.rules文件。這將在根目錄中創建一個包含規則列表的文件,管道,後跟tee命令,是將sudo權限應用於字符串的第二部分所必需的:實際將文件保存到受限制的根目錄。

然後,我可以告訴系統每次啟動時都運行一個名為iptables-restore的相關工具。我們在上一個模塊中看到的常規cron作業無濟於事,因為它們是在設定的時間運行,但我們不知道我們的計算機何時可能決定崩潰並重新啟動。

有很多方法可以解決這個問題。這是一個:

在我的Linux機器上,我將安裝一個名為anacron的程序,該程序將在/etc/目錄中為我們提供一個名為anacrontab的文件。我將編輯該文件並添加此iptables-restore命令,告訴它在啟動一分鐘後每天(必要時)將該.rules文件的當前值加載到iptables中。我將給作業一個標識符(iptables-restore),然後添加命令本身。既然你在家裡測試,你應該通過重新啟動你的系統來測試所有這些。

sudo iptables-save | sudo tee /root/my.active.firewall.rules

sudo apt install anacron

sudo nano /etc/anacrontab

1 1 iptables-restore iptables-restore < /root/my.active.firewall.rules

我希望這些實際例子說明了如何使用iptables和firewalld來管理基於Linux的防火牆的連接問題。

關於作者

DAVID CLINTON是系統管理員,教師和作家。他為許多重要的技術主題管理,撰寫和創建了培訓材料,包括Linux系統,雲計算和Docker等容器技術。

原文鏈接:

https://opensource.com/article/18/9/linux-iptables-firewalld


分享到:


相關文章: