摘要:防火墻根據(jù)一組規(guī)則檢查這些頭,以確定接受哪個(gè)信息包以及拒絕哪個(gè)信息包。我們將該過(guò)程稱為信息包過(guò)濾。雖然信息包過(guò)濾系統(tǒng)被稱為單個(gè)實(shí)體,但它實(shí)際上由兩個(gè)組件和組成。處理出站信息包的規(guī)則被添加到鏈中。
本文部分內(nèi)容節(jié)選自:netfilter/iptables 簡(jiǎn)介 - IBM developerWorks0x00 Linux 安全性和 netfilter/iptables
Linux 因其健壯性、可靠性、靈活性以及好象無(wú)限范圍的可定制性而在 IT 業(yè)界變得非常受歡迎。Linux 具有許多內(nèi)置的能力, 使開(kāi)發(fā)人員可以根據(jù)自己的需要定制其工具、行為和外觀,而無(wú)需昂貴的第三方工具。 如果 Linux 系統(tǒng)連接到因特網(wǎng)或 LAN、服務(wù)器或連接 LAN 和因特網(wǎng)的代理服務(wù)器, 所要用到的一種內(nèi)置能力就是針對(duì)網(wǎng)絡(luò)上 Linux 系統(tǒng)的防火墻配置。 可以在 netfilter/iptables IP 信息包過(guò)濾系統(tǒng)(它集成在 2.4.x 版本的 Linux 內(nèi)核中)的幫助下運(yùn)用這種能力。
在如 ipfwadm和 ipchains 這樣的 Linux 信息包過(guò)濾解決方案中,netfilter/iptables IP 信息包過(guò)濾系統(tǒng)是最新的解決方案, 而且也是第一個(gè)集成到 Linux 內(nèi)核的解決方案。 對(duì)于 Linux 系統(tǒng)管理員、網(wǎng)絡(luò)管理員以及家庭用戶(他們 想要根據(jù)自己特定的需求來(lái)配置防火墻、在防火墻解決方案上節(jié)省費(fèi)用和對(duì) IP 信息包過(guò)濾具有完全控制權(quán))來(lái)說(shuō),netfilter/iptables 系統(tǒng)十分理想。
0x01 理解防火墻配置和信息包過(guò)濾對(duì)于連接到網(wǎng)絡(luò)上的 Linux 系統(tǒng)來(lái)說(shuō),防火墻是必不可少的防御機(jī)制, 它只允許合法的網(wǎng)絡(luò)流量進(jìn)出系統(tǒng),而禁止其它任何網(wǎng)絡(luò)流量。為了確定網(wǎng)絡(luò)流量是否合法, 防火墻依靠它所包含的由網(wǎng)絡(luò)或系統(tǒng)管理員預(yù)定義的一組 規(guī)則。 這些規(guī)則告訴防火墻某個(gè)流量是否合法以及對(duì)于來(lái)自某個(gè)源、至某個(gè)目的地或具有某種協(xié)議類型的網(wǎng)絡(luò)流量要做些什么。 術(shù)語(yǔ)“配置防火墻”是指添加、修改和除去這些規(guī)則。稍后,我將詳細(xì)討論這些規(guī)則。
網(wǎng)絡(luò)流量由 IP 信息包(或,簡(jiǎn)稱 信息包)— 以流的形式從源系統(tǒng)傳輸?shù)侥康牡叵到y(tǒng)的一些小塊數(shù)據(jù) — 組成。 這些信息包有頭,即在每個(gè)包前面所附帶的一些數(shù)據(jù)位,它們包含有關(guān)信息包的源、目的地和協(xié)議類型的信息。 防火墻根據(jù)一組規(guī)則檢查這些頭,以確定接受哪個(gè)信息包以及拒絕哪個(gè)信息包。我們將該過(guò)程稱為信息包過(guò)濾。
0x02 為什么要配置自己的防火墻?出于各種因素和原因,需要根據(jù)特定需求來(lái)配置防火墻。 或許,最重要的原因是安全性。
管理員可能想讓他們的防火墻能夠阻止未經(jīng)授權(quán)的源訪問(wèn)其 Linux 系統(tǒng),例如通過(guò) Telnet。 他們可能還想限制進(jìn)出其系統(tǒng)的網(wǎng)絡(luò)流量,以便只有來(lái)自可信源的流量才可以進(jìn)入其系統(tǒng),以及只有授權(quán)的流量才可以出去。 家庭用戶可能通過(guò)允許所有的出站信息包都可以通過(guò),將防火墻配置成較低的安全性級(jí)別。
另一個(gè)背后的原因是,通過(guò)阻塞來(lái)自類似廣告站點(diǎn)之類的源的多余流量,可以節(jié)省帶寬。
因而,可以定制防火墻配置來(lái)滿足任何特定需求和任何安全性級(jí)別需求。 這就是 netfilter/iptables 系統(tǒng)的用武之處。
0x03 netfilter/iptables 系統(tǒng)是如何工作的?netfilter/iptables IP 信息包過(guò)濾系統(tǒng)是一種功能強(qiáng)大的工具, 可用于添加、編輯和除去規(guī)則,這些規(guī)則是在做信息包過(guò)濾決定時(shí),防火墻所遵循和組成的規(guī)則。這些規(guī)則存儲(chǔ)在專用的信息包過(guò)濾表中, 而這些表集成在 Linux 內(nèi)核中。 在信息包過(guò)濾表中,規(guī)則被分組放在我們所謂的鏈(chain)中。我馬上會(huì)詳細(xì)討論這些規(guī)則以及如何建立這些規(guī)則并將它們分組在鏈中。
雖然 netfilter/iptables IP 信息包過(guò)濾系統(tǒng)被稱為單個(gè)實(shí)體,但它實(shí)際上由兩個(gè)組件 netfilter和 iptables 組成。
netfilter 組件也稱為 內(nèi)核空間(kernelspace),是內(nèi)核的一部分,由一些信息包過(guò)濾表組成, 這些表包含內(nèi)核用來(lái)控制信息包過(guò)濾處理的規(guī)則集。
iptables 組件是一種工具,也稱為 用戶空間(userspace),它使插入、修改和除去信息包過(guò)濾表中的規(guī)則變得容易。 除非您正在使用 Red Hat Linux 7.1 或更高版本,否則需要從 netfilter.org 下載該工具并安裝使用它。
通過(guò)使用用戶空間,可以構(gòu)建自己的定制規(guī)則,這些規(guī)則存儲(chǔ)在內(nèi)核空間的信息包過(guò)濾表中。 這些規(guī)則具有 目標(biāo),它們告訴內(nèi)核對(duì)來(lái)自某些源、前往某些目的地或具有某些協(xié)議類型的信息包做些什么。 如果某個(gè)信息包與規(guī)則匹配,那么使用目標(biāo) ACCEPT 允許該信息包通過(guò)。還可以使用目標(biāo) DROP 或 REJECT 來(lái)阻塞并殺死信息包。對(duì)于可對(duì)信息包執(zhí)行的其它操作,還有許多其它目標(biāo)。
根據(jù)規(guī)則所處理的信息包的類型,可以將規(guī)則分組在鏈中。處理入站信息包的規(guī)則被添加到 INPUT 鏈中。處理出站信息包的規(guī)則被添加到 OUTPUT 鏈中。處理正在轉(zhuǎn)發(fā)的信息包的規(guī)則被添加到 FORWARD 鏈中。這三個(gè)鏈?zhǔn)腔拘畔^(guò)濾表中內(nèi)置的缺省主鏈。 另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING ), 以及提供用戶定義的鏈。每個(gè)鏈都可以有一個(gè)策略, 它定義“缺省目標(biāo)”,也就是要執(zhí)行的缺省操作,當(dāng)信息包與鏈中的任何規(guī)則都不匹配時(shí),執(zhí)行此操作。
建立規(guī)則并將鏈放在適當(dāng)?shù)奈恢弥?,就可以開(kāi)始進(jìn)行真正的信息包過(guò)濾工作了。 這時(shí)內(nèi)核空間從用戶空間接管工作。當(dāng)信息包到達(dá)防火墻時(shí),內(nèi)核先檢查信息包的頭信息,尤其是信息包的目的地。 我們將這個(gè)過(guò)程稱為 路由。
如果信息包源自外界并前往系統(tǒng),而且防火墻是打開(kāi)的,那么內(nèi)核將它傳遞到內(nèi)核空間信息包過(guò)濾表的 INPUT 鏈。如果信息包源自系統(tǒng)內(nèi)部或系統(tǒng)所連接的內(nèi)部網(wǎng)上的其它源,并且此信息包要前往另一個(gè)外部系統(tǒng), 那么信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統(tǒng)并前往外部系統(tǒng)的信息包被傳遞到 FORWARD 鏈。
接下來(lái),將信息包的頭信息與它所傳遞到的鏈中的每條規(guī)則進(jìn)行比較,看它是否與某條規(guī)則完全匹配。 如果信息包與某條規(guī)則匹配,那么內(nèi)核就對(duì)該信息包執(zhí)行由該規(guī)則的目標(biāo)指定的操作。 但是,如果信息包與這條規(guī)則不匹配,那么它將與鏈中的下一條規(guī)則進(jìn)行比較。 最后,如果信息包與鏈中的任何規(guī)則都不匹配,那么內(nèi)核將參考該鏈的策略來(lái)決定如何處理該信息包。 理想的策略應(yīng)該告訴內(nèi)核 DROP 該信息包。
0x04 建立規(guī)則和鏈通過(guò)向防火墻提供有關(guān)對(duì)來(lái)自某個(gè)源、到某個(gè)目的地或具有特定協(xié)議類型的信息包要做些什么的指令,規(guī)則控制信息包的過(guò)濾。 通過(guò)使用 netfilter/iptables 系統(tǒng)提供的特殊命令 iptables ,建立這些規(guī)則,并將其添加到內(nèi)核空間的特定信息包過(guò)濾表內(nèi)的鏈中。關(guān)于添加/除去/編輯規(guī)則的命令的一般語(yǔ)法如下:
iptables [-t table] command [match] [target]0x05 表(table)
[-t table] 選項(xiàng)允許使用標(biāo)準(zhǔn)表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過(guò)濾表。 有三種可用的表選項(xiàng): filter 、 nat 和 mangle 。該選項(xiàng)不是必需的,如果未指定, 則 filter 用作缺省表。
filter 表用于一般的信息包過(guò)濾,它包含 INPUT 、 OUTPUT 和 FORWARD 鏈。nat 表用于要轉(zhuǎn)發(fā)的信息包,它包含 PREROUTING 、 OUTPUT 和 POSTROUTING 鏈。 如果信息包及其頭內(nèi)進(jìn)行了任何更改,則使用 mangle 表。 該表包含一些規(guī)則來(lái)標(biāo)記用于高級(jí)路由的信息包,該表包含 PREROUTING 和 OUTPUT 鏈。
注:PREROUTING 鏈由指定信息包一到達(dá)防火墻就改變它們的規(guī)則所組成,而 POSTROUTING 鏈由指定正當(dāng)信息包打算離開(kāi)防火墻時(shí)改變它們的規(guī)則所組成。
0x06 命令(command)上面這條命令中具有強(qiáng)制性的 command 部分是 iptables 命令的最重要部分。 它告訴 iptables 命令要做什么,例如,插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。 以下是最常用的一些命令:
-A 或 --append : 該命令將一條規(guī)則附加到鏈的末尾。
示例:
iptables -A INPUT -s 205.168.0.1 -j ACCEPT
該示例命令將一條規(guī)則附加到 INPUT 鏈的末尾,確定來(lái)自源地址 205.168.0.1 的信息包可以 ACCEPT 。
-D 或 --delete : 通過(guò)用 -D 指定要匹配的規(guī)則或者指定規(guī)則在鏈中的位置編號(hào),該命令從鏈中刪除該規(guī)則。 下面的示例顯示了這兩種方法。
示例:
iptables -D INPUT --dport 80 -j DROP iptables -D OUTPUT 3
第一條命令從 INPUT 鏈刪除規(guī)則,它指定 DROP 前往端口 80 的信息包。第二條命令只是從 OUTPUT 鏈刪除編號(hào)為 3 的規(guī)則。
-P 或 --policy : 該命令設(shè)置鏈的缺省目標(biāo),即策略。 所有與鏈中任何規(guī)則都不匹配的信息包都將被強(qiáng)制使用此鏈的策略。
示例:
iptables -P INPUT DROP
該命令將 INPUT 鏈的缺省目標(biāo)指定為 DROP 。這意味著,將丟棄所有與 INPUT 鏈中任何規(guī)則都不匹配的信息包。
-N 或 --new-chain : 用命令中所指定的名稱創(chuàng)建一個(gè)新鏈。
示例:
iptables -N allowed-chain
-F 或 --flush : 如果指定鏈名,該命令刪除鏈中的所有規(guī)則, 如果未指定鏈名,該命令刪除所有鏈中的所有規(guī)則。此參數(shù)用于快速清除。
示例:
iptables -F FORWARD iptables -F
-X 或 --delete-chain : 如果指定鏈名,該命令刪除這條自定義的鏈, 如果未指定鏈名,該命令刪除所有自定義的鏈。此參數(shù)用于快速清除所有自定義的鏈,當(dāng)然,默認(rèn)的鏈無(wú)法刪除。
示例:
iptables -X MY_OWN_INPUT iptables -X
-L 或 --list : 列出指定鏈中的所有規(guī)則。
示例:
iptables -L allowed-chain0x07 匹配(match)
iptables 命令的可選 match 部分指定信息包與規(guī)則匹配所應(yīng)具有的特征(如源和目的地地址、協(xié)議等)。 匹配分為兩大類: 通用匹配和特定于協(xié)議的匹配。這里,我將研究可用于采用任何協(xié)議的信息包的通用匹配。 下面是一些重要的且常用的通用匹配及其示例和說(shuō)明:
-p 或 --protocol : 該通用協(xié)議匹配用于檢查某些特定協(xié)議。 協(xié)議示例有 TCP 、 UDP 、 ICMP 、用逗號(hào)分隔的任何這三種協(xié)議的組合列表以及 ALL (用于所有協(xié)議)。 ALL 是缺省匹配??梢允褂?! 符號(hào),它表示不與該項(xiàng)匹配。
示例:
iptables -A INPUT -p TCP, UDP iptables -A INPUT -p ! ICMP
在上述示例中,這兩條命令都執(zhí)行同一任務(wù) — 它們指定所有 TCP 和 UDP 信息包都將與該規(guī)則匹配。 通過(guò)指定 ! ICMP ,我們打算允許所有其它協(xié)議(在這種情況下是 TCP 和 UDP ), 而將 ICMP 排除在外。
-s 或 --source : 該源匹配用于根據(jù)信息包的源 IP 地址來(lái)與它們匹配。該匹配還允許對(duì)某一范圍內(nèi)的 IP 地址進(jìn)行匹配,可以使用 ! 符號(hào),表示不與該項(xiàng)匹配。缺省源匹配與所有 IP 地址匹配。
示例:
iptables -A OUTPUT -s 192.168.1.1 iptables -A OUTPUT -s 192.168.0.0/24 iptables -A OUTPUT -s ! 203.16.1.89
第二條命令指定該規(guī)則與所有來(lái)自 192.168.0.0 到 192.168.0.24 的 IP 地址范圍的信息包匹配。第三條命令指定該規(guī)則將與 除來(lái)自源地址 203.16.1.89 外的任何信息包匹配。
-d 或 --destination : 該目的地匹配用于根據(jù)信息包的目的地 IP 地址來(lái)與它們匹配。 該匹配還允許對(duì)某一范圍內(nèi) IP 地址進(jìn)行匹配,可以使用 ! 符號(hào),表示不與該項(xiàng)匹配。
示例:
iptables -A INPUT -d 192.168.1.1 iptables -A INPUT -d 192.168.0.0/24 iptables -A OUTPUT -d ! 203.16.1.890x08 目標(biāo)(target)
我們已經(jīng)知道,目標(biāo)是由規(guī)則指定的操作,對(duì)與那些規(guī)則匹配的信息包執(zhí)行這些操作。 除了允許用戶定義的目標(biāo)之外,還有許多可用的目標(biāo)選項(xiàng)。下面是常用的一些目標(biāo)及其示例和說(shuō)明:
ACCEPT : 當(dāng)信息包與具有 ACCEPT 目標(biāo)的規(guī)則完全匹配時(shí), 會(huì)被接受(允許它前往目的地),并且它將停止遍歷鏈(雖然該信息包可能遍歷另一個(gè)表中的其它鏈,并且有可能在那里被丟棄)。 該目標(biāo)被指定為 -j ACCEPT 。
DROP : 當(dāng)信息包與具有 DROP 目標(biāo)的規(guī)則完全匹配時(shí),會(huì)阻塞該信息包,并且不對(duì)它做進(jìn)一步處理。 該目標(biāo)被指定為 -j DROP 。
REJECT : 該目標(biāo)的工作方式與 DROP 目標(biāo)相同,但它比 DROP 好。和 DROP 不同, REJECT 不會(huì)在服務(wù)器和客戶機(jī)上留下死套接字。 另外, REJECT 將錯(cuò)誤消息發(fā)回給信息包的發(fā)送方。該目標(biāo)被指定為 -j REJECT 。
示例:
iptables -A FORWARD -p TCP --dport 22 -j REJECT
RETURN : 在規(guī)則中設(shè)置的 RETURN 目標(biāo)讓與該規(guī)則匹配的信息包停止遍歷包含該規(guī)則的鏈。 如果鏈?zhǔn)侨?INPUT 之類的主鏈,則使用該鏈的缺省策略處理信息包。 它被指定為 -jump RETURN 。示例:
iptables -A FORWARD -d 203.16.1.89 -jump RETURN
還有許多用于建立高級(jí)規(guī)則的其它目標(biāo),如 LOG 、 REDIRECT 、 MARK 、 MIRROR 和 MASQUERADE 等。
0x09 保存規(guī)則現(xiàn)在,您已經(jīng)學(xué)習(xí)了如何建立基本的規(guī)則和鏈以及如何從信息包過(guò)濾表中添加或刪除它們。 但是,您應(yīng)該記住:用上述方法所建立的規(guī)則會(huì)被保存到內(nèi)核中,當(dāng)重新引導(dǎo)系統(tǒng)時(shí),會(huì)丟失這些規(guī)則。 所以,如果您將沒(méi)有錯(cuò)誤的且有效的規(guī)則集添加到信息包過(guò)濾表,同時(shí)希望在重新引導(dǎo)之后再次使用這些規(guī)則, 那么必須將該規(guī)則集保存在文件中。可以使用 iptables-save命令來(lái)做到這一點(diǎn):
iptables-save > iptables-script
現(xiàn)在,信息包過(guò)濾表中的所有規(guī)則都被保存在文件 iptables-script 中。無(wú)論何時(shí)再次引導(dǎo)系統(tǒng), 都可以使用 iptables-restore 命令將規(guī)則集從該腳本文件恢復(fù)到信息包過(guò)濾表,如下所示:
iptables-restore iptables-script
如果您愿意在每次引導(dǎo)系統(tǒng)時(shí)自動(dòng)恢復(fù)該規(guī)則集,則可以將上面指定的這條命令放到任何一個(gè)初始化 shell 腳本中。
0x0A 僅使用包過(guò)濾的困境在FTP服務(wù)中,有主動(dòng)方式和被動(dòng)方式之分。其中主動(dòng)模式比較簡(jiǎn)單,在主動(dòng)方式中,F(xiàn)TP使用21和20端口,其中21端口用于傳輸控制指令,而20端口用于傳輸數(shù)據(jù),主動(dòng)方式所有報(bào)文都需要在20端口排隊(duì)發(fā)送或者接收,這樣就限制了服務(wù)器的并發(fā)性能;而被動(dòng)方式中,F(xiàn)TP服務(wù)器會(huì)通過(guò)PASV命令通告客戶端開(kāi)放的端口(一般是一個(gè)大端口號(hào)),然后客戶端就來(lái)連接。
這樣一來(lái)就出現(xiàn)了一個(gè)問(wèn)題,因?yàn)橐话闱闆r下iptables是針對(duì)端口進(jìn)行的防火墻包過(guò)濾。如果想使用FTP的被動(dòng)方式,服務(wù)器就需要開(kāi)放所有1024以上端口,否則客戶端的連接會(huì)被DROP掉,這樣就會(huì)變得不安全。但是如果不使用被動(dòng)方式的話,主動(dòng)方式的傳輸速率實(shí)在是太慢了。這類問(wèn)題是iptables包過(guò)濾無(wú)法解決的問(wèn)題。
舉個(gè)例子,我們首先將iptables在INPUT鏈和OUTPUT鏈的默認(rèn)策略都設(shè)置為DROP:
iptables -P INPUT DROP iptables -P OUTPUT DROP
然后我們開(kāi)放FTP服務(wù)器的21和20端口:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
這樣一來(lái),就可以使用FTP的主動(dòng)方式來(lái)傳輸數(shù)據(jù),我們使用FileZilla來(lái)連接這個(gè)FTP服務(wù)器(位于10.128.0.1):
狀態(tài): 正在連接 10.128.0.1:21... 狀態(tài): 連接建立,等待歡迎消息... 狀態(tài): 不安全的服務(wù)器,不支持 FTP over TLS。 狀態(tài): 服務(wù)器不支持非 ASCII 字符。 狀態(tài): 已登錄 狀態(tài): 開(kāi)始上傳 /Users/xiaolulwr/Documents/CAUC-Tec-Markdown/Linux/深入理解iptables防火墻.md 狀態(tài): 文件傳輸成功,傳輸了 16,532 字節(jié) (用時(shí)1 秒) 狀態(tài): 讀取“/root”的目錄列表... 狀態(tài): 計(jì)算服務(wù)器時(shí)差... 狀態(tài): 列出“/root”的目錄成功
但是一旦我們切換到被動(dòng)方式,就無(wú)法進(jìn)行數(shù)據(jù)傳輸:
狀態(tài): 正在連接 10.128.0.1:21... 狀態(tài): 連接建立,等待歡迎消息... 狀態(tài): 不安全的服務(wù)器,不支持 FTP over TLS。 狀態(tài): 服務(wù)器不支持非 ASCII 字符。 狀態(tài): 已登錄 狀態(tài): 讀取目錄列表... 命令: PWD 響應(yīng): 257 "/root" 命令: TYPE I 響應(yīng): 200 Switching to Binary mode. 命令: PASV 響應(yīng): 227 Entering Passive Mode (10,128,0,1,230,163) 命令: LIST 錯(cuò)誤: 目錄列表被用戶終止
當(dāng)我們使用PASV嘗試切換到被動(dòng)模式之后,切換是可以成功的,但是切換之后再進(jìn)行操作就無(wú)法成功了,原因也很好理解,因?yàn)槌岁P(guān)于20和21端口之外的報(bào)文都被DROP了。
0x0B 狀態(tài)檢查為了解決上面的情況,解決方式就是使用iptables的狀態(tài)檢查功能。
狀態(tài)檢查功能,是指iptables除了可以按照IP地址、端口號(hào)、協(xié)議類型等條件對(duì)報(bào)文進(jìn)行過(guò)濾之外,還具有一定的對(duì)報(bào)文的傳輸狀態(tài)進(jìn)行檢查的功能,也就是說(shuō),iptables可以識(shí)別哪些報(bào)文屬于新產(chǎn)生的連接,哪些報(bào)文屬于伴隨連接。在FTP的被動(dòng)模式中,PASV協(xié)商之后,F(xiàn)TP服務(wù)器將通過(guò)一個(gè)大的隨機(jī)端口和客戶端通信,這些報(bào)文就是FTP控制連接的伴隨連接的報(bào)文。這些報(bào)文不是平白無(wú)故產(chǎn)生的,如果沒(méi)有之前的FTP控制連接,就不會(huì)產(chǎn)生這些連接和報(bào)文。如果黑客想直接連接到大的端口上的話,這些連接就屬于新連接。這樣一來(lái),就不必開(kāi)放所有大于1024的端口,同時(shí)也可以允許FTP的被動(dòng)方式了。
我們?cè)谏鲜雠渲靡?guī)則之外,再配置下面的規(guī)則:
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
上面規(guī)則的意思是,在iptables的INPUT和OUTPUT鏈上,允許ESTABLISHED和RELATED狀態(tài)的TCP報(bào)文,那么何為連接狀態(tài)呢?下面介紹四種連接的狀態(tài):
ESTABLISHED:第一個(gè)成功穿越防火墻的報(bào)文之后所有的報(bào)文;
NEW:一個(gè)連接的第一個(gè)報(bào)文,例如TCP連接中的SYN報(bào)文;
RELATED:伴隨連接的報(bào)文,即某個(gè)已經(jīng)處于ESTABLISHED的連接所產(chǎn)生的報(bào)文,這些報(bào)文不屬于第一條連接,但是的確是由第一條連接產(chǎn)生的;
INVALID:無(wú)法判斷狀態(tài)的報(bào)文。
當(dāng)然值得注意的是,iptables的這種狀態(tài)檢查不是十分智能的,它只能識(shí)別到運(yùn)輸層的伴隨連接,也就是說(shuō),對(duì)于FTP的協(xié)議伴隨連接,這種方式并不能很好的進(jìn)行檢查。
在配置之后,就可以正常使用被動(dòng)方式了:
狀態(tài): 正在連接 10.128.0.1:21... 狀態(tài): 連接建立,等待歡迎消息... 狀態(tài): 不安全的服務(wù)器,不支持 FTP over TLS。 狀態(tài): 服務(wù)器不支持非 ASCII 字符。 狀態(tài): 已登錄 狀態(tài): 開(kāi)始上傳 /Users/xiaolulwr/Documents/CAUC-Personal/個(gè)人博客/ssl.txt 狀態(tài): 文件傳輸成功,傳輸了 3,550 字節(jié) (用時(shí)1 秒) 狀態(tài): 讀取“/root”的目錄列表... 狀態(tài): 列出“/root”的目錄成功 狀態(tài): 開(kāi)始下載 /root/ssl.txt 狀態(tài): 文件傳輸成功,傳輸了 3,550 字節(jié) (用時(shí)1 秒) 狀態(tài): 已從服務(wù)器斷開(kāi)0x0C 高級(jí)狀態(tài)檢查 0x0D 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)可以解決IPv4地址不足的問(wèn)題,使用NAT之后,局域網(wǎng)可以對(duì)廣域網(wǎng)隱藏內(nèi)部的細(xì)節(jié),讓整個(gè)局域網(wǎng)在廣域網(wǎng)上只表現(xiàn)為一個(gè)IP地址,這項(xiàng)技術(shù)廣泛應(yīng)用于企業(yè)網(wǎng)絡(luò)、校園網(wǎng)絡(luò)以及運(yùn)營(yíng)商的網(wǎng)絡(luò),因?yàn)椴⒉皇撬杏脩舳夹枰粋€(gè)廣域網(wǎng)的地址,他們只需要一個(gè)私有網(wǎng)絡(luò)的地址就可以了,雖然這個(gè)地址不能直接在廣域網(wǎng)上使用,但是通過(guò)啟用了NAT的路由器,這些擁有私有網(wǎng)絡(luò)地址的設(shè)備也可以訪問(wèn)廣域網(wǎng)上的資源。當(dāng)然,隨著IPv6的普及,NAT的使用將會(huì)逐漸減少。
iptables也支持NAT功能,如前所述,iptable上中包含一個(gè)NAT表,其中有兩條缺省的鏈,也就是PREROUTING 和 POSTROUTING 鏈,在這兩條鏈上配置規(guī)則可以實(shí)現(xiàn)NAT功能。
在配置NAT之前,首先回顧一下NAT的兩種形式:
源地址轉(zhuǎn)換(SNAT):適用于由局域網(wǎng)中的主機(jī)發(fā)起連接的情況。報(bào)文在經(jīng)過(guò)NAT路由器時(shí),將IP報(bào)文中的源IP地址轉(zhuǎn)換為一個(gè)有效的廣域網(wǎng)地址;在服務(wù)器給一個(gè)在私有網(wǎng)絡(luò)中的主機(jī)返回響應(yīng)報(bào)文時(shí),目的IP地址就是這個(gè)局域網(wǎng)對(duì)外的廣域網(wǎng)地址。報(bào)文到達(dá)NAT路由器的時(shí)候,路由器要將該報(bào)文分發(fā)給對(duì)應(yīng)的主機(jī),將IP報(bào)文的目的IP地址轉(zhuǎn)換為私有網(wǎng)絡(luò)地址;
目的地址轉(zhuǎn)換(DNAT):又稱為“端口轉(zhuǎn)發(fā)”,適用于由廣域網(wǎng)上的主機(jī)發(fā)起連接的情況。當(dāng)廣域網(wǎng)的主機(jī)訪問(wèn)NAT路由器的廣域網(wǎng)端口時(shí),可以將NAT路由器的廣域網(wǎng)的端口映射到局域網(wǎng)內(nèi)的某個(gè)IP地址的某個(gè)端口,這樣就可以實(shí)現(xiàn)廣域網(wǎng)主機(jī)訪問(wèn)局域網(wǎng)內(nèi)的資源。
這里需要注意一點(diǎn)就是,SNAT和DNAT的“源”和“目的”指的并不是“源地址轉(zhuǎn)換”和“目的地址轉(zhuǎn)換”,而是指的發(fā)起連接的過(guò)程中的那個(gè)轉(zhuǎn)換,只考慮了請(qǐng)求包。其實(shí)可以簡(jiǎn)單的理解為SNAT就是局域網(wǎng)主機(jī)發(fā)起連接,DNAT就是廣域網(wǎng)主機(jī)發(fā)起連接,要知道任何一個(gè)連接都是雙向傳輸數(shù)據(jù),所以在配置防火墻的時(shí)候要特別注意這一點(diǎn)。
在iptables上配置NAT時(shí),也可以配置SNAT和DNAT,我們的實(shí)驗(yàn)環(huán)境有三臺(tái)主機(jī),它們的基本網(wǎng)絡(luò)情況如下(注意;這里的172.20.10.0網(wǎng)絡(luò)仍然是局域網(wǎng),只是模擬了廣域網(wǎng)而已):
主機(jī)(作為廣域網(wǎng)服務(wù)器) 接口名稱:wlan IP地址:172.20.10.4 子網(wǎng)掩碼:255.255.255.240 默認(rèn)網(wǎng)關(guān):172.20.10.1 虛擬機(jī)A(作為NAT路由器) 接口名稱:ens39(廣域網(wǎng)接口) IP地址:172.20.10.3 子網(wǎng)掩碼:255.255.255.240 默認(rèn)網(wǎng)關(guān):172.20.10.1 接口名稱:ens38(局域網(wǎng)接口) IP地址:192.168.1.1 子網(wǎng)掩碼:255.255.255.0 配置: ifconfig ens38 192.168.1.1 netmask 255.255.255.0 虛擬機(jī)B(作為局域網(wǎng)主機(jī)) 接口名稱:eth1 IP地址:192.168.1.100 子網(wǎng)掩碼:255.255.255.0 默認(rèn)網(wǎng)關(guān):192.168.1.1 配置: ifconfig eth1 192.168.1.100 netmask 255.255.255.0 route add default gw 192.168.1.1
首先啟用虛擬機(jī)A的路由轉(zhuǎn)發(fā)功能,編輯/etc/sysctl.conf文件
vi /etc/sysctl.conf
新增下面的條目:
net.ipv4.ip_forward=1
使上面的更改立即生效
sysctl -p
現(xiàn)在我們?cè)谔摂M機(jī)A中配置iptables的NAT表,使虛擬機(jī)B可以通過(guò)虛擬機(jī)A連接到主機(jī)的網(wǎng)絡(luò)。
# 適用于廣域網(wǎng)為固定IP地址的情況,本例是這種情況 iptables -t nat -A POSTROUTING -o ens38 -s 192.168.1.0/24 -j SNAT --to-source 172.20.10.3 # 適用于廣域網(wǎng)為動(dòng)態(tài)分配IP地址的情況,典型例子是PPPoE iptables -t nat -A POSTROUTING –o ens38 –s 192.168.1.0/24 –j MASQUERADE
命令的含義就是在路由操作之后,將從ens38接口上的192.168.1.0/24網(wǎng)絡(luò)上的報(bào)文的源IP地址,轉(zhuǎn)換為廣域網(wǎng)地址172.20.10.3(或者通過(guò)PPPoE得到的動(dòng)態(tài)廣域網(wǎng)地址)并發(fā)送出去。這樣一來(lái),在局域網(wǎng)中的虛擬機(jī)2就可以訪問(wèn)廣域網(wǎng)上的的資源了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/11352.html
閱讀 1100·2021-11-16 11:44
閱讀 1379·2019-08-30 13:12
閱讀 2420·2019-08-29 16:05
閱讀 3083·2019-08-28 18:29
閱讀 920·2019-08-26 13:41
閱讀 3240·2019-08-26 13:34
閱讀 2610·2019-08-26 10:35
閱讀 946·2019-08-26 10:28