如何使用iptables和firewalld工具來管理Linux防火牆連接配接規則。
本文摘自我的書“Linux in Action”和第二個尚未釋出的Manning項目。
防火牆
防火牆是一組規則。當資料包流入或流出受保護的網絡空間時,将根據防火牆規則測試其内容(特别是有關其來源,目标和計劃使用的協定的資訊),以确定是否應允許其通過。 這是一個簡單的例子:

防火牆可以根據協定或基于目标的規則過濾請求
一方面,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通路,并阻止其他所有人。下圖說明了它将如何工作:
自助服務終端的流量由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 scriptname.sh
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