Linux 內(nèi)核中有一個(gè)功能強(qiáng)大的聯(lián)網(wǎng)子系統(tǒng) netfilter。netfilter 子系統(tǒng)提供了有狀態(tài)的或無(wú)狀態(tài)的分組過(guò)濾,還提供了 NAT 和 IP 偽裝服務(wù)。netfilter 還具備為高級(jí)選路和連接狀態(tài)管理而變形(mangle)IP 頭信息的能力。netfilter 是通過(guò) IPTables 工具來(lái)控制的。
IPTables 總覽
netfilter 的強(qiáng)大功能和靈活性是通過(guò) IPTables 界面來(lái)實(shí)現(xiàn)的。這個(gè)命令行工具和它的前身 IPChains 的語(yǔ)法很相似;不過(guò),IPTables 使用 netfilter 子系統(tǒng)來(lái)增進(jìn)網(wǎng)絡(luò)連接、檢驗(yàn)、和處理方面的能力;IPChains 使用錯(cuò)綜復(fù)雜的規(guī)則集合來(lái)過(guò)濾源地和目的地路線以及兩者的連接端口。IPTables 只在一個(gè)命令行界面中就包括了更先進(jìn)的記錄方式;選路前和選路后的行動(dòng);網(wǎng)絡(luò)地址轉(zhuǎn)換;以及端口轉(zhuǎn)發(fā)。
7.2. 使用 IPTables
使用 IPTables 的第一步是啟動(dòng) IPTables 服務(wù)。這可以使用以下命令進(jìn)行:
service iptables start
警告
你應(yīng)該使用以下命令關(guān)閉 IP6Tables 服務(wù)才能使用 IPTables 服務(wù):
service ip6tables stop
chkconfig ip6tables off
要使 IPTables 在系統(tǒng)引導(dǎo)時(shí)默認(rèn)啟動(dòng),你必須使用 chkconfig 來(lái)改變服務(wù)的運(yùn)行級(jí)別狀態(tài)。
chkconfig --level 345 iptables on
IPTables 的語(yǔ)法被分成幾個(gè)層次。主要層次為“鏈”(chain)?!版湣敝付ㄌ幚矸纸M的狀態(tài)。其用法為:
iptables -A chain -j target
-A 在現(xiàn)存的規(guī)則集合內(nèi)后補(bǔ)一條規(guī)則。chain 是規(guī)則所在“鏈”的名稱。IPTables 中有三個(gè)內(nèi)建的鏈(即影響每一個(gè)在網(wǎng)絡(luò)中經(jīng)過(guò)的分組的鏈):INPUT、OUTPUT、和 FORWARD。這些鏈?zhǔn)怯谰眯缘模荒鼙粍h除。
重要
在創(chuàng)建 IPTables 規(guī)則集合時(shí),記住規(guī)則的順序是至關(guān)重要的。例如:如果某個(gè)鏈指定了來(lái)自本地子網(wǎng) 192.168.100.0/24 的任何分組都應(yīng)放棄,然后一個(gè)允許來(lái)自 192.168.100.13(在前面要放棄分組的子網(wǎng)范圍內(nèi))的分組的鏈被補(bǔ)在這個(gè)規(guī)則后面(-A),那么這個(gè)后補(bǔ)的規(guī)則就會(huì)被忽略。你必須首先設(shè)置允許 192.168.100.13 的規(guī)則,然后再設(shè)置放棄規(guī)則。
要在現(xiàn)存規(guī)則鏈的任意處插入一條規(guī)則,使用 -I,隨后是你想插入規(guī)則的鏈的名稱,然后是你想放置規(guī)則的位置號(hào)碼(1,2,3,...,n)。例如:
iptables -I INPUT 1 -i lo -p all -j ACCEPT
這條規(guī)則被插入為 INPUT 鏈的第一條規(guī)則,它允許本地環(huán)回設(shè)備上的交通。
7.2.1. 基本防火墻策略
在一開始就建立的某些基本策略為建構(gòu)更詳細(xì)的用戶定義的規(guī)則奠定了基礎(chǔ)。IPTables 使用策略(policy, -P)來(lái)創(chuàng)建默認(rèn)規(guī)則。對(duì)安全敏感的管理員通常想采取放棄所有分組、只逐一允許指定分組的策略。以下規(guī)則阻塞網(wǎng)絡(luò)上所有的出入分組。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
此外,還推薦你拒絕所有轉(zhuǎn)發(fā)分組(forwarded packets) — 要從防火墻被選路發(fā)送到它的目標(biāo)節(jié)點(diǎn)的網(wǎng)絡(luò)交通 — 以便限制內(nèi)部客戶對(duì)互聯(lián)網(wǎng)的無(wú)心暴露。要達(dá)到這個(gè)目的,使用以下規(guī)則:
iptables -P FORWARD DROP
注記
在處理添加的規(guī)則時(shí),REJECT(拒絕)目標(biāo)和 DROP(放棄)目標(biāo)這兩種行動(dòng)有所不同。REJECT 會(huì)拒絕目標(biāo)分組的進(jìn)入,并給企圖連接服務(wù)的用戶返回一個(gè) connection refused 的錯(cuò)誤消息。DROP 會(huì)放棄分組,而對(duì) telnet 用戶不發(fā)出任何警告;不過(guò),為了避免導(dǎo)致用戶由于迷惑不解而不停試圖連接的情況的發(fā)生,推薦你使用 REJECT 目標(biāo)。
設(shè)置了策略鏈后,為你的特定網(wǎng)絡(luò)和安全需要?jiǎng)?chuàng)建新規(guī)則。以下各節(jié)概述了一些你在建構(gòu) IPTables 防火墻時(shí)可能要實(shí)現(xiàn)的規(guī)則。
7.2.2. 保存和恢復(fù) IPTables 規(guī)則
防火墻規(guī)則只在計(jì)算機(jī)處于開啟狀態(tài)時(shí)才有效。如果系統(tǒng)被重新引導(dǎo),這些規(guī)則就會(huì)自動(dòng)被清除并重設(shè)。要保存規(guī)則以便今后載入,請(qǐng)使用以下命令:
/sbin/service iptables save
保存在 /etc/sysconfig/iptables 文件中的規(guī)則會(huì)在服務(wù)啟動(dòng)或重新啟動(dòng)時(shí)(包括機(jī)器被重新引導(dǎo)時(shí))被應(yīng)用。
常用 iptables 過(guò)濾
把遠(yuǎn)程攻擊者拒之“LAN”外是網(wǎng)絡(luò)保安的一個(gè)重要方面。LAN 的完好性應(yīng)該通過(guò)使用嚴(yán)格的防火墻規(guī)則來(lái)抵御蓄意不良的遠(yuǎn)程用戶而被保護(hù)。但是,如果默認(rèn)策略被設(shè)置為阻塞所有進(jìn)入、輸出、和轉(zhuǎn)發(fā)的分組,防火墻/網(wǎng)關(guān)和內(nèi)部 LAN 用戶之間的通信就無(wú)法進(jìn)行。要允許用戶執(zhí)行和網(wǎng)絡(luò)相關(guān)的功能以及使用聯(lián)網(wǎng)應(yīng)用程序,管理員必須打開某些端口進(jìn)行通信。
例如:要允許到防火墻上的端口80的通信,添加以下規(guī)則:
iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
這會(huì)允許用戶瀏覽通過(guò)端口80通信的網(wǎng)站。要允許到安全網(wǎng)站(如 https://www.example.com/)的訪問(wèn),你還必須打開端口443。
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
有時(shí)候,你可能會(huì)需要從 LAN 之外遠(yuǎn)程地進(jìn)入 LAN。SSH 和 CIPE 之類的安全服務(wù)可以用于到 LAN 服務(wù)的加密遠(yuǎn)程連接。對(duì)于擁有基于 PPP 資源(如調(diào)制解調(diào)器池或批量 ISP 賬號(hào))的管理員來(lái)說(shuō),撥號(hào)進(jìn)入可以被用來(lái)安全地避開防火墻,因?yàn)檎{(diào)制解調(diào)器連接是直接連接,通常位于防火墻/網(wǎng)關(guān)之后。 然而,對(duì)于有寬帶連接的遠(yuǎn)程用戶來(lái)說(shuō),你就需要制定些特殊規(guī)定。你可以配置 IPTables 接受來(lái)自遠(yuǎn)程 SSH 和 CIPE 客戶的連接。例如,要允許遠(yuǎn)程 SSH 訪問(wèn),你可以使用以下規(guī)則:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT
來(lái)自外部的 CIPE 連接請(qǐng)求可以使用以下命令來(lái)接受(把 x 替換成你的設(shè)備號(hào)碼):
iptables -A INPUT -p udp -i cipcbx -j ACCEPT
7.4. FORWARD 和 NAT 規(guī)則
多數(shù)機(jī)構(gòu)從它們的 ISP 處得到數(shù)量有限的可公開選路的 IP 地址。鑒于這種限額,管理員必須創(chuàng)建性地積極尋求分享互聯(lián)網(wǎng)服務(wù)的方法,而又不必把稀有的 IP 地址分配給 LAN 上的每一臺(tái)機(jī)器。使用專用 IP 地址是允許 LAN 上的所有機(jī)器正確使用內(nèi)部和外部網(wǎng)絡(luò)服務(wù)的常用方法。邊緣路由器(如防火墻)可以接收來(lái)自互聯(lián)網(wǎng)的進(jìn)入交通,并把這些分組選路發(fā)送它們意圖發(fā)送的 LAN 節(jié)點(diǎn)上;同時(shí),防火墻/網(wǎng)關(guān)還可以把來(lái)自 LAN 節(jié)點(diǎn)的輸出請(qǐng)求選路發(fā)送到遠(yuǎn)程互聯(lián)網(wǎng)服務(wù)中。這種轉(zhuǎn)發(fā)網(wǎng)絡(luò)交通行為有時(shí)會(huì)很危險(xiǎn),特別是隨著能夠假冒內(nèi)部 IP 地址、使遠(yuǎn)程攻擊者的機(jī)器成為你的 LAN 上的一個(gè)節(jié)點(diǎn)的現(xiàn)代攻擊工具的出現(xiàn)。為防止此類事件的發(fā)生,iptables 提供了選路發(fā)送和轉(zhuǎn)發(fā)策略,你可以實(shí)施它們來(lái)防止對(duì)網(wǎng)絡(luò)資源的變相利用。
FORWARD 策略允許管理員控制分組可以被選路發(fā)送到 LAN 內(nèi)的哪些地方。例如:要允許整個(gè) LAN 的轉(zhuǎn)發(fā)(假定防火墻/網(wǎng)關(guān)在 eth1 上有一個(gè)內(nèi)部 IP 地址),你可以設(shè)置以下規(guī)則:
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT
注記
按照默認(rèn)設(shè)置,紅帽企業(yè) Linux 內(nèi)核中的 IPv4 策略禁用了對(duì) IP 轉(zhuǎn)發(fā)的支持,這會(huì)防止運(yùn)行紅帽企業(yè) Linux 的機(jī)器成為專用邊緣路由器。要啟用 IP 轉(zhuǎn)發(fā),請(qǐng)運(yùn)行以下命令:
sysctl -w net.ipv4.ip_forward=1
如果該命令是通過(guò) shell 提示運(yùn)行的,那么其設(shè)置在重新引導(dǎo)后就不會(huì)被保存。你可以通過(guò)編輯 /etc/sysctl.conf 文件來(lái)永久性地設(shè)置轉(zhuǎn)發(fā)。尋找并編輯以下行,把 0 改成 1:
net.ipv4.ip_forward = 0
執(zhí)行以下命令來(lái)啟用 sysctl.conf 文件中的改變:
sysctl -p /etc/sysctl.conf
這會(huì)允許 LAN 節(jié)點(diǎn)彼此通信;不過(guò),它們沒有被允許和外界(如互聯(lián)網(wǎng))通信。要允許帶有專用 IP 地址的 LAN 節(jié)點(diǎn)和外部的公共網(wǎng)絡(luò)通信,配置防火墻的 IP 偽裝(IP masquerading),這會(huì)把來(lái)自 LAN 節(jié)點(diǎn)的請(qǐng)求都偽裝成防火墻的外部設(shè)備(在這個(gè)例子中是 eth0)的 IP 地址。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
7.5. DMZ 和 iptables
你還可以設(shè)置一些把交通選路發(fā)送到某些機(jī)器(如專用 HTTP 或 FTP 服務(wù)器)的規(guī)則,這些機(jī)器最好是位于?;饏^(qū)域(de-militarized zone,DMZ)的和內(nèi)部網(wǎng)絡(luò)分開的機(jī)器。要設(shè)置一條把所有進(jìn)入的 HTTP 請(qǐng)求都選路發(fā)送到 IP 地址為 10.0.4.2、端口為80(LAN 192.168.1.0/24 范圍之外)的專用 HTTP 服務(wù)器的規(guī)則,網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)會(huì)調(diào)用 PREROUTING 表來(lái)把這些分組轉(zhuǎn)發(fā)到恰當(dāng)?shù)哪康牡兀?/p>
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
--to-destination 10.0.4.2:80
使用這項(xiàng)命令,所有來(lái)自 LAN 以外的到端口80的 HTTP 連接都會(huì)被選路發(fā)送到和內(nèi)部網(wǎng)絡(luò)分離的另一個(gè)網(wǎng)絡(luò)上的 HTTP 服務(wù)器上。這種網(wǎng)絡(luò)分段會(huì)比允許到內(nèi)部網(wǎng)絡(luò)中的機(jī)器上的 HTTP 連接更安全。如果 HTTP 服務(wù)器被配置接受安全連接,那么端口443也必須被轉(zhuǎn)發(fā)。
病毒和假冒 IP 地址
你可以更精心設(shè)計(jì)一些規(guī)則來(lái)控制到 LAN 內(nèi)指定子網(wǎng)的訪問(wèn),甚至到指定機(jī)器的訪問(wèn)。你還可以限制某些類似特洛伊木馬、蠕蟲、以及其它客戶/服務(wù)器病毒的可疑服務(wù)聯(lián)系它們的服務(wù)器。例如:有些特洛伊木馬會(huì)掃描端口31337到31340(即黑客語(yǔ)言中的 elite 端口)上的服務(wù)。既然合法服務(wù)都不使用這些非標(biāo)準(zhǔn)端口來(lái)通信,阻塞這些端口能夠有效地減少你的網(wǎng)絡(luò)上可能被感染的機(jī)器和它們的遠(yuǎn)程主服務(wù)器進(jìn)行獨(dú)立通信的機(jī)會(huì)。
iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
你還可以阻塞試圖假冒你所在 LAN 的專用 IP 地址混入的連接。例如:如果你的 LAN 使用 192.168.1.0/24 范圍,面向互聯(lián)網(wǎng)的網(wǎng)絡(luò)設(shè)備(如 eth0)上就可以設(shè)置一條規(guī)則來(lái)放棄到那個(gè)設(shè)備的使用你所在 LAN 的 IP 范圍的分組。因?yàn)槟J(rèn)策略是拒絕轉(zhuǎn)發(fā)分組,所有到面向外界的設(shè)備(eth0)的假冒 IP 地址都會(huì)被自動(dòng)拒絕。
iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP
IP6Tables
下一代互聯(lián)網(wǎng)協(xié)議 IPv6 的出現(xiàn)突破了 IPv4(或 IP)的32位地址限制。IPv6 支持128位地址,因此識(shí)別 IPv6 的載體網(wǎng)絡(luò)就能夠制定比 IPv4 更多的可選路地址。
紅帽企業(yè) Linux 支持使用 Netfilter 6 子系統(tǒng)和 IP6Tables 命令的 IPv6 防火墻規(guī)則。使用 IP6Tables 的第一步是啟動(dòng) IP6Tables 服務(wù)。它可以使用以下命令進(jìn)行:
service ip6tables start
警告
你必須關(guān)閉 IPTables 服務(wù)才能專門使用 IP6Tables 服務(wù):
service iptables stop
chkconfig iptables off
要使 IP6Tables 在系統(tǒng)引導(dǎo)時(shí)默認(rèn)啟動(dòng),使用 chkconfig 來(lái)改變服務(wù)的運(yùn)行級(jí)別狀態(tài)。
chkconfig --level 345 ip6tables on
其語(yǔ)法在各方面都和 IPTables 相同,只不過(guò) IPTables 支持128位的地址。例如:在識(shí)別 IPv6 的網(wǎng)絡(luò)服務(wù)器器上的 SSH 連接可以使用以下規(guī)則來(lái)啟用:
ip6tables -A INPUT -i eth0 -p tcp -s 3ffe:ffff:100::1/128 --dport 22 -j ACCEPT
關(guān)于 IPv6 聯(lián)網(wǎng)的詳情,請(qǐng)參閱 IPv6 的信息頁(yè):http://www.ipv6.org/。
iptables -A OUTPUT -p udp -o cipcbx -j ACCEPT
CIPE 使用它自己的傳輸數(shù)據(jù)報(bào)(UDP)分組的虛擬設(shè)備,因此這條規(guī)則允許 cipcb 接口上的進(jìn)入連接,而不是規(guī)定源地端口或目標(biāo)端口(雖然它們可以被用來(lái)代替設(shè)備選項(xiàng))。關(guān)于使用 CIPE 的信息,請(qǐng)參閱第6章 。
你可能還想為其它服務(wù)定義規(guī)則。關(guān)于 IPTables 及其各類選項(xiàng)的完整信息,請(qǐng)參閱《紅帽企業(yè) Linux 參考指南》。
這些規(guī)則允許到防火墻上的常規(guī)及安全服務(wù)的訪問(wèn);然而,它們并不允許防火墻之后的機(jī)器使用這些服務(wù)。要允許 LAN 使用這些服務(wù),你可以使用帶有 IPTables 過(guò)濾規(guī)則的 NAT。
聯(lián)系客服