- 論壇徽章:
- 0
|
不知道有沒有人ZT過,貼上來看看先了!
用iptales實現(xiàn)包過慮型防火墻(一)
http://LinuxAid.com.cn bye2000
本文版權(quán)由linuxAid和作者所有
摘要:本文介紹linux2.4.x內(nèi)核中的防火墻工具--iptables的原理與配置,同時還給出了實際運用的例子,在文章的最后歸納了iptables與ipchains的區(qū)別。
一、 概述
從1.1內(nèi)核開始,linux就已經(jīng)具有包過慮功能了,在2.0的內(nèi)核中我們采用ipfwadm來操作內(nèi)核包過慮規(guī)則。之后在2.2內(nèi)核中,采用了大家并不陌生的ipchains來控制內(nèi)核包過慮規(guī)則,F(xiàn)在最新linux內(nèi)核版本是2.4.1,在2.4內(nèi)核中我們不再使用ipchains,而是采用一個全新的內(nèi)核包過慮管理工具--iptables。 這個全新的內(nèi)核包過慮工具將使用戶更易于理解其工作原理,更容易被使用,當(dāng)然也將具有更為強大的功能。
我們說過iptables只是一個管理內(nèi)核包過慮的工具,iptables 可以加入、插入或刪除核心包過濾表格(鏈)中的規(guī)則。實際上真正來執(zhí)行這些過慮規(guī)則的是netfilter(Linux 核心中一個通用架構(gòu))及其相關(guān)模塊(如iptables模塊和nat模塊),下面我們一起來看看netfilter的工作原理。
二、 原理
netfilter是Linux 核心中一個通用架構(gòu),它提供了一系列的"表"(tables),每個表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數(shù)條規(guī)則(rule)組成。我們可以這樣來理解,netfilter是表的容器,表是鏈的容器,而鏈又是規(guī)則的容器(如圖一所示)。
系統(tǒng)缺省的表為"filter",該表中包含了INPUT、FORWARD和OUTPUT 3個鏈。每一條鏈中可以有一條或數(shù)條規(guī)則,每一條規(guī)則都是這樣定義的“如果數(shù)據(jù)包頭符合這樣的條件,就這樣處理這個數(shù)據(jù)包”。當(dāng)一個數(shù)據(jù)包到達(dá)一個鏈時,系統(tǒng)就會從第一條規(guī)則開始檢查,看是否符合該規(guī)則所定義的條件: 如果滿足,系統(tǒng)將根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包;如果不滿足則繼續(xù)檢查下一條規(guī)則。最后,如果該數(shù)據(jù)包不符合該鏈中任一條規(guī)則的話,系統(tǒng)就會根據(jù)該鏈預(yù)先定義的策略(policy)來處理該數(shù)據(jù)包。
數(shù)據(jù)包在filter表中的流程如圖二所示。有數(shù)據(jù)包進(jìn)入系統(tǒng)時,系統(tǒng)首先根據(jù)路由表決定將數(shù)據(jù)包發(fā)給哪一條鏈,則可能有三種情況:
1. 如果數(shù)據(jù)包的目的地址是本機,則系統(tǒng)將數(shù)據(jù)包送往INPUT鏈,如果通過規(guī)則檢查,則該包被發(fā)給相應(yīng)的本地進(jìn)程處理;如果沒通過規(guī)則檢查,系統(tǒng)就會將這個包丟掉;
2. 如果數(shù)據(jù)包的目的地址不是本機,也就是說,這個包將被轉(zhuǎn)發(fā),則系統(tǒng)將數(shù)據(jù)包送往FORWARD鏈,如果通過規(guī)則檢查,則該包被發(fā)給相應(yīng)的本地進(jìn)程處理;如果沒通過規(guī)則檢查,系統(tǒng)就會將這個包丟掉;
3. 如果數(shù)據(jù)包是由本地系統(tǒng)進(jìn)程產(chǎn)生的,則系統(tǒng)將其送往OUTPUT鏈,如果通過規(guī)則檢查,則該包被發(fā)給相應(yīng)的本地進(jìn)程處理;如果沒通過規(guī)則檢查,系統(tǒng)就會將這個包丟掉。
從以上我們可以看出,netfilter比起以前的ipfwadm和ipchains思路上清晰了好多,也好理解了好多,這對于原先對ipfwadm和ipchains總是感到一頭霧水的用戶來說無疑是一個福音。
三、 準(zhǔn)備工作
1. 系統(tǒng)需求
netfilter要求內(nèi)核版本不低于2.3.5,在編譯新內(nèi)核時,要求選擇和netfilter相關(guān)的項目。這些項目通常都是位于“Networking options”子項下。以2.4.0內(nèi)核為例,我們應(yīng)該選中的項目有:
Kernel/User netlink socket
[ ] Routing messages
<*>; Netlink device emulation Network packet filtering (replaces ipchains)
.......
然后,在“IP: Netfilter Configuration ---->;”選中:
<M>; Connection tracking (required for masq/NAT)
<M>; FTP protocol support
<M>; IP tables support (required for filtering/masq/NAT)
<M >; limit match support
<M>; MAC address match support
<M>; Netfilter MARK match support
<M>; Multiple port match support
<M>; TOS match support
<M>; Connection state match support
<M>; Packet filtering
<M>; REJECT target support
<M>; Full NAT
<M>; MASQUERADE target support
<M>; REDIRECT target support
<M>; Packet mangling
<M>; TOS target support
<M>; MARK target support
<M>; LOG target support
<M>; ipchains (2.2-style) support
<M>; ipfwadm (2.0-style) support
其中最后兩個項目可以不選,但是如果你比較懷念ipchains或者ipfwadm,你也可以將其選中,以便在2.4內(nèi)核中使用ipchians或ipfwadm。但是需要注意的是,iptables是和ipchians/ipfwadm相對立的,在使用iptables的同時就不能同時使用ipchains/ipfwadm。編譯成功后,這些模塊文件都位于以下目錄中
/lib/modules/2.4.0/kernel/net/ipv4/netfilter
編譯2.4.0的新內(nèi)核時還應(yīng)該注意要在“Processor type and features”中選擇和你的CPU相對應(yīng)的正確的CPU選項,否則新內(nèi)核可能無法正常工作。
2. 載入模塊
要使用iptables,還必須載入相關(guān)模塊?梢允褂靡韵旅钶d入相關(guān)模塊:
#modprobe iptable_tables
modprobe命令會自動載入指定模塊及其相關(guān)模塊。iptables_filter模塊會在運行時自動載入。
三、 語法
1. 對鏈的操作
建立一個新鏈 (-N)。
刪除一個空鏈 (-X)。
改變一個內(nèi)建鏈的原則 (-P)。
列出一個鏈中的規(guī)則 (-L)。
清除一個鏈中的所有規(guī)則 (-F)。
歸零(zero) 一個鏈中所有規(guī)則的封包字節(jié)(byte) 記數(shù)器 (-Z)。
2. 對規(guī)則的操作
加入(append) 一個新規(guī)則到一個鏈 (-A)的最后。
在鏈內(nèi)某個位置插入(insert) 一個新規(guī)則(-I),通常是插在最前面。
在鏈內(nèi)某個位置替換(replace) 一條規(guī)則 (-R)。
在鏈內(nèi)某個位置刪除(delete) 一條規(guī)則 (-D)。
刪除(delete) 鏈內(nèi)第一條規(guī)則 (-D)。
3. 指定源地址和目的地址
通過--source/--src/-s來指定源地址(這里的/表示或者的意思,下同),通過--destination/--dst/-s來指定目的地址。可以使用以下四中方法來指定ip地址:
a. 使用完整的域名,如“www.linuxaid.com.cn”;
b. 使用ip地址,如“192.168.1.1”;
c. 用x.x.x.x/x.x.x.x指定一個網(wǎng)絡(luò)地址,如“192.168.1.0/255.255.255.0”;
d. 用x.x.x.x/x指定一個網(wǎng)絡(luò)地址,如“192.168.1.0/24”這里的24表明了子網(wǎng)掩碼的有效位數(shù),這是 UNIX環(huán)境中通常使用的表示方法。
缺省的子網(wǎng)掩碼數(shù)是32,也就是說指定192.168.1.1等效于192.168.1.1/32。
4. 指定協(xié)議
可以通過--protocol/-p選項來指定協(xié)議,比如-p tcp。
5. 指定網(wǎng)絡(luò)接口將
可以使用--in-interface/-i或--out-interface/-o來指定網(wǎng)絡(luò)接口。需要注意的是,對于INPUT鏈來說,只可能有-i,也即只會有進(jìn)入的包;通理,對于OUTPUT鏈來說,只可能有-o,也即只會有出去的包。只有FORWARD鏈既可以有-i的網(wǎng)絡(luò)接口,也可以有-o的網(wǎng)絡(luò)接口。我們也可以指定一個當(dāng)前并不存在的網(wǎng)絡(luò)接口,比如ppp0,這時只有撥號成功后該規(guī)則才有效。
6. 指定ip碎片
在TCP/IP通訊過程中,每一個網(wǎng)絡(luò)接口都有一個最大傳輸單元(MTU),這個參數(shù)定義了可以通過的數(shù)據(jù)包的最大尺寸。如果一個數(shù)據(jù)包大于這個參數(shù)值時,系統(tǒng)會將其劃分成更小的數(shù)個數(shù)據(jù)包(稱之為ip碎片)來傳輸,而接收方則對這些ip碎片再進(jìn)行重組以還原整個包。
但是再進(jìn)行包過濾的時候,ip碎片會導(dǎo)致這樣一個問題:當(dāng)系統(tǒng)將大數(shù)據(jù)包劃分成ip碎片傳送時,第一個碎片含有完整的包頭信息,但是后續(xù)的碎片只有包頭的部分信息,比如源地址,目的地址。因此假如我們有這樣一條規(guī)則:
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT
并且這時的FORWARD的策略(policy)為DROP時,系統(tǒng)只會讓第一個ip碎片通過,而丟掉其余的ip碎片,因為第一個碎片含有完整的包頭信息,可以滿足該規(guī)則的條件,而余下的碎片因為包頭信息不完整而無法滿足規(guī)則定義的條件,因而無法通過。
我們可以通過--fragment/-f選項來指定第二個及其以后的ip碎片,比如以上面的例子為例,我們可以再加上這樣一條規(guī)則來解決這個問題:
iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
但是需要注意的是,現(xiàn)在已經(jīng)有好多進(jìn)行ip碎片攻擊的實例(比如向Win98 NT4/SP5,6 Win2K發(fā)送大量的ip碎片進(jìn)行DoS攻擊),因此允許ip碎片通過是有安全隱患的,對于這一點我們可以采用iptables的匹配擴展來進(jìn)行限制,但是這又會影響服務(wù)質(zhì)量,我們將在下面討論這個問題。
7. 指定非
可以在某些選項前加上!來表示非指定值,比如“-s -! 192.168.1.1/32”表示除了192.168.1.1以外的ip地址,“-p -! tcp”表示除了tcp以外的協(xié)議。
8. TCP匹配擴展
通過使用--tcp-flags選項可以根據(jù)tcp包的標(biāo)志位進(jìn)行過濾,該選項后接兩個參數(shù):第一個參數(shù)為要檢查的標(biāo)志位,可以是SYN,ACK,F(xiàn)IN,RST,URG,PSH的組合,可以用ALL指定所有標(biāo)志位;第二個參數(shù)是標(biāo)志位值為1的標(biāo)志。比如你要過濾掉所有SYN標(biāo)志位為1的tcp包,可以使用以下規(guī)則:
iptables -A FORWARD -p tcp --tcp-flags ALL SYN -j DROP
選項--syn是以上的一種特殊情況,相當(dāng)于“--tcp-flags SYN,RST,ACK SYN”的簡寫。
9. mac匹配擴展
可以使用-m選項來擴展匹配內(nèi)容。使用--match mac/-m mac匹配擴展可以用來檢查ip數(shù)據(jù)包的源mac地址。只要在--mac-source后面跟上mac地址就可以了。比如:
iptables -A FORWARD -m mac --mac-source 00:00:BA:A5:7D:12 -j DROP
需要注意的是一個ip包在經(jīng)過路由器轉(zhuǎn)發(fā)后,其源mac地址已經(jīng)變成了路由器的mac地址。
10. limit匹配擴展
limit擴展是一個非常有用的匹配擴展。使用-m nat 來指定,其后可以有兩個選項:
--limit avg: 指定單位時間內(nèi)允許通過的數(shù)據(jù)包的個數(shù)。單位時間可以是/second、/minute、/hour、/day或使用第一個字母,比如5/second和5/s是一樣的,都是表示每秒可以通過5個數(shù)據(jù)包,缺省值是3/hour。
--limit-burst number:指定觸發(fā)事件的閥值,缺省值是5。
看起來好像有點復(fù)雜,就讓我們來看一個例子:
假設(shè)又如下的規(guī)則:
iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP
然后從另一部主機上ping這部主機,就會發(fā)生如下的現(xiàn)象:
首先我們可以看到前四個包的回應(yīng)都很正常,然后從第五個包開始,我們每10秒可以收到一個正常的回應(yīng)。這是因為我們設(shè)定了單位時間(在這里是每分鐘)內(nèi)允許通過的數(shù)據(jù)包的個數(shù)是每分鐘6個,也即每10秒鐘一個;其次我們又設(shè)定了事件觸發(fā)閥值為5,所以我們的前四個包都是正常的,只是從第五個包開始,限制規(guī)則開始生效,故只能每10秒收到一個正;貞(yīng)。
假設(shè)我們停止ping,30秒后又開始ping,這時的現(xiàn)象是:
前兩個包是正常的,從第三個包開始丟包,這是因為在這里我的允許一個包通過的周期是10秒,如果在一個周期內(nèi)系統(tǒng)沒有收到符合條件的包,系統(tǒng)的觸發(fā)值就會恢復(fù)1,所以假如我們30秒內(nèi)沒有符合條件的包通過,系統(tǒng)的觸發(fā)值就會恢復(fù)到3,假如5個周期內(nèi)都沒有符合條件的包通過,系統(tǒng)都觸發(fā)值就會完全恢復(fù)。不知道你明白了沒有,歡迎你來信討論。
11. LOG目標(biāo)擴展
netfilter缺省的目標(biāo)(也就是一旦滿足規(guī)則所定義以后系統(tǒng)對數(shù)據(jù)包的處理方法)有:
ACEEPT:接收并轉(zhuǎn)發(fā)數(shù)據(jù)包
DORP:丟掉數(shù)據(jù)包
目標(biāo)擴展模塊提供了擴展的目標(biāo)。LOG目標(biāo)提供了記錄數(shù)據(jù)包的功能。該目標(biāo)擴展有以下幾個參數(shù):
--log-level:指定記錄信息的級別,級別有debug、info、notice、warning、err、crit、alert、emerg分別對應(yīng)7到0的數(shù)字。其含義請參看syslog.conf的man手冊。
--log-prefix:后接一個最長為30個字符的字符串,該字符串將出現(xiàn)在每一條日志的前面。
12. REJECT目標(biāo)擴展
該目標(biāo)擴展完全和DORP標(biāo)準(zhǔn)目標(biāo)一樣,除了向發(fā)送方返回一個“port unreachable”的icmp信息外。
還有其他一些擴展是常用的,如果你想了解可以參考Packet-Filtering-HOWTO。當(dāng)然,最直接獲得幫助的辦法是查看iptables的在線幫助,比如想得到關(guān)于mac匹配擴展的幫助可以執(zhí)行“iptables -m mac -help”命令,想得到LOG目標(biāo)擴展的幫助可以執(zhí)行“iptables -j LOG -help”命令。
用iptales實現(xiàn)包過慮型防火墻(二)
http://LinuxAid.com.cn bye2000
本文版權(quán)由linuxAid和作者所有
四、 iptables使用實例
首先讓我們看一下服務(wù)器/客戶機的交互原理。服務(wù)器提供某特定功能的服務(wù)總是由特定的后臺程序提供的。在TCP/IP網(wǎng)絡(luò)中,常常把這個特定的服務(wù)綁定到特定的TCP或UDP端口。之后,該后臺程序就不斷地監(jiān)聽(listen)該端口,一旦接收到符合條件的客戶端請求,該服務(wù)進(jìn)行TCP握手后就同客戶端建立一個連接,響應(yīng)客戶請求。與此同時,再產(chǎn)生一個該綁定的拷貝,繼續(xù)監(jiān)聽客戶端的請求。
舉一個具體的例子:假設(shè)網(wǎng)絡(luò)中有一臺服務(wù)器A(IP地址為1.1.1.1)提供WWW服務(wù),另有客戶機B(2.2.2.2)、C(3.3.3.3)。首先,服務(wù)器A運行提供WWW服務(wù)的后臺程序(比如Apache)并且把該服務(wù)綁定到端口80,也就是說,在端口80進(jìn)行監(jiān)聽。當(dāng)B發(fā)起一個連接請求時,B將打開一個大于1024的連接端口(1024內(nèi)為已定義端口),假設(shè)為1037。A在接收到請求后,用80端口與B建立連接以響應(yīng)B的請求,同時產(chǎn)生一個80端口綁定的拷貝,繼續(xù)監(jiān)聽客戶端的請求。假如A又接收到C的連接請求(設(shè)連接請求端口為1071),則A在與C建立連接的同時又產(chǎn)生一個80端口綁定的拷貝繼續(xù)監(jiān)聽客戶端的請求。如下所示,因為系統(tǒng)是以源地址、源端口、目的地址、目的端口來標(biāo)識一個連接的,所以在這里每個連接都是唯一的。
服務(wù)器 客戶端
連接1:a.b.c.1:80 <=>; a.b.c.4:1037
連接2:a.b.c.1:80 <=>; a.b.c.7:1071
每一種特定的服務(wù)都有自己特定的端口,一般說來小于1024的端口多為保留端口,或者說是已定義端口,低端口分配給眾所周知的服務(wù)(如WWW、FTP等等),從512到1024的端口通常保留給特殊的UNIX TCP/IP應(yīng)用程序,具體情況請參考/etc/services文件或RFC1700。
假設(shè)網(wǎng)絡(luò)環(huán)境如下:某一單位,租用DDN專線上網(wǎng),網(wǎng)絡(luò)拓?fù)淙缦拢?br />
+--------------+
| 內(nèi)部網(wǎng)段 | eth1+--------+eth0 DDN
| +------------|firewall|<===============>;Internet
| 198.168.80.0 | +--------+
+--------------+
eth0: 198.199.37.254
eth1: 198.168.80.254
以上的IP地址都是Internet上真實的IP,故沒有用到IP欺騙。并且,我們假設(shè)在內(nèi)部網(wǎng)中存在以下服務(wù)器:
www服務(wù)器:www.yourdomain.com 198.168.80.11
ftp服務(wù)器:ftp.yourdomain.com 198.168.80.12
email服務(wù)器:mail.yourdomain.com 198.168.80.13
下面我們將用iptables一步一步地來建立我們的包過濾防火墻,需要說明的是,在這個例子中,我們主要是對內(nèi)部的各種服務(wù)器提供保護(hù)。
1. 在/etc/rc.d/目錄下用touch命令建立firewall文件,執(zhí)行chmod u+x firewll以更改文件屬性 ,編輯/etc/rc.d/rc.local文件,在末尾加上 /etc/rc.d/firewall 以確保開機時能自動執(zhí)行該腳本。
2. 刷新所有的鏈的規(guī)則
#!/bin/sh
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F
3. 我們將首先禁止轉(zhuǎn)發(fā)任何包,然后再一步步設(shè)置允許通過的包。
所以首先設(shè)置防火墻FORWARD鏈的策略為DROP:
/sbin/iptables -P FORWARD DROP
4.設(shè)置關(guān)于服務(wù)器的包過慮規(guī)則:
在這里需要注意的是,服務(wù)器/客戶機交互是有來有往的,也就是說是雙向的,所以我們不僅僅要設(shè)置數(shù)據(jù)包出去的規(guī)則,還要設(shè)置數(shù)據(jù)包返回的規(guī)則,我們先建立針對來自Internet數(shù)據(jù)包的過慮規(guī)則。
WWW服務(wù):服務(wù)端口為80,采用tcp或udp協(xié)議。規(guī)則為:eth0=>;允許目的為內(nèi)部網(wǎng)WWW服務(wù)器的包。
###########################Define HTTP packets####################################
#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT
FTP服務(wù):FTP服務(wù)有點特別,因為需要兩個端口,因為FTP有命令通道和數(shù)據(jù)通道。其中命令端口為21,數(shù)據(jù)端口為20,并且有主動和消極兩種服務(wù)模式,其消極模式連接過程為:FTP客戶端首先向FTP服務(wù)器發(fā)起連接請求,三步握手后建立命令通道,然后由FTP服務(wù)器請求建立數(shù)據(jù)通道,成功后開始傳輸數(shù)據(jù),現(xiàn)在大多數(shù)FTP客戶端均支持消極模式,因為這種模式可以提高安全性。FTP服務(wù)采用tcp協(xié)議。規(guī)則為:eth0=>;僅允許目的為內(nèi)部網(wǎng)ftp服務(wù)器的包。
############################Define FTP packets#####################################
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT
EMAIL服務(wù):包含兩個協(xié)議,一是smtp,一是pop3。出于安全性考慮,通常只提供對內(nèi)的pop3服務(wù),所以在這里我們只考慮針對smtp的安全性問題。smtp端口為21,采用tcp協(xié)議。eth0=>;僅允許目的為email服務(wù)器的smtp請求。
###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT
5. 設(shè)置針對Intranet客戶的過慮規(guī)則:
在本例中我們的防火墻位于網(wǎng)關(guān)的位置,所以我們主要是防止來自Internet的攻擊,不能防止來自Intranet的攻擊。假如我們的服務(wù)器都是基于linux的,也可以在每一部服務(wù)器上設(shè)置相關(guān)的過慮規(guī)則來防止來自Intranet的攻擊。對于Internet對Intranet客戶的返回包,我們定義如下規(guī)則。
#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
說明:第一條允許Intranet客戶采用消極模式訪問Internet的FTP服務(wù)器;第二條接收來自Internet的非連接請求tcp包;最后一條接收所有udp包,主要是針對oicq等使用udp的服務(wù)。
6. 接受來自整個Intranet的數(shù)據(jù)包過慮,我們定義如下規(guī)則:
#############Define packets from Internet server to Intranet server###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
7. 處理ip碎片
我們接受所有的ip碎片,但采用limit匹配擴展對其單位時間可以通過的ip碎片數(shù)量進(jìn)行限制,以防止ip碎片攻擊。
#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
說明:對不管來自哪里的ip碎片都進(jìn)行限制,允許每秒通過100個ip碎片,該限制觸發(fā)的條件是100個ip碎片。
8. 設(shè)置icmp包過濾
icmp包通常用于網(wǎng)絡(luò)測試等,故允許所有的icmp包通過。但是黑客常常采用icmp進(jìn)行攻擊,如ping of death等,所以我們采用limit匹配擴展加以限制:
#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
說明:對不管來自哪里的icmp包都進(jìn)行限制,允許每秒通過一個包,該限制觸發(fā)的條件是10個包。
通過以上個步驟,我們建立了一個相對完整的防火墻。只對外開放了有限的幾個端口,同時提供了客戶對Internet的無縫訪問,并且對ip碎片攻擊和icmp的ping of death提供了有效的防護(hù)手段。以下是完整的腳本文件內(nèi)容,希望通過這個實例能是對iptables的用法有所了解:
#!/bin/sh
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F
###########################Define HTTP packets####################################
#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT
############################Define FTP packets#####################################
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT
###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT
#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
#############Define packets from Intranet to Internet###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
五、 iptables與ipchains的區(qū)別
•iptables的缺省鏈的名稱從小寫換成大寫,并且意義不再相同:INPUT和OUTPUT分別放置對目的地址是本機以及本機發(fā)出的數(shù)據(jù)包的過慮規(guī)則。
•-i選項現(xiàn)在只代表輸入網(wǎng)絡(luò)接口,輸入網(wǎng)絡(luò)接口則使用-o選項。
•TCP和UDP端口現(xiàn)在需要用--source-port或--sport(或--destination-port/--dport)選項拼寫出來并且必須置于"-p tcp"或"-p udp"選項之后,因為它們分別是載入TCP和UDP擴展的。
•以前TCP的"-y"標(biāo)志現(xiàn)在改為"--syn",并且必須置于"-p tcp"之后。
•原來的DENY目標(biāo)最后改為了DROP。
•可以在列表顯示單個鏈的同時將其清空。
•可以在清空內(nèi)建鏈的同時將策略計數(shù)器清零。
•列表顯示鏈時可顯示計數(shù)器的當(dāng)前瞬時值。
•REJECT和LOG現(xiàn)在變成了擴展目標(biāo),即意味著它們成為獨立的內(nèi)核模塊。
•鏈名可以長達(dá)31個字符。
•MASQ現(xiàn)在改為MASQUERADE,并且使用不同的語法。REDIRECT保留原名稱,但也改變了所使用的語法。
用iptables實現(xiàn)NAT
摘要
本文是“用iptales實現(xiàn)包過慮型防火墻”的姊妹篇,主要介紹如何使用iptbales實現(xiàn)linux2.4下的強大的NAT功能。關(guān)于iptables的詳細(xì)語法請參考“用iptales實現(xiàn)包過慮型防火墻”一文。需要申明的是,本文絕對不是NAT-HOWTO的簡單重復(fù)或是中文版,在整個的敘述過程中,作者都在試圖用自己的語言來表達(dá)自己的理解,自己的思想。(2002-06-24 14:30:19)
By 書生
1.概述
1.1 什么是NAT
在傳統(tǒng)的標(biāo)準(zhǔn)的TCP/IP通信過程中,所有的路由器僅僅是充當(dāng)一個中間人的角色,也就是通常所說的存儲轉(zhuǎn)發(fā),路由器并不會對轉(zhuǎn)發(fā)的數(shù)據(jù)包進(jìn)行修改,更為確切的說,除了將源MAC地址換成自己的MAC地址以外,路由器不會對轉(zhuǎn)發(fā)的數(shù)據(jù)包做任何修改。NAT(Network Address Translation網(wǎng)絡(luò)地址翻譯)恰恰是出于某種特殊需要而對數(shù)據(jù)包的源ip地址、目的ip地址、源端口、目的端口進(jìn)行改寫的操作。
1.2 為什么要進(jìn)行NAT
我們來看看再什么情況下我們需要做NAT。
假設(shè)有一家ISP提供園區(qū)Internet接入服務(wù),為了方便管理,該ISP分配給園區(qū)用戶的IP地址都是偽IP,但是部分用戶要求建立自己的WWW服務(wù)器對外發(fā)布信息,這時候我們就可以通過NAT來提供這種服務(wù)了。我們可以再防火墻的外部網(wǎng)卡上綁定多個合法IP地址,然后通過NAT技術(shù)使發(fā)給其中某一個IP地址的包轉(zhuǎn)發(fā)至內(nèi)部某一用戶的WWW服務(wù)器上,然后再將該內(nèi)部WWW服務(wù)器響應(yīng)包偽裝成該合法IP發(fā)出的包。
再比如使用撥號上網(wǎng)的網(wǎng)吧,因為只有一個合法的IP地址,必須采用某種手段讓其他機器也可以上網(wǎng),通常是采用代理服務(wù)器的方式,但是代理服務(wù)器,尤其是應(yīng)用層代理服務(wù)器,只能支持有限的協(xié)議,如果過了一段時間后又有新的服務(wù)出來,則只能等待代理服務(wù)器支持該新應(yīng)用的升級版本。如果采用NAT來解決這個問題,
因為只在應(yīng)用層以下進(jìn)行處理,不但可以獲得很高的訪問速度,而且可以無縫的支持任何新的服務(wù)或應(yīng)用。
還有一個方面的應(yīng)用就是重定向,也就是當(dāng)接收到一個包后,不是轉(zhuǎn)發(fā)這個包,而是將其重定向到系統(tǒng)上的某一個應(yīng)用程序。最常見的應(yīng)用就是和squid配合使用成為透明代理,在對http流量進(jìn)行緩存的同時,可以提供對Internet的無縫訪問。
1.3 NAT的類型
在linux2.4的NAT-HOWTO中,作者從原理的角度將NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是改變轉(zhuǎn)發(fā)數(shù)據(jù)包的源地址,所謂DNAT就是改變轉(zhuǎn)發(fā)數(shù)據(jù)包的目的地址。
2.原理
下圖是linux2.4的原理圖:
nat原理圖
在“用iptales實現(xiàn)包過慮型防火墻”一文中我們說過,netfilter是Linux 核心中一個通用架構(gòu),它提供了一系列的"表"(tables),每個表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數(shù)條規(guī)則(rule)組成。并且系統(tǒng)缺省的表是"filter"。但是在使用NAT的時候,我們所使用的表不再是"filter",而是"nat"表,所以我們必須使用"-t nat"選項來顯式地指明這一點。因為系統(tǒng)缺省的表是"filter",所以在使用filter功能時,我們沒有必要顯式的指明"-t filter"。
同filter表一樣,nat表也有三條缺省的"鏈"(chains),這三條鏈也是規(guī)則的容器,它們分別是:
* PREROUTING:可以在這里定義進(jìn)行目的NAT的規(guī)則,因為路由器進(jìn)行路由時只檢查數(shù)據(jù)包的目的ip地址,所以為了使數(shù)據(jù)包得以正確路由,我們必須在路由之前就進(jìn)行目的NAT;
* POSTROUTING:可以在這里定義進(jìn)行源NAT的規(guī)則,系統(tǒng)在決定了數(shù)據(jù)包的路由以后在執(zhí)行該鏈中的規(guī)則。
* OUTPUT:定義對本地產(chǎn)生的數(shù)據(jù)包的目的NAT規(guī)則。
3.操作語法
如前所述,在使用iptables的NAT功能時,我們必須在每一條規(guī)則中使用"-t nat"顯示的指明使用nat表。然后使用以下的選項:
3.1 對規(guī)則的操作
* 加入(append) 一個新規(guī)則到一個鏈 (-A)的最后。
* 在鏈內(nèi)某個位置插入(insert) 一個新規(guī)則(-I),通常是插在最前面。
* 在鏈內(nèi)某個位置替換(replace) 一條規(guī)則 (-R)。
* 在鏈內(nèi)某個位置刪除(delete) 一條規(guī)則 (-D)。
* 刪除(delete) 鏈內(nèi)第一條規(guī)則 (-D)。
3.2 指定源地址和目的地址
通過--source/--src/-s來指定源地址(這里的/表示或者的意思,下同),通過--destination/--dst/-s來指定目的地址?梢允褂靡韵滤闹蟹椒▉碇付╥p地址:
1. 使用完整的域名,如“www.linuxaid.com.cn”;
2. 使用ip地址,如“192.168.1.1”;
3. 用x.x.x.x/x.x.x.x指定一個網(wǎng)絡(luò)地址,如“192.168.1.0/255.255.255.0”;
4. 用x.x.x.x/x指定一個網(wǎng)絡(luò)地址,如“192.168.1.0/24”這里的24表明了子網(wǎng)掩碼的有效位數(shù),這是UNIX環(huán)境中通常使用的表示方法。缺省的子網(wǎng)掩碼數(shù)是32,也就是說指定192.168.1.1等效于192.168.1.1/32。
3.3 指定網(wǎng)絡(luò)接口
可以使用--in-interface/-i或--out-interface/-o來指定網(wǎng)絡(luò)接口。從NAT的原理可以看出,對于PREROUTING鏈,我們只能用-i指定進(jìn)來的網(wǎng)絡(luò)接口;而對于POSTROUTING和OUTPUT我們只能用-o指定出去的網(wǎng)絡(luò)接口。
3.4 指定協(xié)議及端口
可以通過--protocol/-p選項來指定協(xié)議,如果是udp和tcp協(xié)議,還可--source-port/--sport和 --destination-port/--dport來指明端口。
4.準(zhǔn)備工作
4.1 編譯內(nèi)核,編譯時選中以下選項,具體可參看“用iptales實現(xiàn)包過慮型防火墻”一文:
<M>;Full NAT
<M>; MASQUERADE target support
<M>; REDIRECT target support
4.2 要使用NAT表時,必須首先載入相關(guān)模塊:
modprobe ip_tables
modprobe ip_nat_ftp
iptable_nat 模塊會在運行時自動載入。
5.使用實例
5.1 源NAT(SNAT)
比如,更改所有來自192.168.1.0/24的數(shù)據(jù)包的源ip地址為1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4
這里需要注意的是,系統(tǒng)在路由及過慮等處理直到數(shù)據(jù)包要被送出時才進(jìn)行SNAT。
有一種SNAT的特殊情況是ip欺騙,也就是所謂的Masquerading,通常建議在使用撥號上網(wǎng)的時候使用,或者說在合法ip地址不固定的情況下使用。比如
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
可以看出,這時候我們沒有必要顯式的指定源ip地址等信息。
5.2 目的SNAT(DNAT)
比如,更改所有來自192.168.1.0/24的數(shù)據(jù)包的目的ip地址為1.2.3.4:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4
這里需要注意的是,系統(tǒng)是先進(jìn)行DNAT,然后才進(jìn)行路由及過慮等操作。
有一種DNAT的特殊情況是重定向,也就是所謂的Redirection,這時候就相當(dāng)于將符合條件的數(shù)據(jù)包的目的ip地址改為數(shù)據(jù)包進(jìn)入系統(tǒng)時的網(wǎng)絡(luò)接口的ip地址。通常是在與squid配置形成透明代理時使用,假設(shè)squid的監(jiān)聽端口是3128,我們可以通過以下語句來將來自192.168.1.0/24,目的端口為80的數(shù)據(jù)包重定向到squid監(jiān)聽端口:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-port 3128
6.綜合例子
6.1 使用撥號帶動局域網(wǎng)上網(wǎng)
小型企業(yè)、網(wǎng)吧等多使用撥號網(wǎng)絡(luò)上網(wǎng),通常可能使用代理,但是考慮到成本、對協(xié)議的支持等因素,建議使用ip欺騙方式帶動區(qū)域網(wǎng)上網(wǎng)。
成功升級內(nèi)核后安裝iptables,然后執(zhí)行以下腳本:
#載入相關(guān)模塊
modprobe ip_tables
modprobe ip_nat_ftp
#進(jìn)行ip偽裝
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
6.2 ip映射
假設(shè)有一家ISP提供園區(qū)Internet接入服務(wù),為了方便管理,該ISP分配給園區(qū)用戶的IP地址都是偽IP,但是部分用戶要求建立自己的WWW服務(wù)器對外發(fā)布信息。我們可以再防火墻的外部網(wǎng)卡上綁定多個合法IP地址,然后通過ip映射使發(fā)給其中某一個IP地址的包轉(zhuǎn)發(fā)至內(nèi)部某一用戶的WWW服務(wù)器上,然后再將該內(nèi)部WWW服務(wù)器響應(yīng)包偽裝成該合法IP發(fā)出的包。
我們假設(shè)以下情景:
該ISP分配給A單位www服務(wù)器的ip為:
偽ip:192.168.1.100
真實ip:202.110.123.100
該ISP分配給B單位www服務(wù)器的ip為:
偽ip:192.168.1.200
真實ip:202.110.123.200
linux防火墻的ip地址分別為:
內(nèi)網(wǎng)接口eth1:192.168.1.1
外網(wǎng)接口eth0:202.110.123.1
然后我們將分配給A、B單位的真實ip綁定到防火墻的外網(wǎng)接口,以root權(quán)限執(zhí)行以下命令:
ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
成功升級內(nèi)核后安裝iptables,然后執(zhí)行以下腳本:
#載入相關(guān)模塊
modprobe ip_tables
modprobe ip_nat_ftp
首先,對防火墻接收到的目的ip為202.110.123.100和202.110.123.200的所有數(shù)據(jù)包進(jìn)行目的NAT(DNAT):
iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
其次,對防火墻接收到的源ip地址為192.168.1.100和192.168.1.200的數(shù)據(jù)包進(jìn)行源NAT(SNAT):
iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200
這樣,所有目的ip為202.110.123.100和202.110.123.200的數(shù)據(jù)包都將分別被轉(zhuǎn)發(fā)給192.168.1.100和192.168.1.200;而所有來自192.168.1.100和192.168.1.200的數(shù)據(jù)包都將分別被偽裝成由202.110.123.100和202.110.123.200,從而也就實現(xiàn)了ip映射。 |
|