張德楊
利用Iptables構(gòu)建網(wǎng)絡(luò)防火墻
張德楊
(河南省科學(xué)技術(shù)信息研究院,鄭州 河南 450003)
隨著互聯(lián)網(wǎng)的迅速發(fā)展和普及,網(wǎng)絡(luò)給人們提供便利的同時(shí),也給黑客攻擊提供了機(jī)會(huì),網(wǎng)絡(luò)安全已經(jīng)越來越受到人們的關(guān)注。防火墻是防御網(wǎng)絡(luò)攻擊和保護(hù)網(wǎng)絡(luò)安全的主要手段,經(jīng)過多年的發(fā)展,已經(jīng)成為網(wǎng)絡(luò)管理中不可或缺的安全技術(shù)。本文先介紹Linux內(nèi)核中Iptables的工作原理和基本語法規(guī)則,然后舉例說明如何使用Iptables設(shè)計(jì)一個(gè)網(wǎng)絡(luò)防火墻。
防火墻;Iptables;Netfilter
防火墻是指一個(gè)由硬件和軟件組合而成,在不同網(wǎng)絡(luò)或網(wǎng)絡(luò)安全域之間構(gòu)建保護(hù)措施的網(wǎng)絡(luò)安全系統(tǒng)。被隔離的網(wǎng)絡(luò)之間通信需要經(jīng)過防火墻來傳輸數(shù)據(jù),防火墻通過訪問控制機(jī)制,決定哪些數(shù)據(jù)允許或禁止通過,從而達(dá)到保護(hù)網(wǎng)絡(luò)安全的目的。
Linux2.4以上版本內(nèi)核中提供了一個(gè)非常優(yōu)秀的防火墻工具Iptables,其主要具有數(shù)據(jù)包過濾(Filter)、網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)和數(shù)據(jù)包處理(Mangle)等功能。使用Iptables來構(gòu)建網(wǎng)絡(luò)防火墻是一種性價(jià)比較高的網(wǎng)絡(luò)安全解決方案,可以有效阻止網(wǎng)絡(luò)攻擊,保護(hù)網(wǎng)絡(luò)安全。
Iptables是管理內(nèi)核包過濾的工具,真正執(zhí)行過濾規(guī)則的是netfilter及其相關(guān)模塊。netfliter是Linux內(nèi)核中的一個(gè)通用架構(gòu),由一系列表(tables)組成,每個(gè)表由若干鏈(chains)組成,而每條鏈中由一條或數(shù)條規(guī)則(rule)組成。
netfliter有filter、nat、mangle、raw 4種內(nèi)建表,默認(rèn)表為filter,有INPUT、FORWARD和OUTPUT三個(gè)鏈,用于實(shí)現(xiàn)數(shù)據(jù)包過濾;nat表有PRER0UTING、POSTROUTING和OUTPUT 3個(gè)鏈,用于實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換;mangle有PREROUTING、OUTPUT、FORWARD、INPUT 和 POS?TROUTING 5個(gè)鏈,用于實(shí)現(xiàn)數(shù)據(jù)包處理;raw表有PRE?ROUTING和OUTPUT2個(gè)鏈,用于實(shí)現(xiàn)在連接跟蹤前處理數(shù)據(jù)包。這4個(gè)表的優(yōu)先級(jí)別是raw>mangle>nat>filter,其中raw表不常用,本文不做詳細(xì)介紹。
當(dāng)一個(gè)數(shù)據(jù)包到達(dá)某個(gè)鏈時(shí),系統(tǒng)從第一條規(guī)則開始檢查該數(shù)據(jù)包是否符合該規(guī)則定義的條件:如果符合,系統(tǒng)將按照該規(guī)則定義的方法處理該數(shù)據(jù)包;如果不符合,則繼續(xù)檢查下一條規(guī)則。最后,如果該數(shù)據(jù)包不符合該鏈中所有規(guī)則,系統(tǒng)將按照該鏈默認(rèn)的策略來處理該數(shù)據(jù)包[1]。
Iptables對(duì)數(shù)據(jù)包的處理流程如圖1所示,基本步驟如下。
圖1 Iptables對(duì)數(shù)據(jù)包的處理流程圖
①數(shù)據(jù)包到達(dá)網(wǎng)絡(luò)接口,如eth0,接口把數(shù)據(jù)包發(fā)往netfilter,數(shù)據(jù)包進(jìn)入netfilter。②進(jìn)入raw表的PRE?ROUTING鏈,在此可以進(jìn)行連接跟蹤處理。③進(jìn)入man?gle表的PREROUTING鏈,在此可以修改數(shù)據(jù)包TOS等以實(shí)現(xiàn)QOS。④進(jìn)入nat表的PREROUTING鏈,在此可以做DNAT,如更改數(shù)據(jù)包的目標(biāo)IP地址等,但不要做過濾。⑤數(shù)據(jù)包到達(dá)路由,路由根據(jù)路由表判斷數(shù)據(jù)包的目的地址。如果目的地址是本機(jī),數(shù)據(jù)包被轉(zhuǎn)給intput鏈處理;如果目的地址不是本機(jī),數(shù)據(jù)包被轉(zhuǎn)給forward鏈處理。
按照數(shù)據(jù)包的目的地址是不是本機(jī),可以分為以下兩種情況。
(1)數(shù)據(jù)包的目的地址不是本機(jī)。①進(jìn)入mangle表的FORWARD鏈。②進(jìn)入filter表的FORWARD鏈,在此可以對(duì)所有轉(zhuǎn)發(fā)的數(shù)據(jù)包進(jìn)行過濾。注意:轉(zhuǎn)發(fā)的數(shù)據(jù)包方向是雙向的。③進(jìn)入mangle表的POSTROUTING鏈。④進(jìn)入nat表的POSTROUTING鏈,在此可以做SNA,比如更改數(shù)據(jù)包的源IP地址等,但不要做過濾。⑤數(shù)據(jù)包離開netfilter,通過網(wǎng)絡(luò)接口出去,如eth1。
(2)數(shù)據(jù)包的目的地址是本機(jī)。①進(jìn)入mangle表的INPUT鏈。②進(jìn)入filter表的INPUT鏈,在此可以對(duì)流入的所有網(wǎng)絡(luò)接口數(shù)據(jù)包進(jìn)行過濾。③數(shù)據(jù)包進(jìn)入本地主機(jī)進(jìn)程進(jìn)行處理,如果需要外發(fā)數(shù)據(jù)包,或本地主機(jī)進(jìn)程自身需要外發(fā)數(shù)據(jù)包,則數(shù)據(jù)包經(jīng)過路由后被送往OUT?PUT鏈。④進(jìn)入raw表的OUTPUT鏈,在此對(duì)本地的數(shù)據(jù)包進(jìn)行連接跟蹤處理。⑤進(jìn)入mangle表的OUTPUT鏈,在此可以修改數(shù)據(jù)包,但不要做過濾。⑥進(jìn)入nat表的OUTPUT鏈,在此可以對(duì)本機(jī)發(fā)出的數(shù)據(jù)包做NAT,再次進(jìn)行路由選擇。⑦進(jìn)入filter表的OUTPUT鏈,在此可以對(duì)數(shù)據(jù)包進(jìn)行過濾。⑧進(jìn)入mangle表的POSTROUTING鏈,同上一種情況的第③步。注意,此處不僅對(duì)經(jīng)過的數(shù)據(jù)包進(jìn)行處理,還對(duì)本機(jī)產(chǎn)生的數(shù)據(jù)包進(jìn)行處理。⑨進(jìn)入nat表的POSTROUTING鏈,同上一種情況的第④步。⑩處理后的數(shù)據(jù)包離開netfilter,通過網(wǎng)絡(luò)接口出去,如eth1。
如果該數(shù)據(jù)包的回復(fù)包進(jìn)入netfilter,則不需要檢查任何規(guī)則,因此Iptables具有狀態(tài)(Statefu1)機(jī)制,該狀態(tài)機(jī)制可以減少訪問規(guī)則的設(shè)置,提高訪問效率,增加系統(tǒng)性能。
Iptables通過添加、修改或刪除規(guī)則配置出各種包過濾策略,基本語法如下。
iptables[-t表]lt;命令gt;[鏈][規(guī)則號(hào)碼][匹配條件][-j動(dòng)作]
表指filter、nat、mangle、raw等,該選項(xiàng)不是必需的,缺省的表為filter。
命令包括:新建(-N)、添加(-A)、插入(-I)、刪除(-D)、替換(-R)、設(shè)置鏈默認(rèn)規(guī)則(-P)、清空(-F)、查看(-[vxn]L)等。
鏈指表中包含的鏈,如 INPUT、OUTPUT、FOR?WARD、PREROUTING、POSTROUTING等。
規(guī)則號(hào)碼指鏈中規(guī)則順序號(hào)。
匹配條件包括:流入接口(-i)、流出接口(-o)、來源地址(-s)、目的地址(-d)、協(xié)議類型(-p)、來源端口(--sport)、目的端口(--dport)等。
動(dòng)作包括:通過(ACCEPT)、丟棄(DROP)、拒絕(RE?JECT,同DROP但回傳錯(cuò)誤消息)、返回(RETURN)、目的地址轉(zhuǎn)換(DNAT)、源地址轉(zhuǎn)換(SNAT)、動(dòng)態(tài)源地址轉(zhuǎn)換(MASQUERADE)、重定向(REDIRECT)等。
此外,還有如下附加模塊:按包狀態(tài)匹配(state)、按來源MAC匹配(mac)、按包速率匹配(limit)、多端口匹配(multiport)等。
舉例說明:
iptables-t filter-A INPUT-p tcp–s192.168.1.0/24-d 218.28.28.28--dport 80–ieth1-o eth0-j AC?CEPT
-t filter:filter是默認(rèn)表,可省略,-t用來調(diào)用表。
-A:在指定的鏈末添加一條規(guī)則。
圖2 網(wǎng)絡(luò)拓?fù)鋱D
-p:協(xié)議類型,包括tcp、udp、icmp等中的一個(gè)或者全部,也可以是數(shù)值,代表某一個(gè)協(xié)議,還可以使用在/etc/protocols中定義的協(xié)議名。在協(xié)議名前加上“!”表示相反的規(guī)則。數(shù)字0相當(dāng)于all,默認(rèn)選項(xiàng),匹配所有協(xié)議。
-s:指定源地址,可以是主機(jī)名、網(wǎng)絡(luò)名和IP地址。
-d:指定目標(biāo)地址。
--dport:指定目標(biāo)端口或端口范圍;--sport指定源端口或端口范圍。
-i:接收該包的接口名稱。
-o:發(fā)送該包的接口名稱。
-j:指定規(guī)則的動(dòng)作。
此規(guī)則的意義是:添加一條數(shù)據(jù)包過濾規(guī)則,允許源地址是192.168.1.0/24網(wǎng)段主機(jī)的數(shù)據(jù)包進(jìn)入網(wǎng)卡eth1,通過網(wǎng)卡eth0使用TCP協(xié)議訪問目的地址是218.28.28.28主機(jī)的8O端口。
通過以上分析可以看出,使用Iptables可以設(shè)計(jì)出滿足各類需求的防火墻系統(tǒng)。下面以一個(gè)Iptables具體應(yīng)用為例,演示如何利用Iptables實(shí)現(xiàn)包過濾防火墻。
使用一臺(tái)PC服務(wù)器當(dāng)作防火墻,操作系統(tǒng)為Cen?tOS6,安裝有3塊網(wǎng)卡,其中eth0連接外部Internet,IP地址為222.22.22.22;eth1連接內(nèi)部局域網(wǎng),IP地址為192.168.1.1;eth2連接服務(wù)器區(qū)(DMZ),IP地址為192.168.10.1。網(wǎng)絡(luò)拓?fù)淙鐖D2所示。
該防火墻系統(tǒng)實(shí)現(xiàn)的目標(biāo)是:網(wǎng)絡(luò)進(jìn)行NAT地址轉(zhuǎn)換,同時(shí)根據(jù)數(shù)據(jù)包的端口和狀態(tài)特征進(jìn)行包過濾。In?ternet和Intranet用戶可以訪問DMZ區(qū)服務(wù)器提供的服務(wù);DMZ區(qū)服務(wù)器和Intranet計(jì)算機(jī)可以訪問Internet上的服務(wù);Internet用戶不能訪問Intranet計(jì)算機(jī);防火墻對(duì)DMZ和Intranet數(shù)據(jù)包進(jìn)行地址轉(zhuǎn)換,起到IP偽裝和地址復(fù)用的作用。腳本如下所示。
#打開ip轉(zhuǎn)發(fā)功能
echoquot;1quot;gt;/proc/sys/net/ipv4/ip_forward
#解決Linux NAT ip_conntrack∶table full的方法
echo quot;86400quot; gt;/proc/sys/net/ipv4/netfilter/ip_conn?track_tcp_timeout_established
#加載對(duì)ftp協(xié)議支持的模塊
modprobe ip_nat_ftp
#ftp自動(dòng)追蹤模塊,提供對(duì)某些網(wǎng)絡(luò)游戲在線升級(jí)的支持
#modprobe ip_conntrack
#modprobe ip_conntrack_ftp
#清除所有鏈的規(guī)則,設(shè)定防火墻禁止一切通信的默認(rèn)策略。
iptables-F
iptables-t nat-F
iptables-t mangle-F
iptables-X
iptables-t nat-X
iptables-t mangle-X
iptables-Z
iptables-t nat-Z
iptables-t mangle-Z
#設(shè)定filter table的默認(rèn)策略
iptables-P INPUT DROP
iptables-P FORWARD DROP
iptables-P OUTPUT ACCEPT
iptables-t nat-P PREROUTING ACCEPT
iptables-t nat-P POSTROUTING ACCEPT
iptables-t nat-P OUTPUT ACCEPT
iptables-t mangle-P PREROUTING ACCEPT
iptables-t mangle-P INPUT ACCEPT
iptables-t mangle-P FORWARD ACCEPT
iptables-t mangle-P OUTPUT ACCEPT
iptables-t mangle-P POSTROUTING ACCEPT
#INPUT
iptables-A INPUT-s 127.0.0.1-d 127.0.0.1-j ACCEPT
#允許192.168.1.2進(jìn)入防火墻管理
iptables-A INPUT-i eth1-s 192.168.1.2-j AC?CEPT
iptables-A INPUT-m state--state ESTAB?LISHED,RELATED-j ACCEPT
#DMZ Section
iptables-A FORWARD-ieth2-o eth0-s 192.168.10.0/24-j ACCEPT
iptables-A FORWARD-p tcp-o eth2-d 192.168.10.2--dport 80-j ACCEPT
iptables-A FORWARD-p tcp-o eth2-d 192.168.10.3--dport 21-j ACCEPT
#限速,暫時(shí)不用
#iptables- A FORWARD- p tcp- d 192.168.10.2--syn-m connlimit--connlimit-above 10-j DROP
#iptables- A FORWARD- p tcp- d 192.168.10.2--syn-m limit--limit 1/s-j ACCEPT
#LAN Section
iptables-A FORWARD-ieth1-o eth0-s 192.168.1.0/24-j ACCEPT
iptables-A FORWARD-m state--state ESTAB?LISHED,RELATED-j ACCEPT
#DNAT
iptables-tnat-A PREROUTING-p tcp-d 222.22.22.22--dport80-jDNAT--to-destination 192.168.10.2∶80
iptables-tnat-A PREROUTING-p tcp-d 222.22.22.22--dport21-jDNAT--to-destination 192.168.10.3∶21
#SNAT
iptables-tnat-A POSTROUTING-oeth0-j SNAT--to 222.22.22.22
#解決DMZ服務(wù)器訪問自身提供的服務(wù)問題
iptables-tnat-A POSTROUTING-ptcp-o eth2- s 192.168.10.0/24- d 192.168.10.0/24- j SNAT--to 192.168.10.1
#如果Intranet區(qū)有多個(gè)網(wǎng)段,需設(shè)定路由,同時(shí)在eth1連接的路由器上設(shè)置反向路由
#route add- net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.254 dev eth1
上述腳本比較通用,功能強(qiáng)大,便于擴(kuò)展。在該實(shí)例中,“先拒絕所有的數(shù)據(jù)包,然后再允許需要的”,這是一般防火墻策略的基本原則,這種配置擴(kuò)展性好,如果需要增加功能服務(wù),只需要增加相應(yīng)的配置設(shè)置就可以實(shí)現(xiàn)。Iptables除了數(shù)據(jù)包過濾等基本功能外,還可以加載很多實(shí)用模塊來實(shí)現(xiàn)復(fù)雜的功能,可以構(gòu)建出支持連接狀態(tài)的防火墻。
CentOS6默認(rèn)安裝了Iptables,系統(tǒng)啟動(dòng)時(shí)自動(dòng)啟動(dòng)Ipt?ables服務(wù),如未啟動(dòng),可手工啟動(dòng)(service iptables start)。
Iptables是Linux內(nèi)置的防火墻模塊,其功能強(qiáng)大,可以用于數(shù)據(jù)包過濾、NAT和數(shù)據(jù)包轉(zhuǎn)發(fā)。本文介紹了Ipt?ables實(shí)現(xiàn)原理和基本語法,并結(jié)合實(shí)例說明如何使用Iptables構(gòu)建Linux系統(tǒng)防火墻。對(duì)于中小規(guī)模網(wǎng)絡(luò),結(jié)合實(shí)際構(gòu)建基于Iptables的防火墻,是一個(gè)性價(jià)比較高的方案,可以簡單、高效和經(jīng)濟(jì)地保護(hù)網(wǎng)絡(luò)安全。
[1]O Andreasson.Oskar Andreasson,Iptables Tutorial 1.2.2[EB/OL].[2017-09-05].https∶//www.frozentux.net/iptables-tutori?al/iptables-tutorial.html.
Building a Network Firewall Based on Iptables
Zhang Deyang
(Henan Institute of Scienceamp;Technology Information,Zhengzhou Henan 450003)
With the rapid development and popularization of the Internet,the network provides people with convenience,but also provides opportunities for hacker attacks,network security has attracted more and more attention.Firewall is the main means to defend network attacks and protect network security.After years of development,it has become an indispensable security technology in network management.This pa?per presented the work theory of Iptables embedded in Linux kernel and its basic grammatical rule,and then an instance ofnetwork firewall based on Iptables was designed.
firewall;iptables;netfilter
TP393.08
A
1003-5168(2017)10-0058-04
2017-09-03
張德楊(1979-),男,工程師,研究方向:計(jì)算機(jī)技術(shù)。