介紹
UFW或Uncomplicated Firewall是iptables的接口,旨在簡化配置防火墻的過程。
先決條件
假設(shè):
- 可以使用帶有sudo非root用戶的Ubuntu 16.04服務(wù)器
UFW默認(rèn)安裝在Ubuntu上。如果由于某種原因已經(jīng)被卸載,可以使用sudo apt-get install ufw 。
第1步 - 使用IPv6與UFW(可選)
如果Ubuntu服務(wù)器啟用了IPv6,請確保UFW配置為支持IPv6,以便它將管理除IPv4之外的IPv6的防火墻規(guī)則。打開UFW配置:
sudo vim /etc/default/ufw
然后確保IPV6值為yes 。
...
IPV6=yes
...
保存并關(guān)閉文件。現(xiàn)在,當(dāng)啟用UFW時,將配置為寫入IPv4和IPv6防火墻規(guī)則。但是,在啟用UFW之前,我們將確保您的防火墻配置為允許您通過SSH連接。讓我們開始設(shè)置默認(rèn)策略。
第2步 - 設(shè)置默認(rèn)策略
如果您剛剛開始使用防火墻,則首先要定義的規(guī)則是您的默認(rèn)策略。這些規(guī)則控制如何處理未明確匹配任何其他規(guī)則的流量。默認(rèn)情況下,UFW設(shè)置為拒絕所有傳入連接,并允許所有傳出連接。這意味著任何人嘗試到達您的服務(wù)器將無法連接,而服務(wù)器內(nèi)的任何應(yīng)用程序?qū)⒛軌虻竭_外部。
sudo ufw default deny incoming
sudo ufw default allow outgoing
這些命令設(shè)置默認(rèn)值為拒絕傳入和允許傳出連接。單獨的這些防火墻默認(rèn)值可能足以用于個人計算機,但是服務(wù)器通常需要響應(yīng)來自外部用戶的傳入請求。
第3步 - 允許SSH連接
如果我們現(xiàn)在啟用了UFW防火墻,它將拒絕所有傳入的連接。這意味著,如果我們希望服務(wù)器響應(yīng)這些類型的請求,我們將需要創(chuàng)建明確允許合法傳入連接(例如SSH或HTTP連接)的規(guī)則。 要將服務(wù)器配置為允許傳入SSH連接,可以使用以下命令:
sudo ufw allow ssh
這將創(chuàng)建防火墻規(guī)則,允許端口22上的所有連接,這是默認(rèn)情況下SSH守護程序監(jiān)聽的端口。 UFW知道什么SSH和一些其他服務(wù)名意味著,因為它們被列為/etc/services文件中的/etc/services 。 但是,我們實際上可以通過指定端口而不是服務(wù)名稱來編寫等效規(guī)則。例如,此命令的工作原理與上述相同:
sudo ufw allow 22
如果您將SSH守護程序配置為使用其他端口,則必須指定適當(dāng)?shù)亩丝?。例如,如果您的SSH服務(wù)器正在監(jiān)聽端口2222 ,則可以使用此命令允許該端口上的連接:
sudo ufw allow 2222
現(xiàn)在您的防火墻已配置為允許傳入SSH連接,我們可以啟用它。
第4步 - 啟用UFW
要啟用UFW,請使用以下命令:
sudo ufw enable
您將收到一條警告,指出該命令可能會中斷現(xiàn)有的SSH連接。我們已經(jīng)設(shè)置了允許SSH連接的防火墻規(guī)則,因此應(yīng)該繼續(xù)。用y響應(yīng)提示。 防火墻現(xiàn)在處于活動狀態(tài)。隨意運行sudo ufw status verbose命令以查看設(shè)置的規(guī)則。
第5步 - 允許其他連接
此時,您應(yīng)該允許服務(wù)器需要響應(yīng)的所有其他連接。應(yīng)該允許的連接取決于您的特定需求。幸運的是,你已經(jīng)知道如何編寫允許基于服務(wù)名稱或端口的連接的規(guī)則;我們已經(jīng)在端口22上使用SSH。您也可以執(zhí)行以下操作:
端口80上的HTTP,這是未加密的Web服務(wù)器使用的,使用sudo ufw allow http或sudo ufw allow 80
HTTPS端口443,這是加密的Web服務(wù)器使用,使用sudo ufw allow https或sudo ufw allow 443
FTP在端口21,用于未加密的文件傳輸(您可能不應(yīng)該使用),使用sudo ufw allow ftp或sudo ufw allow 21/tcp
除了指定端口或已知服務(wù)之外,還有其他幾種允許其他連接的方法。
特定端口范圍
您可以使用UFW指定端口范圍。一些應(yīng)用程序使用多個端口,而不是單個端口。 例如,要允許使用端口6000 - 6007 X11連接,請使用以下命令:
sudo ufw allow 6000:6007/tcp
sudo ufw allow 6000:6007/udp
當(dāng)使用UFW指定端口范圍時,必須指定規(guī)則應(yīng)應(yīng)用于的協(xié)議( tcp或udp )。我們以前沒有提到過,因為沒有指定協(xié)議只允許兩個協(xié)議,這在大多數(shù)情況下是OK的。
特定IP地址
使用UFW時,還可以指定IP地址。例如,如果要允許來自特定IP地址(例如工作或家庭IP地址為15.15.15.51 ,則需要指定from ,然后指定IP地址:
sudo ufw allow from 15.15.15.51
您還可以通過添加to any port后面跟端口號to any port指定允許IP地址連接的特定端口。 例如,如果要允許15.15.15.51連接到端口22 (SSH),請使用以下命令:
sudo ufw allow from 15.15.15.51 to any port 22
子網(wǎng)
如果要允許IP地址的子網(wǎng),您可以使用CIDR表示法來指定網(wǎng)絡(luò)掩碼。例如,如果要允許所有的IP地址范圍從15.15.15.1到15.15.15.254您可以使用此命令:
sudo ufw allow from 15.15.15.0/24
同樣,您也可以指定允許子網(wǎng)15.15.15.0/24連接到的目標(biāo)端口。 再次,我們將使用端口22 (SSH)作為示例:
sudo ufw allow from 15.15.15.0/24 to any port 22
sudo ufw allow proto tcp from 46.102.170.86/32 to any port 22
連接到特定的網(wǎng)絡(luò)接口
如果要創(chuàng)建僅適用于特定網(wǎng)絡(luò)接口的防火墻規(guī)則,可以通過指定“allow in on”,然后指定網(wǎng)絡(luò)接口的名稱來實現(xiàn)。 在繼續(xù)之前,您可能需要查找網(wǎng)絡(luò)接口。為此,請使用以下命令:
ip addr xxxx
...
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
...
eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
...
突出顯示的輸出指示網(wǎng)絡(luò)接口名稱。它們通常命名為像eth0或eth1 。 因此,如果您的服務(wù)器有一個名為eth0的公共網(wǎng)絡(luò)接口,您可以使用此命令允許HTTP流量(端口80 ):
sudo ufw allow in on eth0 to any port 80
這樣做將允許您的服務(wù)器從公共Internet接收HTTP請求。 或者,如果您希望您的MySQL數(shù)據(jù)庫服務(wù)器(端口3306 )監(jiān)聽專用網(wǎng)絡(luò)接口eth1上的eth1 ,例如,您可以使用以下命令:
sudo ufw allow in on eth1 to any port 3306
這將允許您的專用網(wǎng)絡(luò)上的其他服務(wù)器連接到您的MySQL數(shù)據(jù)庫。
第6步 - 拒絕連接
如果您尚未更改傳入連接的默認(rèn)策略,則UFW將配置為拒絕所有傳入連接。通常,通過要求創(chuàng)建明確允許特定端口和IP地址通過的規(guī)則,這簡化了創(chuàng)建安全防火墻策略的過程。 但是,有時您會希望根據(jù)源IP地址或子網(wǎng)拒絕特定連接,也許是因為您知道您的服務(wù)器正在從那里受到攻擊。此外,如果您希望將默認(rèn)傳入策略更改為允許 (這對于安全性不推薦),您需要為您不希望允許連接的任何服務(wù)或IP地址創(chuàng)建拒絕規(guī)則。 要編寫拒絕規(guī)則,可以使用上述命令,將allow替換為deny 。 例如,要拒絕HTTP連接,可以使用以下命令:
sudo ufw deny http
或者如果你想拒絕15.15.15.51的所有連接,你可以使用這個命令:
sudo ufw deny from 15.15.15.51
現(xiàn)在讓我們來看看如何刪除規(guī)則。
第7步 - 刪除規(guī)則
了解如何刪除防火墻規(guī)則與知道如何創(chuàng)建它們同樣重要。有兩種不同的方法指定要刪除的規(guī)則:按規(guī)則編號或?qū)嶋H規(guī)則(類似于創(chuàng)建規(guī)則時指定的規(guī)則)。我們將從規(guī)則編號方法開始,因為如果你是UFW的新手,相比編寫要刪除的實際規(guī)則更容易。
按規(guī)則編號
如果您使用規(guī)則編號刪除防火墻規(guī)則,您首先要做的是獲取防火墻規(guī)則列表。 UFW狀態(tài)命令有一個選項,可以顯示每個規(guī)則旁邊的數(shù)字,如下所示:
sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
如果我們決定刪除規(guī)則2,允許端口80(HTTP)連接,我們可以在UFW刪除命令中指定它,如下所示:
sudo ufw delete 2
這將顯示確認(rèn)提示,然后刪除規(guī)則2,它允許HTTP連接。請注意,如果啟用了IPv6,則也要刪除相應(yīng)的IPv6規(guī)則。
按實際規(guī)則
規(guī)則編號的替代方法是指定要刪除的實際規(guī)則。例如,如果要刪除allow http規(guī)則,您可以這樣寫:
sudo ufw delete allow http
您還可以通過allow 80指定規(guī)則,而不是按服務(wù)名稱指定規(guī)則:
sudo ufw delete allow 80
此方法將刪除IPv4和IPv6規(guī)則(如果存在)。
第8步 - 檢查UFW狀態(tài)和規(guī)則
在任何時候,您可以使用此命令檢查UFW的狀態(tài):
sudo ufw status verbose
如果UFW被禁用,默認(rèn)情況下,你會看到這樣:
Status: inactive
如果UFW是活動的,它應(yīng)該是如果你按照第3步,輸出將說它是活動的,它會列出所有設(shè)置的規(guī)則。例如,如果防火墻設(shè)置為允許從任何地方連接SSH(端口22 ),輸出可能如下所示:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
如果要檢查UFW如何配置防火墻,請使用status命令。
第9步 - 禁用或重置UFW(可選)
如果您決定不想使用UFW,可以使用此命令禁用它:
sudo ufw disable
使用UFW創(chuàng)建的任何規(guī)則將不再處于活動狀態(tài)。如果需要稍后激活它,可以總是運行sudo ufw enable 。 如果已配置UFW規(guī)則,但您決定要重新開始,可以使用reset命令:
sudo ufw reset
這將禁用UFW并刪除以前定義的任何規(guī)則。請注意,如果您在任何時間修改默認(rèn)策略,默認(rèn)策略將不會更改為原始設(shè)置。這應(yīng)該給你一個新的開始與UFW。
結(jié)論
您的防火墻現(xiàn)在應(yīng)該配置為允許(至少)SSH連接。請確保允許您的服務(wù)器的任何其他傳入連接,同時限制任何不必要的連接,以便您的服務(wù)器可以正常工作和安全。
如何允許和禁止ping
sudo vim /etc/ufw/before.rules
允許PING
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
禁止ping
-A ufw-before-input -p icmp --icmp-type echo-request -j DROP
只允許固定主機ping
-A ufw-before-input -p icmp --icmp-type echo-request –s xxx.xx.xx.xx -m state --state ESTABLISHED -j ACCEPT
sudo /etc/init.d/ufw force-reload
如果啟用UFW后虛擬機無法PING通,原因可能是
ufw沒有允許ip轉(zhuǎn)發(fā)導(dǎo)致的,編輯/etc/default/ufw允許ip轉(zhuǎn)發(fā)。
vim /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"