什么是防火墻?
防火墻是一種網(wǎng)絡(luò)安全系統(tǒng),它根據(jù)預(yù)定的一組規(guī)則過濾和控制通信量。這是一個(gè)介于設(shè)備和互聯(lián)網(wǎng)之間的中介系統(tǒng)。
注:如果您已經(jīng)了解linux中防火墻的工作,并且只想知道命令,那么請進(jìn)入教程的末尾。
Linux的防火墻是如何工作的:
Linux發(fā)行版的大多數(shù)附帶默認(rèn)防火墻工具,可以用來配置它們。我們將使用Linux中提供的默認(rèn)工具“iptablees”來建立防火墻。Iptable用于在Linux內(nèi)核中設(shè)置、維護(hù)和檢查IPv 4和IPv 6數(shù)據(jù)包過濾規(guī)則的表。
注-以下所有命令都需要sudo特權(quán)。
鏈?zhǔn)菫樘囟ㄈ蝿?wù)定義的一組規(guī)則。我們有三條用于處理流量的鏈:輸入鏈,輸出鏈,前向鏈
1.輸入鏈
從互聯(lián)網(wǎng)(網(wǎng)絡(luò))到本地機(jī)器的任何流量都必須通過輸入鏈。這意味著它們必須遍歷輸入鏈中設(shè)置的所有規(guī)則。
2.輸出鏈
從本地機(jī)器到互聯(lián)網(wǎng)的任何流量都需要通過輸出鏈。
3.前向鏈
從外部網(wǎng)絡(luò)到另一個(gè)網(wǎng)絡(luò)的任何流量都需要通過前向鏈。當(dāng)兩臺(tái)或兩臺(tái)以上的計(jì)算機(jī)連接在一起,并且我們希望在它們之間發(fā)送數(shù)據(jù)時(shí),就使用它。
Iptable可以對流量執(zhí)行三個(gè)操作:接受,下降,拒絕
1.接受
當(dāng)流量傳遞其指定鏈中的規(guī)則時(shí),iptable將接受該通信量。
這意味著它打開了大門,允許這個(gè)人進(jìn)入王國。
2.下降
當(dāng)流量無法傳遞其指定鏈中的規(guī)則時(shí),iptable將阻塞該通信量。
這意味著防火墻關(guān)閉了。
3.拒絕
此類型的操作類似于DROP操作,但它向通信量的發(fā)送方發(fā)送一條消息,說明數(shù)據(jù)傳輸失敗。
通常情況下,當(dāng)您希望另一端知道端口是不可訪問的時(shí),請使用拒絕。‘使用DROP連接到您不希望別人看到的主機(jī)。
注:你需要記住一個(gè)簡單的規(guī)則:您在iptable中設(shè)置的規(guī)則將從最上面的規(guī)則到底部進(jìn)行檢查。無論何時(shí)數(shù)據(jù)包通過任何頂級(jí)規(guī)則,它都可以通過防火墻。不檢查較低的規(guī)則。所以在制定規(guī)則時(shí)要小心。
基本iptables命令:.列出iptable的現(xiàn)行規(guī)則:列出當(dāng)前iptable的規(guī)則:
sudo iptables -L
這個(gè)輸出量將是:
正如您所看到的,我們有三條鏈(輸入、向前、輸出)。我們也可以看到列標(biāo)題,但它們不是實(shí)際的規(guī)則。這是因?yàn)榇蠖鄶?shù)Linux都沒有預(yù)定義的規(guī)則。
讓我們看看每一列的含義。
Target:這定義了需要對數(shù)據(jù)包執(zhí)行哪些操作(接受、丟棄等)
Prot:這定義了數(shù)據(jù)包的協(xié)議(TCP,IP)。
source:這將告訴包的源地址。
destination:這定義了數(shù)據(jù)包的目標(biāo)地址。
2.明確規(guī)則:
如果您想清除/清除所有現(xiàn)有規(guī)則。運(yùn)行以下命令:
sudo iptables -F
這將重置iptables。
3.改變鏈條的默認(rèn)政策:
sudo iptables -P Chain_name Action_to_be_taken
正如您在上面的圖片中所看到的,每個(gè)鏈的默認(rèn)策略是接受。
例如:–
如果您看到前向鏈,您將看到“鏈?zhǔn)睫D(zhuǎn)發(fā)(策略接受)”,這意味著您的計(jì)算機(jī)允許將任何通信量轉(zhuǎn)發(fā)到另一臺(tái)計(jì)算機(jī)。
為了改變轉(zhuǎn)發(fā)的政策以減少:
sudo iptables -P FORWARD DROP
上述命令將停止通過系統(tǒng)轉(zhuǎn)發(fā)的任何通信量。這意味著沒有其他系統(tǒng)可以作為中介傳遞數(shù)據(jù)。
制定你的第一條規(guī)則:
1.執(zhí)行一項(xiàng)中止規(guī)則:
現(xiàn)在我們將開始構(gòu)建防火墻策略,我們將首先在輸入鏈上工作,因?yàn)檩斎氲牧髁繉⑼ㄟ^輸入鏈。
語法:-
sudo iptables -A/-I chain_name -s source_ip -j action_to_take
我們要來理解這個(gè)話題。
假設(shè)我們想阻止來自IP地址192.168.1.3的通信量。可以使用以下命令:
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
這可能看上去很復(fù)雜,但當(dāng)我們仔細(xì)研究組件時(shí),大部分內(nèi)容都是有意義的:-
A INPUT:
標(biāo)志-A用于將規(guī)則附加到鏈的末尾。命令的這一部分告訴iptable,我們希望在輸入鏈的末尾添加一個(gè)規(guī)則。
I INPUT:
在此標(biāo)志中,規(guī)則被添加到鏈的頂部。
-S192.168.1.3:-
標(biāo)志-s用于指定數(shù)據(jù)包的源。這告訴iptable查找來自源192.168.1.3的數(shù)據(jù)包。
-j Drop
這指定了iptable應(yīng)該如何處理數(shù)據(jù)包。
簡而言之,上面的命令在輸入鏈中添加了一條規(guī)則,即如果任何數(shù)據(jù)包到達(dá)其源地址為192.168.1.3,則丟棄該數(shù)據(jù)包,這意味著不允許數(shù)據(jù)包到達(dá)計(jì)算機(jī)。
執(zhí)行上述命令后,可以使用以下命令查看更改:-
sudo iptables -L
這個(gè)輸出量將是:-
2.執(zhí)行接受規(guī)則:
如果要向網(wǎng)絡(luò)的特定端口添加規(guī)則,則可以使用以下命令。
語法:
sudo iptables -A/-I chain_name -s source_ip -p protocol_name --dport port_number -j Action_to_take
-p協(xié)議名稱:-
此選項(xiàng)用于匹配遵循協(xié)議名稱的數(shù)據(jù)包。
-p protocol_name:
只有當(dāng)您給出-p protocol_name選項(xiàng)時(shí),才能使用此選項(xiàng)。它指定查找到端口“port_number”的數(shù)據(jù)包。
例子:
假設(shè)我們希望保持SSH端口打開(在本指南中假設(shè)默認(rèn)SSH端口是22),在上述情況下,我們阻止了192.168.1.3網(wǎng)絡(luò)。也就是說,我們只想允許那些來自192.168.1.3的數(shù)據(jù)包,而這些包想進(jìn)入端口22。
我們該怎么辦:
讓我們試試下面的命令:
sudo iptables -A INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT
上面的命令表示查找來自IP地址192.168.1.3的數(shù)據(jù)包,該數(shù)據(jù)包具有TCP協(xié)議,并且誰想在我的計(jì)算機(jī)的端口22上傳遞一些東西。如果你找到了這些包,然后接受它們。
這個(gè)輸出量命令是:-
但是,上面的命令有一個(gè)問題。它實(shí)際上不允許數(shù)據(jù)包。你能猜到是什么嗎?
提示:-它與訪問規(guī)則的方式有關(guān)。
請記住,正如我們前面所討論的,您在iptables中設(shè)置的規(guī)則是從上到下檢查的。無論何時(shí)將數(shù)據(jù)包處理到頂級(jí)規(guī)則之一,都不會(huì)使用較低的規(guī)則進(jìn)行檢查。
好吧!答案是:
在我們的例子中,數(shù)據(jù)包是用最上面的規(guī)則檢查的,該規(guī)則規(guī)定,iptable必須丟棄192.168.1.3中的任何數(shù)據(jù)包。因此,一旦通過這個(gè)規(guī)則訪問了數(shù)據(jù)包,它就不會(huì)進(jìn)入允許分組到端口22的下一個(gè)規(guī)則。因此失敗了。
又能做些什么呢?
最簡單的答案是,將規(guī)則添加到鏈的頂部。你要做的就是把-A選項(xiàng)改為-I選項(xiàng)。
這樣做的命令是:-
sudo iptables -I INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT
現(xiàn)在使用-L命令檢查iptable配置。產(chǎn)出如下:
因此,來自192.168.1.3的任何數(shù)據(jù)包都會(huì)首先檢查是否到達(dá)端口22,如果不是,則檢查
在鏈中的下一個(gè)規(guī)則中運(yùn)行。否則它可以通過防火墻。
現(xiàn)在您已經(jīng)了解了如何阻止和接受傳入的通信量,下面讓我們看看如何刪除規(guī)則:
3.從iptable中刪除一條規(guī)則:
語法:
sudo iptables -D chain_name rule_number
例子:
如果我們要?jiǎng)h除接受到端口22的通信并在前一節(jié)中添加的規(guī)則,那么:-
sudo iptables -D INPUT 1
記住規(guī)則號(hào)從1開始
這個(gè)輸出量 :
4.保存配置:
如果要在不是服務(wù)器的個(gè)人計(jì)算機(jī)上實(shí)現(xiàn)此部分,則此部分是不必要的,但如果您正在服務(wù)器上實(shí)現(xiàn)防火墻,那么您的服務(wù)器很可能會(huì)損壞,并且你可能會(huì)丟失你所有的數(shù)據(jù)。所以,保存配置總是更好的。
有很多方法可以做到這一點(diǎn),但我發(fā)現(xiàn)的最簡單的方法是Iptable-持久性包裹。您可以從Ubuntu的默認(rèn)存儲(chǔ)庫下載該包:
sudo apt-get update
sudo apt-get install iptables-persistent
安裝完成后,可以使用以下命令保存配置:-
sudo invoke-rc.d iptables-persistent save
本教程到此結(jié)束。
讓我們簡要介紹到目前為止學(xué)到的所有命令:-
1.列出國際表的現(xiàn)行規(guī)則:sudo iptables -L
2.若要更改默認(rèn)策略,請執(zhí)行以下操作:sudo iptables -P Chain_name Action_to_be_taken
例子:
sudo iptables -P FORWARD DROP
3.清除/沖洗所有規(guī)則sudo iptables -F
4.在鏈尾附加一條規(guī)則:sudo iptables -A
5.在鏈的開頭附加一條規(guī)則:sudo iptables -I
6.執(zhí)行一項(xiàng)接受規(guī)則:sudo iptables -A/-I chain_name -s source_ip -j action_to_take
例子:
iptables -A INPUT -s 192.168.1.3 -j ACCEPT
7.執(zhí)行一項(xiàng)中止規(guī)則:sudo iptables -A/-I chain_name -s source_ip -j action_to_take
例子:-
iptables -A INPUT -s 192.168.1.3 -j DROP
8.關(guān)于具體港口/議定書的執(zhí)行規(guī)則:sudo iptables -A/-I chain_name -s source_ip -p protocol_name --dport port_number -j Action_to_take
例子:
sudo iptables -I INPUT -s 192.168.1.3 -p tcp --dport 22 -j ACCEPT
9.刪除一項(xiàng)規(guī)則:sudo iptables -D chain_name rule_number
例子:
sudo iptables -D INPUT 1
10.保存配置:sudo invoke-rc.d iptables-persistent save
本教程到此結(jié)束。我們已經(jīng)看到了在本地計(jì)算機(jī)上實(shí)現(xiàn)防火墻所需的所有必要命令。我們還可以讓防火墻執(zhí)行其他各種操作,但不可能在一篇文章中涵蓋所有這些操作。