国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
IPTABLES手冊
標(biāo)題: IPTABLES手冊

Linux安全應(yīng)用—構(gòu)建以防火墻為核心的安全管理系統(tǒng)
——NETFILTER/IPTABLES手冊
[文檔編號 SS-ver001]
上海
電話:13817668606
聯(lián)系方式:little_eyes@citiz.net
互聯(lián)網(wǎng)址:暫無

前言
概述
這是一篇以介紹在Linux操作系統(tǒng)平臺上構(gòu)建防火墻系統(tǒng)(Netfilter/Iptables)為主的科技文檔,旨在幫助使用者在較短的時間內(nèi)掌握管理和配置要領(lǐng),為企業(yè)的網(wǎng)絡(luò)安全提供相關(guān)的安全保障。
本文是《Linux安全應(yīng)用——構(gòu)建以防火墻為核心的安全管理系統(tǒng)》一文的姐妹篇,如果把那篇文章看成是What is it?那么,本文則以技術(shù)細(xì)節(jié)為主,即How to do?關(guān)于為什么要使用基于Linux操作系統(tǒng)平臺的防火墻系統(tǒng)的原因,
本文共分為兩部分,第一部分具體介紹了Netfilter/Iptables的運行機制和配置管理方法,這是全文中最核心的一部分。第二部分給出了一些具體的范例腳本供系統(tǒng)管理員參考。
鑒于筆者水平有限,文中有錯誤的地方望不吝賜教。
適用對象
本文首先是為各個企業(yè)的網(wǎng)絡(luò)系統(tǒng)管理員撰寫的,無論是那些已經(jīng)使用了基于Netfilter/Iptables防火墻系統(tǒng)的企業(yè),還是那些正準(zhǔn)備使用它的企業(yè),本文的內(nèi)容都非常適合為系統(tǒng)管理員們提供參考。
對于那些Linux的個人用戶和愛好者,本文也不失為一篇相當(dāng)有價值的參考文檔,其中,相當(dāng)一部分內(nèi)容深入淺出的講解能幫助讀者很快的理解和掌握Netfilter/Iptables的精髓。
對于希望通過本文了解Netfilter/Iptables的讀者,應(yīng)至少具備一定的Linux操作系統(tǒng)的應(yīng)用基礎(chǔ),比如文件操作、網(wǎng)絡(luò)配置操作等,當(dāng)然,如果使用者還具備一定的編譯核心的能力那是在好不過的了。
為了更好的配置防火墻系統(tǒng),使用者除了掌握Netfilter/Iptables本身的配置管理技巧外,掌握一定的TCP/IP網(wǎng)絡(luò)知識也是必須的,比如在缺省情況下,應(yīng)該知道SMTP(Simple Mail Transfer Protocol)協(xié)議使用TCP25端口做為其對外提供服務(wù)的端口,F(xiàn)TP(File Transfer Protocol)協(xié)議在建立連接的整個過程中,會與客戶端建立兩條連接,一條是用戶傳輸數(shù)據(jù)的,另一條則是用戶控制傳輸?shù)摹?br>資源列表
Netfilter/Iptables的官方網(wǎng)站:
http://www.netfilter.org

在Netfilter 的官方網(wǎng)站,用戶能夠下載Iptables的最新的源代碼,Iptables的使用說明文檔,F(xiàn)AQ和Mail List,這個站點是有關(guān)Netfilter/Iptables最權(quán)威、最全面的地方,在這里,你幾乎能夠找到和Netfilter/iptables相關(guān)的所有幫助和技術(shù)支持。
術(shù)語
文中包含了一些術(shù)語,也許讀者對其中的一部分似曾相識,但又并不完全理解其正確的含義,或者和其他相關(guān)安全產(chǎn)品的概念混淆了。這里有一些解釋,并說明了本文中如何使用它們。
DNAT - Destination Network Address Translation 目的網(wǎng)絡(luò)地址轉(zhuǎn)換。 DNAT是一種改變數(shù)據(jù)包目的IP地址的技術(shù),這種技術(shù)經(jīng)常用于將內(nèi)部網(wǎng)絡(luò)(RFC1918定義的地址段)的服務(wù)器通過公有的可路由IP地址發(fā)布到 Internet上,通過對同一個IP地址分配不同的端口,來決定數(shù)據(jù)的流向。
SNAT - Source Network Address Translation源網(wǎng)絡(luò)地址轉(zhuǎn)換。這是一種改變數(shù)據(jù)包源IP地址的技術(shù),經(jīng)常用來使多臺計算機分享一個Internet地址。這只在IPv4中使用,因為IPv4的地址已快用完了,IPv6將解決這個問題。IPv6使得地球上每一粒沙子大小的空間都能夠分配到一個IP地址,因此IPv6不存在地址空間短缺的問題。
State - 狀態(tài) 指明數(shù)據(jù)包處于什么狀態(tài)。狀態(tài)在RFC 793 - Transmission Control Protocol中定義,或由用戶在Netfilter/iptables中自定義。需要注意的是Netfilter設(shè)定了一些關(guān)于連接和數(shù)據(jù)包的狀態(tài),但沒有完全使用使用RFC 793的定義。
User space - 用戶空間,指在內(nèi)核外部或發(fā)生在內(nèi)核外部的任何東西。例如,調(diào)用 iptables -h 發(fā)生在內(nèi)核外部,但iptables -A FORWARD -p tcp -j ACCEPT(部分地)發(fā)生在內(nèi)核內(nèi)部,因為一條新的規(guī)則加入了規(guī)則集。
Kernel space - 內(nèi)核空間 ,與用戶空間相對,指那些發(fā)生在內(nèi)核內(nèi)部。
target - 這個詞在后文中有大量的應(yīng)用,它表示對匹配的數(shù)據(jù)包所做的操作,如ACCEPT、DROP、REDIRECT等等。
約定
本文中涉及的命令、范例都是以Redhat Linux操作系統(tǒng)平臺為基礎(chǔ)的,盡管在絕大多數(shù)的情況下,Linux的大多數(shù)命令都是獨立于發(fā)行版本的,但每個發(fā)行版本之間或多或少的存在微小的區(qū)別。
本文中的命令以黑體5號宋體字表示,如下例:
#iptables-restore /etc/sysconfig/iptables
本文中涉及到的命令、范例腳本都經(jīng)過我們的嚴(yán)格測試,能夠保證使用者按照文中介紹的做法正確配置防火墻,當(dāng)然,每一個用戶的網(wǎng)絡(luò)環(huán)境都是不一樣的,具體的配置還需要用戶根據(jù)自己的具體情況來適當(dāng)調(diào)整。
致謝
在撰寫本文時,參考了Oskar Andreasson的《iptables tutorial 1.1.19》一文,由于本人英語水平有限,因此額外參考了中國Linux公社里的Linux新鮮社員sllscn的翻譯稿,在此向他們兩人表示謝意。
第一章 構(gòu)建Netfilter/Iptsbles防火墻系統(tǒng)
1.1 獲取iptables
iptables可以從http://www.netfilter.org下載,該網(wǎng)站是netfilter/iptables最專業(yè)的網(wǎng)站,由Harald Welte、Jozsef Kadlecsik、Martin Josefsson、Patrick McHardy等核心成員進行維護,此外,還有眾多的iptables的使用者和開發(fā)者為網(wǎng)站提供了大量的文檔和更新代碼。
1.2 編譯內(nèi)核
在一般情況下,我們采用的Linux的distribution比如Redhat都會幫我們安裝好Iptables,而且netfilter的核心層也被以模塊(Modules)的方式編譯進了核心,所以,在絕大多數(shù)的情況下,我們是不需要對核心進行重新編譯的。
當(dāng)然,我們寫這篇文檔的用意決不僅限于教會用戶使用幾個命令來管理iptables,所以,我們還是來描述一下如何編譯核心以使Linux在核心層能夠支持?jǐn)?shù)據(jù)包過濾。
編譯核心的準(zhǔn)備工作當(dāng)然是必需有Linux Kernel的源代碼,在源代碼文件的目錄/usr/src/linux-2.4(這個目錄一般是個鏈接文件)中輸入:
#make menuconfig
會出現(xiàn)如下的畫面:

在圖中高亮顯示的地方回車進入Networking options的核心配置頁面,

將高亮顯示的部分編譯進核心,在該配置頁面內(nèi),還有一處需要注意,就是Netfilter Configuration的配置頁面,在該處回車即可進入配置界面:

從圖中可以看到,左面尖括號內(nèi)的“M”代表該選項被編譯成核心模塊,僅在系統(tǒng)需要時才被裝載入核心空間,由于模塊化的核心是不占用核心本身的空間的,因此,對于這些選項,除非肯定不會用到的以外,其他的都可以選擇編譯成核心模塊,但有些是必須的,如
Connection tracking——用于支持狀態(tài)鏈接跟蹤功能
FTP protocol support——用于支持對Ftp協(xié)議的連接跟蹤機制
IP tables support——用于支持包過濾
Connection state match support——用戶支持連接狀態(tài)匹配
MASQUERADE target support——支持地址偽裝功能
Multiport match support——支持多端口匹配,這對于設(shè)置過濾規(guī)則非常有好處
REDIRECT target support——如果你想使用iptables將特定的流量交給特定的**程序如squid來處理,這個選項需要被編譯進核心模塊
這些選項選擇完成后,按照核心編譯的方法對配置好的核心進行編譯即可:
#make dep
#make bzImage
#make install
#make modules
#make modules_install
1.3 iptables的編譯和安裝
就象我們在上節(jié)中說到的一樣,如果采用諸如Redhat之類的Linux Distribution,在安裝系統(tǒng)時,Iptables已經(jīng)被做為缺省的軟件安裝到系統(tǒng)上了,用戶不需要另行安裝,如果用戶需要另外安裝新版本的iptables軟件,可以到http://www.netfilter.org的網(wǎng)站下...本是1.2.9。
從網(wǎng)站上下載的源代碼是“tar.bz2”格式的,編譯源代碼的第一步工作是解壓縮,命令如下:
#/bin/tar xjvf iptables-1.2.9.tar.bz2
解壓縮后,進入源代碼的安裝目錄,開始編譯:
#make KERNEL_DIR=/usr/src/linux/
如果一切正常,那么iptables應(yīng)該編譯好了,接下來可以進行安裝了,安裝命令非常簡單:
#make install KERNEL_DIR=/usr/src/linux/
怎么樣?簡單吧,當(dāng)然,如果這時您的系統(tǒng)核心還沒有將netfilter/iptables編譯進去,那么安裝了iptables軟件是沒有多大意義的。
1.4 iptables的啟動和關(guān)閉
在Redhat Linux上,由于歷史的原因,ipchains和iptables是并存的(ipchains是在kerenl版本2.4.x以前的包過濾防火墻系統(tǒng)),因此ipchains和iptables同時運行是不允許的,我們首先要將ipchains的服務(wù)停掉:
#/sbin/chkconfig –level 123456 ipchains off
#/sbin/service ipchains stop
當(dāng)然,既然不使用ipchains了,我們也可以將ipchains從系統(tǒng)中移除,使用命令:
#rpm –e ipchains
第二步是啟動Iptables的服務(wù)
#/sbin/chkconfig –level 345 iptables on
#/sbin/service iptables start
chkconfig命令表示在系統(tǒng)啟動時,ipchains或iptables在相應(yīng)啟動級別的缺省設(shè)置,如果是off,則代表系統(tǒng)啟動時不啟動ipchains或iptables服務(wù)。反之,則啟動。
1.5 iptables的工作原理和基礎(chǔ)架構(gòu)
iptables 被分為兩部分,一部分被稱為核心空間,另一部分稱為用戶空間,在核心空間,iptables從底層實現(xiàn)了數(shù)據(jù)包過濾的各種功能,比如NAT、狀態(tài)檢測以及高級的數(shù)據(jù)包的匹配策略等,在用戶空間,iptables為用戶提供了控制核心空間工作狀態(tài)的命令集。無論如何,一個數(shù)據(jù)包都會經(jīng)過下圖所示的路徑,并在其中的任何一條路徑中被處理。
首先,當(dāng)一個包進來的時候,也就是從以太網(wǎng)卡進入防火墻,內(nèi)核首先根據(jù)路由表決 定包的目標(biāo)。如果目標(biāo)主機就是本機,則如下圖直接進入INPUT鏈,再由本地正在等待該包的進程接收,否則,如果從以太網(wǎng)卡進來的包目標(biāo)不是本機,再看是否內(nèi)核允許轉(zhuǎn)發(fā)包(可用 echo 1 > /proc/sys/net/ipv4/ip_forward 打開轉(zhuǎn)發(fā)功能如果不允許轉(zhuǎn)發(fā),則包被DROP掉,如果允許轉(zhuǎn)發(fā),則送出本機,這當(dāng)中決不經(jīng)過INPUT或者OUTPUT鏈,因為路由后的目標(biāo)不是本機,只被轉(zhuǎn)發(fā)規(guī)則應(yīng)用,最后,該linux防火墻主機本身能夠產(chǎn)生包,這種包只經(jīng)過OUTPUT鏈被送出防火墻。

現(xiàn)在,我們來討論為什么iptables叫iptables,這句話挺別扭是嗎?但iptables的名字起的確實如其名,我們可以叫它ip表,在iptables**有三類表,分別是mangle、nat和filter。
mangle表從目前來看,他的作用對于滿足常規(guī)的防火墻應(yīng)用作用不大,我們在這里不進行具體的描述。
nat表的作用在于對數(shù)據(jù)包的源或目的IP地址進行轉(zhuǎn)換,這種應(yīng)用也許只會在IPv4的網(wǎng)絡(luò)中適用,nat表又可主要分為三條鏈,如下:
DNAT:DNAT操作主要用在這樣一種情況下,你有一個合法的IP地址,要把對防火墻的訪問重定向到其他的機子上,比如DMZ。也就是說,我們改變的是目的地址,以使包能重路由到某臺主機上。
SNAT: SNAT改變包的源地址,這在極大程度上可以隱藏你的本地網(wǎng)絡(luò)或者DMZ等。一個很好的例子是我們知道防火墻的外部地址,但必須用這個地址替換本地網(wǎng)絡(luò)地址。有了這個操作,防火墻就能自動地對包做SNAT,以使LAN能連接到Internet。如果使用類似 192.168.0.0/24這樣的地址,是不會從Internet得到任何回應(yīng)的。因為RFC1918定義了這些網(wǎng)絡(luò)為私有的,只能用于LAN內(nèi)部。
MASQUERADE: MASQUERADE的作用和SNAT完全一樣,只是計算機的負(fù)荷稍微多一點。因為對每個匹配的包,MASQUERADE都要查找可用的IP地址,而不象 SNAT用的IP地址是配置好的。當(dāng)然,這也有好處,就是如果我們使用諸如PPPOE等撥號的方式連接Internet,這些地址都是由ISP的隨機分配的,這時使用MASQUERADE是非常好的一個解決方案。
filter 表用來過濾數(shù)據(jù)包,我們可以在任何時候匹配包并過濾它們。我們就是在這里根據(jù)包的內(nèi)容對包做DROP或ACCEPT的。當(dāng)然,我們也可以預(yù)先在其他地方做些過濾,但是這個表才是設(shè)計用來過濾的。幾乎所有的target都可以在這兒使用。
1.6 狀態(tài)機制
狀態(tài)機制是iptables中較為特殊的一部分,這也是iptables和比較老的ipchains的一個比較大的區(qū)別之一,運行狀態(tài)機制(連接跟蹤)的防火墻稱作帶有狀態(tài)機制的防火墻,以下簡稱為狀態(tài)防火墻。狀態(tài)防火墻比非狀態(tài)防火墻要安全,因為它允許我們編寫更嚴(yán)密的規(guī)則。
在iptables上一共有四種狀態(tài),分別被稱為NEW、ESTABLISHED、INVALID、RELATED,這四種狀態(tài)對于TCP、UDP、ICMP三種協(xié)議均有效。下面,我們來分別闡述四種狀態(tài)的特性。
NEW:NEW說明這個包是我們看到的第一個包。意思就是,這是conntrack模塊看到的某個連接的第一個包,它即將被匹配了。比如,我們看到一個SYN 包,是我們所留意的連接的第一個包,就要匹配它。
ESTABLISHED: ESTABLISHED已經(jīng)注意到兩個方向上的數(shù)據(jù)傳輸,而且會繼續(xù)匹配這個連接的包。處于ESTABLISHED狀態(tài)的連接是非常容易理解的。只要發(fā)送并接到應(yīng)答,連接就是ESTABLISHED的了。一個連接要從NEW變?yōu)镋STABLISHED,只需要接到應(yīng)答包即可,不管這個包是發(fā)往防火墻的,還是要由防火墻轉(zhuǎn)發(fā)的。ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發(fā)出的信息的應(yīng)答。
RELATED: RELATED是個比較麻煩的狀態(tài)。當(dāng)一個連接和某個已處于ESTABLISHED狀態(tài)的連接有關(guān)系時,就被認(rèn)為是RELATED的了。換句話說,一個連接要想是RELATED的,首先要有一個ESTABLISHED的連接。這個ESTABLISHED連接再產(chǎn)生一個主連接之外的連接,這個新的連接就是 RELATED的了,當(dāng)然前提是conntrack模塊要能理解RELATED。ftp是個很好的例子,F(xiàn)TP-data 連接就是和FTP-control有關(guān)聯(lián)的,如果沒有在iptables的策略中配置RELATED狀態(tài),F(xiàn)TP-data的連接是無法正確建立的,還有其他的例子,比如,通過IRC的DCC連接。有了這個狀態(tài),ICMP應(yīng)答、FTP傳輸、DCC等才能穿過防火墻正常工作。注意,大部分還有一些UDP協(xié)議都依賴這個機制。這些協(xié)議是很復(fù)雜的,它們把連接信息放在數(shù)據(jù)包里,并且要求這些信息能被正確理解。
INVALID:INVALID說明數(shù)據(jù)包不能被識別屬于哪個連接或沒有任何狀態(tài)。有幾個原因可以產(chǎn)生這種情況,比如,內(nèi)存溢出,收到不知屬于哪個連接的ICMP錯誤信息。一般地,我們DROP這個狀態(tài)的任何東西,因為防火墻認(rèn)為這是不安全的東西。
每個狀態(tài)相對于不同的第四層協(xié)議來講,稍微有些區(qū)別,對于TCP協(xié)議來說,當(dāng)防火墻收到第一個數(shù)據(jù)包,也就是SYN報文時,將該會話標(biāo)記為NEW狀態(tài),在系統(tǒng)的/proc/net/目錄下,可以查閱文件ip_conntrack,這是在內(nèi)存空間里存放防火墻當(dāng)前狀態(tài)表的臨時文件,對于NEW狀態(tài)的記錄如下:
tcp 6 117 SYN_SENT src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 [UNREPLIED] src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
從上面的記錄可以看出,SYN_SENT狀態(tài)被設(shè)置了,這說明連接已經(jīng)發(fā)出一個SYN包,但應(yīng)答還沒發(fā)送過來,這可從[UNREPLIED]標(biāo)志看出,當(dāng)服務(wù)器端回應(yīng)了SYN/ACK包后,狀態(tài)表改寫為:
tcp 6 57 SYN_RECV src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
現(xiàn)在我們已經(jīng)收到了相應(yīng)的SYN/ACK包,狀態(tài)也變?yōu)镾YN_RECV,這說明最初發(fā)出的SYN包已正確傳輸,并且SYN/ACK包也到達了防火墻。 這就意味著在連接的兩方都有數(shù)據(jù)傳輸,因此可以認(rèn)為兩個方向都有相應(yīng)的回應(yīng)。
接下來,TCP三次握手的隨后一個報文ACK包也到達了防火墻,防火墻上的狀態(tài)表變成了:
tcp 6 431999 ESTABLISHED src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
現(xiàn)在,我們來看看UDP協(xié)議的狀態(tài)描述方法,從協(xié)議本身的特性來看,UDP連接是無狀態(tài)的,因為它沒有任何的連接建立和關(guān)閉過程。以某個順序收到的兩個數(shù)據(jù)包是無法確定它們的發(fā)出順序的。但內(nèi)核仍然可以對UDP連接設(shè)置狀態(tài)。我們來看看是如何跟蹤UDP連接的,以及在核心目錄 /proc/net/ip_conntrack的相關(guān)記錄。
當(dāng)?shù)谝粋€UDP的數(shù)據(jù)包到達防火墻后,防火墻在他的狀態(tài)表中留下了這樣的記錄:
udp 17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
UNREPLIED代表這是一個狀態(tài)為NEW的數(shù)據(jù)包,當(dāng)這條連接的回應(yīng)數(shù)據(jù)包到達防火墻后,防火墻立即將修改這條狀態(tài)記錄:
udp 17 160 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
在這條新的狀態(tài)記錄中,UNREPLIED被刪除了,這代表現(xiàn)在防火墻已經(jīng)建立了一條UDP協(xié)議的會話,但這里并沒有象TCP協(xié)議那樣顯示 ESTABLISHED標(biāo)記,這是TCP的狀態(tài)記錄和UDP的狀態(tài)記錄稍微不同的一個地方,當(dāng)然,還有一個地方需要注意,在測試中,還需要有一些數(shù)據(jù)包經(jīng)過,防火墻才會將狀態(tài)記錄改寫成:
udp 17 179 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 [ASSURED] use=1
ASSURED狀態(tài)表示當(dāng)前有數(shù)據(jù)在進行傳輸,表面當(dāng)前連接的狀態(tài)是ACTIVE的。如果,在這個狀態(tài)下數(shù)據(jù)停止了傳輸,則這條記錄會有一個計時器,也就是記錄中的第三個字段,上面這條記錄的第三個字段是179,代表當(dāng)前的ASSURED狀態(tài)還能夠保持179秒,如果還有新的數(shù)據(jù)包經(jīng)過,那么計時器會被重新設(shè)置成缺省的180秒,如果在180秒內(nèi)都沒有流量,那么這條狀態(tài)記錄就會從狀態(tài)表中被刪除。
最后,我們在來看看Linux kernel是如何標(biāo)示ICMP協(xié)議的狀態(tài)的,ICMP也是一種無狀態(tài)協(xié)議,它只是用來控制而不是建立連接。ICMP包有很多類型,但只有四種類型有應(yīng)答包,它們是回顯請求和應(yīng)答(Echo request and reply),時間戳請求和應(yīng)答(Timestamp request and reply),信息請求和應(yīng)答(Information request and reply),還有地址掩碼請求和應(yīng)答(Address mask request and reply),這些包有兩種狀態(tài),NEW和ESTABLISHED 。時間戳請求和信息請求已經(jīng)廢除不用了,回顯請求還是常用的,比如ping命令就用的到,地址掩碼請求不太常用,但是可能有時很有用并且值得使用??纯聪旅娴膱D,就可以大致了解ICMP連接的NEW和ESTABLISHED狀態(tài)了。

如圖所示,主機向目標(biāo)發(fā)送一個回顯請求,防火墻就認(rèn)為這個包處于NEW狀態(tài)。目標(biāo)回應(yīng)一個回顯應(yīng)答,防火墻就認(rèn)為包處于ESTABLISHED了。當(dāng)回顯請求被發(fā)送時,ip_conntrack里就有這樣的記錄了:
icmp 1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 type=0 code=0 id=33029 use=1
可以看到,ICMP的記錄和TCP、UDP的有點區(qū)別,協(xié)議名稱、超時時間和源、目地址都一樣,不同之處在于沒有了端口,而新增了三個新的字段:type,code和id。字段type說明ICMP的類型。code說明ICMP的代碼,這些代碼在附錄ICMP類型里有說明。id是 ICMP包的ID。每個ICMP包被發(fā)送時都被分配一個ID,接受方把同樣的ID 分配給應(yīng)答包,這樣發(fā)送方能認(rèn)出是哪個請求的應(yīng)答。
[UNREPLIED] 的含義和前面一樣,說明數(shù)的傳輸只發(fā)生在一個方向上,也就是說未收到應(yīng)答。再往后,是應(yīng)答包的源、目地址,還有相應(yīng)的三個新字段,要注意的是type和 code是隨著應(yīng)答包的不同而變化的,id和請求包的一樣。和前面一樣,應(yīng)答包被認(rèn)為是ESTABLISHED的。然而,在應(yīng)答包之后,這個ICMP 連接就不再有數(shù)據(jù)傳輸了。所以,一旦應(yīng)答包穿過防火墻,ICMP的連接跟蹤記錄就被銷毀了。因此,要想在/proc/ip_conntrack文件中抓到 ICMP協(xié)議的狀態(tài)記錄實在不是一件容易的事。您可以用如下的命令來嘗試獲取這些記錄:
#cat /proc/net/ip_conntrack | grep icmp
如果沒有輸出,那么就不停的重復(fù)這個命令,直到發(fā)現(xiàn)icmp的記錄為止。
以上各種情況,請求被認(rèn)為NEW,應(yīng)答是ESTABLISHED。換句話說,就是當(dāng)防火墻看到一個請求包時,就認(rèn)為連接處于NEW狀態(tài),當(dāng)有應(yīng)答時,就是ESTABLISHED狀態(tài)。
1.7 規(guī)則的保存和恢復(fù)
iptables提供了兩個命令來對策略進行保存和恢復(fù):iptables-save和iptables-restore,iptables-save用來保存當(dāng)前內(nèi)存空間的策略,iptables-restore用來將iptables配置文件的策略寫入內(nèi)存空間。
iptables-save的命令格式非常簡單:
#iptables-save –c > /etc/sysconfig/iptables
上面的命令表示將內(nèi)存中的策略寫入/etc/sysconfig/iptables文件中,同時將當(dāng)前內(nèi)存中針對每條策略的流量統(tǒng)計值也寫入該文件。
#iptables-save –t nat > /etc/sysconfig/iptables
這條命令表明只保存當(dāng)前內(nèi)存中的nat表。
#iptables-restore /etc/sysconfig/iptables
這條命令表明將/etc/sysconfig/iptables配置文件中的內(nèi)容寫入內(nèi)存空間,并覆蓋當(dāng)前內(nèi)存空間中的所有配置。如果不希望更改當(dāng)前內(nèi)存空間中的配置,可以添加-n參數(shù),如下:
#iptables-restore –n /etc/sysconfig/iptables
這表明配置文件只將內(nèi)存空間中沒有的策略添加到內(nèi)存空間。
另一種運行iptables的方法是使用腳本,使用腳本能夠?qū)崿F(xiàn)一些更靈活的、結(jié)構(gòu)化的配置策略,對于一些習(xí)慣使用腳本管理防火墻的系統(tǒng)管理員來說,這是一個更好的選擇,后面,我們會提供一些腳本范例。
1.8 編寫詳細(xì)的規(guī)則表
本節(jié)我們開始揭開iptables的神秘面紗,當(dāng)我們真正進入iptables的世界,我們發(fā)現(xiàn),這里的世界原來也很精彩。
iptables的所有命令都是以iptables開頭,其總體的命令結(jié)構(gòu)如下:
iptables [-t table] command [match] [target/jump]
1.8.1 table
-t table表示當(dāng)前的策略屬于哪個table,前面,我們提到了,一共有三種table:mangle、filter和nat,由于iptables的主要工作是過濾進出本地網(wǎng)絡(luò)適配器的數(shù)據(jù)包,因此,很自然的,如果一條策略是關(guān)于過濾的,那么在缺省情況下,“-t filter”是可以省略的,而mangle和nat是一定要注明的,在實際的應(yīng)用環(huán)境當(dāng)中,mangle幾乎是用不到的,因此,在本文中,我們著重討論 nat表和filter表。
1.8.2 command
command指定iptables 對我們提交的規(guī)則要做什么樣的操作。這些操作可能是在某個表里增加或刪除一些東西,或做點兒其他什么。以下是iptables可用的command:
命令 -A,--append
范例 iptables –A INPUT……
注解 添加規(guī)則
命令 -D,--delete
范例 iptables –D INPUT 8,iptables –D FORWARD –p tcp –s 192.168.1.12 –j ACCEPT
注解 從所選的鏈中刪除規(guī)則,有兩種方法:一種是以編號來表示被刪除的規(guī)則,另一種是以整條的規(guī)則來匹配策略。
命令 -R,--replace
范例 iptables –R FORWARD 2 –p tcp –s 192.168.1.0 –j ACCEPT
注解 替換相應(yīng)位置的策略,這時有一點需要注意,如果源或目的地址是以名字而不是以IP地址表示的,如果解析出的IP地址多于一個,那么這條命令是失效的。
命令 -I,--insert
范例 iptables –I FORWARD 2 –p tcp –s 192.168.1.0 –j ACCEPT
注解 這個命令和上面一個命令只差一個參數(shù),而不同之處在于這個命令是在相應(yīng)的位置前面插入一條命令,而不是替換。
命令 -L,--list
范例 iptables –t nat –L,iptables –L INPUT
注解 列出當(dāng)前內(nèi)存空間的策略。
命令 -F,flush
范例 iptables –F,iptables –t nat -F
注解 清空所選的鏈的配置規(guī)則。
命令 -N,--new-chain
范例 iptables –N tcp_allowed
注解 添加新的鏈,在默認(rèn)情況下,iptables有ACCEPT、DROP、REJECT、LOG、REDIRECT等,如果希望對數(shù)據(jù)包做定制的處理,可以自己定義新的鏈。
命令 -X,--delete-chain
范例 iptables –X tcp_allowed
注解 這條命令用于刪除自定義的鏈。
命令 -P,--pollicy
范例 iptables –P INPUT DROP
注解 為鏈設(shè)置缺省的target,通常為ACCEPT和DROP,可以理解為防火墻的缺省策略:除非特定的被運行,其他的都被禁止或除非特定的被禁止,其他的都被允許。
上表列出了一些主要的iptables的命令,此外還有其他的一些命令不很常用,我們在這里不作介紹。這些命令有一些選項,要想詳細(xì)了解選項的具體內(nèi)容,可以查看iptables的manpage頁。
1.8.3 match
在iptables 的一條策略中,如何匹配一個數(shù)據(jù)包是非常關(guān)鍵的。這一節(jié),我們會詳細(xì)討論一些matche,大致可以歸為五類。第一類是generic matches(通用的匹配),適用于所有的規(guī)則;第二類是TCP matches,顧名思義,這只能用于TCP包;第三類是UDP matches,當(dāng)然它只能用在UDP包上了;第四類是ICMP matches ,針對ICMP包的;第五類比較特殊,針對的是狀態(tài)(state),所有者(owner)和訪問的頻率限制(limit)等。
通用匹配:無論我們使用的是何種協(xié)議,也不管我們又裝入了匹配的何種擴展,通用匹配都是可用的。也就是說,它們可以直接使用,而不需要什么前提條件,在后面你會看到,有很多匹配操作是需要其他的匹配作為前提的。
-p, –protocol,匹配指定的協(xié)議,協(xié)議可以用名字來表示,比如tcp、udp、icmp等,名字是部分大小寫的,也可以使用他們的整數(shù)值,比如tcp 對應(yīng)的是整數(shù)1、udp對應(yīng)17,tcp對應(yīng)6。在缺省情況下,如果不寫這個匹配,代表所有ALL,但要注意,ALL表示tcp、udp、icmp這三種協(xié)議,而不包括/etc/protocol中的所有協(xié)議。如果有多個協(xié)議需要匹配,可以使用逗號分割,例如:
#iptables –A INPUT –p tcp,udp –j ACCEPT
在協(xié)議的前面用“!”標(biāo)示,代表除了“邏輯非”,例如:
#iptables –A INPUT –p ! tcp –j DROP
這個表達式代表只允許tcp協(xié)議通過,而udp和icmp全部被禁止通過。
-s, --src, --source,匹配數(shù)據(jù)包的源地址,地址的表示形式如下:
單個地址,如192.168.1.1,也可寫成192.168.1.1/32或192.168.1.1/255.255.255.255
網(wǎng)絡(luò)地址,如192.168.1.0,也可寫成192.168.1.0/24或192.168.1.0/255.255.255.0
在地址前加“!”表示去反,如 ! 192.168.1.0表示除這個地址段外的所有地址。
如果不在一條策略中注明地址,表示所有地址,也可以表示成0.0.0.0/0
-d, --dst, –destination,匹配數(shù)據(jù)包的目的地址,表示方法于源地址的表示方法一致。
-i, --in-interface,以包進入本地所使用的接口來匹配數(shù)據(jù)包,注意,這個匹配只適用于INPUT、FORWARD、PREROUTING鏈中,而用在其他任何地方都會出錯??梢允褂媒涌诘拿Q來標(biāo)示數(shù)據(jù)包的入口,如eth0、ppp0等,也可以使用通配符,如eth+,表示匹配從所有的以太接口進入的數(shù)據(jù)包,和前面的一些匹配特性一樣,我們可以使用去反符號“!”來標(biāo)示除了被列出的接口的所有接口。
-o, --out-interface,以包離開本地所使用的接口來匹配數(shù)據(jù)包,匹配方法和-i的匹配方法完全一致
#iptables –A FORWORD –i eth0 –o eth1 –p tcp –j ACCEPT
上例說明了凡是從eth0接口進入,從eth1接口流出的tcp數(shù)據(jù)流被允許通過。
隱含匹配:這種匹配操作是自動地或隱含地裝載入內(nèi)核的。例如我們使用參數(shù)-p tcp 時,不需再裝入任何東西就可以匹配只有IP包才有的一些特點。有三種隱含的匹配針對三種不同的協(xié)議,即TCP matches,UDP matches和 ICMP matches。它們分別包括一套只適用于相應(yīng)協(xié)議的判別標(biāo)準(zhǔn)。相對于隱含匹配的是顯式匹配,它們必須使用-m或--match被明確地裝載,而不能是自動地或隱含地,下一節(jié)會介紹到。
tcp matches,該匹配只匹配tcp包的細(xì)節(jié),它們必須有-p tcp做為前提條件。主要有以下幾種匹配參數(shù):
--sport,--source-port,匹配源端口,有幾個原則需要注意:
1、不使用此項,則表示匹配所有端口。
2、可以使用服務(wù)名或端口號,使用服務(wù)名是為了簡化用戶的配置,也許用戶知道服務(wù)名,但不一定知道服務(wù)對應(yīng)的端口號,服務(wù)名必須在/etc/services 文件中進行標(biāo)注,當(dāng)然簡化配置的代價是iptables必須花費額外的系統(tǒng)資源在/etc/services文件中查詢服務(wù)名對應(yīng)的端口號,如果用戶知道服務(wù)名對應(yīng)的端口號,我們還是建議用戶直接使用端口號來定義。
3、可以使用連續(xù)的端口來表示一個服務(wù),比如 –sport 135:139,這表明是從135端口到139端口,也有這樣的表示方法 –sport 1024:,表示匹配源端口從1024到65535。
4、可以在端口號前添加“!”表示除了該端口以為的其他所有端口。
5、不能用這種匹配來標(biāo)識端口不連續(xù)的情況,我們會在后面的部分介紹如何匹配端口不連續(xù)的情況。
--dport,--destination-port,匹配目的端口,使用方法與源端口的匹配方法一致。
#iptables –A FORWARD –p tcp –dport 21:25 –j ACCEPT
上例中的語句表明允許tcp 21到25端口的服務(wù)通過防火墻。
udp matches:鑒于udp協(xié)議與tcp協(xié)議的相似之處:都用端口號來表示一個應(yīng)用或服務(wù),因此,udp matches的使用方法也和tcp matches的使用方法基本一致,它也有 --sport 、--dport 的匹配原則,但與tcp matches不同的是,udp matches必須與 –p udp配合使用,這是非常容易理解的問題。我們在這里就不需要多說了。
icmp matches:與tcp和udp不同,icmp matches是根據(jù)ICMP類型匹配包,類型的指定可以使用十進制數(shù)值或相應(yīng)的名字,數(shù)值在RFC792中有定義,名字可以用iptables --protocol icmp --help 查看。這個匹配也可用英文感嘆號取反,如:--icmp-type ! 8就表示匹配除類型8之外的所有ICMP包。人們經(jīng)常會使用到icmp協(xié)議,但最常用的可能要屬icmp echo-request和icmp echo-reply了,也就是我們檢測網(wǎng)絡(luò)連通性的ping命令了。
顯示匹配:顯示匹配就必須用-m或--match裝載,比如要使用狀態(tài)匹配就必須使用-m state。有些匹配還需要指定協(xié)議,有些就不需要,比如連接狀態(tài)就不要。這些狀態(tài)是NEW(還未建立好的連接的第一個包),ESTABLISHED(已建立的連接,也就是已經(jīng)在內(nèi)核里注冊過的),RELATED(由已經(jīng)存在的、處于已建立狀態(tài)的連接生成的新連接),等等。有些匹配還處在開發(fā)階段,或者還只是為了說明iptables的強大能力。這說明不是所有的匹配一開始就是實用的,但以后你可能會用到它。隨著iptables 新版本的發(fā)布,會有一些新的匹配可用。隱含匹配和顯式匹配最大的區(qū)別就是一個是跟隨協(xié)議匹配自動裝載的,一個是顯式裝載的。
limit匹配:這個匹配操作必須由-m limit明確指定才能使用。有了它的幫助,就可以對指定的規(guī)則的日志數(shù)量加以限制,以免系統(tǒng)記錄大量重復(fù)的日志信息。比如,你可以事先設(shè)定一個限定值,當(dāng)符合條件的包的數(shù)量不超過它時,就記錄;超過了,就不記錄。我們可以控制某條規(guī)則在一段時間內(nèi)的匹配次數(shù)(也就是可以匹配的包的數(shù)量),這樣就能夠減少 DoS syn flood攻擊的影響。
--limit-burst:這個參數(shù)定義了當(dāng)前策略的峰值,也就是單位時間內(nèi)匹配的數(shù)據(jù)包的最大數(shù)量,每匹配一個,數(shù)值就減一,直到0為止,新來的數(shù)據(jù)包將不被進行匹配操作,也可以將這一數(shù)值理解為允許建立連接的閥值。
--limit:這個參數(shù)定義了一個相當(dāng)于頻率的概念,在—limit-burst這個匹配項中我們已經(jīng)提到,當(dāng) --limit-burst定義的數(shù)值被耗盡,在單位時間內(nèi)是會得到適當(dāng)?shù)难a充的,這個頻率和數(shù)量就是在 --limit中定義的。
舉個例子也許更容易幫你理解 –limit-burst和 –limit組合使用的功效。具有再充值功能的電話卡(比如神州行卡)想必許多人都用過,設(shè)想這樣一種情況,某個人在新買的手機上一次性的充了300元錢的話費,然后以后每月月底都往卡里充100元的話費,但有兩個前提:
1、充值后的卡內(nèi)余額不得超過300元。
2、當(dāng)月能且只能充100元的話費。即便最初的300元話費全部用光了,也只能補充這么多的話費。
在上例中我們可以將那個300元話費看成 --limit-burst 定義的數(shù)值,將每月的100元話費看成 --limit定義的數(shù)值,記住 --limit 是有單位的,在iptables中,這個單位可以是second、min、hour、day。
我們可以用limit功能來做一些防止Dos攻擊的工作,看下面的例子:
#iptables –A INPUT –p tcp --dport 80 –m limit --limit 10/second --limit-burst 200 –j ACCEPT
上面的例子是在傳達這樣一個意思,主機的80端口對外開放,系統(tǒng)資源允許每秒新建立250個會話,主機通過iptables設(shè)置了能夠提供每秒200個新會話的容量(通常情況下,我們需要為服務(wù)器或主機本身考慮一些冗余),在正常情況下,這個數(shù)值完全能夠滿足應(yīng)用的要求,但如果有某個攻擊者對主機的80端口進行拒絕服務(wù)攻擊,每秒200個新會話的容量也許一會的功夫就被用光了,對于一個沒有保護措施的主機來講,系統(tǒng)馬上就會癱瘓,但由于我們設(shè)置了一定的保護措施,即便有攻擊過來,在iptables這一關(guān)就會被丟棄。在這之后,iptables會每秒重新給主機10個新的會話名額,使之能夠處理新的連接。在新來的連接請求中,有正常的連接請求,也有一些是攻擊,但無論如何,通過這種方式,我們保證了服務(wù)器始終不會被攻癱掉,在更有效的對付拒絕服務(wù)攻擊的新技術(shù)出現(xiàn)以前,這也許是最有效的方法。
MAC匹配:基于包的MAC源地址匹配包,地址格式只能是XX:XX:XX:XX:XX:XX,當(dāng)然它也可以用英文感嘆號取反,如--mac- source ! 00:00:00:00:00:01,意思很簡單了,就是除此之外的地址都可接受。注意,因為 MAC addresses只用于Ethernet類型的網(wǎng)絡(luò),所以這個match只能用于Ethernet接口。而且,它還只能在PREROUTING, FORWARD 和INPUT鏈里使用。
MAC匹配有一個非常好的應(yīng)用就是可以進行IP地址和MAC地址的綁定,對于一些安全要求較高的網(wǎng)絡(luò),這是一個有效的配置策略。
#iptables –A FORWARD –s 192.168.1.23 –m mac –mac-source 00:e0:4c:3d:5e:4f –j ACCEPT
上例表明源IP地址為192.168.1.23,源MAC地址為00:e0:4c:3d:5e:4f的計算機能夠通過防火墻,如果這個用戶將自己的IP地址改成了192.168.1.24,而該地址同樣也做了MAC地址的match,那么要想通過更改IP地址而獲取上網(wǎng)權(quán)限的企圖是徒勞的。
說明:可以通過iptables實現(xiàn)IP地址與MAC地址綁定的功能,但還有一種更加高效的方法,我們在這里簡要的說明一下,在/etc/目錄下編輯文件ethers,在文件中添加如下內(nèi)容:
192.168.1.1 00:e0:4c:3d:5e:4f
192.168.1.1 00:e0:4c:3d:5b:3d
…….
文件編輯完成后執(zhí)行命令:
#/sbin/arp –f
state匹配:state匹配在防火墻配置過程中非常重要的,如果沒有state的配置,那么需要配置雙向的規(guī)則才能滿足通訊的需要,但防火墻既然有狀態(tài)檢測功能,我們?yōu)槭裁床缓煤檬褂盟兀?br>--state:state的狀態(tài)有四種,指定要匹配包的的狀態(tài),當(dāng)前有4種狀態(tài)可用:INVALID,ESTABLISHED,NEW和RELATED。四種數(shù)據(jù)包的狀態(tài)我們在前面已經(jīng)做了詳細(xì)的描述本節(jié)我們只進行state的用法描述,如下例所示:
#iptables –A FORWARD –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT
本例表明凡是數(shù)據(jù)包狀態(tài)為“RELATED”、“ESTABLISHED”的tcp包允許通過防火墻,在一般情況下,基于狀態(tài)的策略都是配置在每一條 chain的最前面,因為當(dāng)包被匹配到以后,就能夠直接被處理了,這是一種比較高效的配置方法。關(guān)鍵字ESTABLISHED比較容易理解,即匹配狀態(tài)為 “已經(jīng)建立連接”的數(shù)據(jù)包,那么怎么理解“RELATED”呢,RELATED表示不屬于已經(jīng)建立的那條連接,但和那條連接有關(guān),比如ftp,ftp在建立連接的過程中會首先建立一條ftp-control連接用以傳輸指令等,真正傳輸數(shù)據(jù)的是一條叫做ftp-data的連接,而傳輸數(shù)據(jù)的連接是和傳輸控制信號的連接相關(guān)的,因此“RELATED”是用于類似這些特殊服務(wù)的。在正常情況下,對于每一種協(xié)議:TCP、UDP、ICMP都可以單獨的配置狀態(tài)策略,但一種比較簡單高效的做法是:
#iptables –A INPUT –p all –m state --state RELATED,ESTABLISHED –j ACCEPT
multiport:這個匹配選項為我們解決了如何在一條策略種匹配那些端口不連續(xù)的服務(wù),在一般情況下,一個公司或企業(yè)的安全策略是允許內(nèi)部網(wǎng)絡(luò)使用有限的Internet服務(wù),如收發(fā)電子郵件、上網(wǎng)瀏覽網(wǎng)頁、msn聊天等,看看下面的例子:
#iptables –A FORWARD –i eth0 –p tcp –m multiport --dports 25,80,110,443,1863 –j ACCEPT
#iptables –A FORWARD –i eth0 –p udp --dport 53 –j ACCEPT
僅僅兩條命令就解決了內(nèi)部用戶上網(wǎng)收發(fā)E_mail、瀏覽網(wǎng)頁、使用msn聊天等需求,怎么樣,就這么簡單。
1.8.4 target和jump
從字面的意思來理解,target表示目標(biāo),jump表示跳轉(zhuǎn),兩個結(jié)合起來表示被匹配到的數(shù)據(jù)包將跳轉(zhuǎn)的哪個目標(biāo)去,并執(zhí)行那個目標(biāo)相應(yīng)的動作,DROP、ACCEPT或其他。還是舉個例子有助于我們理解target和jump。
#iptables –N power_users
#iptables –A power_users –p all –j ACCEPT
#iptables –A FORWARD –s 192.168.1.0 –j power_users
上面的例子中,第一句表示新建一條chain,名稱叫做power_users,第二句是對power_users鏈定義策略,該策略表明接受所有協(xié)議的數(shù)據(jù)包,確實如此,否則我們也不會將這條鏈成為power_users了,第三條語句定義了一個轉(zhuǎn)發(fā)策略,將原地址為192.168.1.0/24網(wǎng)段的用戶產(chǎn)生的數(shù)據(jù)包被跳轉(zhuǎn)至power_users鏈處理。
在本節(jié)中,我們將對比較常用的幾個targets進行詳細(xì)的描述,他們分別是DROP、ACCEPT、SNAT、DNAT、MASQUERADE、LOG。
DROP: DROP target表示被匹配的數(shù)據(jù)包將要被執(zhí)行的動作是丟棄,也就是說,在這里,包的生命走到了終點,在這種情況下,iptables對包的處理只是將包丟棄,它不會對包的發(fā)送者返回任何信息,也不會向路由器發(fā)送任何錯誤信息,這在某些情況下會造成一些問題,比如發(fā)送者還在苦苦等待回包的到來,而發(fā)送出去的包早就在半路上夭折了,可以通過REJECT target來避免這個問題,REJECT和DROP的差別在于它不僅僅丟棄包,而且還禮節(jié)性的告訴發(fā)送者,這樣就不至于發(fā)送者苦苦等待了。其實對于一般的應(yīng)用,我們并不建議使用REJECT,既然包總是要被DROP的,那就讓發(fā)送者去等吧,這和我們有什么關(guān)系呢??
ACCEPT:這個target沒有任何選項和參數(shù),使用也很簡單,指定-j ACCEPT即可。一旦包滿足了指定的匹配條件,就會被ACCEPT,并且不會再去匹配當(dāng)前鏈中的其他規(guī)則或同一個表內(nèi)的其他規(guī)則。
SNAT:這個target是用來做源網(wǎng)絡(luò)地址轉(zhuǎn)換的,就是重寫包的源IP地址。當(dāng)我們有若干臺計算機共享一個Internet 連接時,就能用到它了,而且這也是絕大多數(shù)企業(yè)用戶所采用的Internet互聯(lián)方案。先在內(nèi)核里打開ip轉(zhuǎn)發(fā)功能,然后再寫一個SNAT規(guī)則,就可以把所有從本地網(wǎng)絡(luò)出去的包的源地址改為Internet連接的地址了。如果我們不這樣做而是直接轉(zhuǎn)發(fā)本地網(wǎng)的數(shù)據(jù)包的話,Internet上的機子就不知道往哪兒發(fā)送應(yīng)答了,因為在本地網(wǎng)里我們一般使用的是IANA組織專門指定的一段地址,它們是不能在Internet上使用的,還記得那些地址范圍嗎?讓我們來回憶一下:
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
SNAT target的作用就是讓所有從本地網(wǎng)出發(fā)的包看起來都是從一臺機子發(fā)出的,這臺機子一般就是防火墻或路由器之類的三層設(shè)備。
SNAT只能用在nat表的POSTROUTING鏈里。只要連接的第一個符合條件的包被SNAT了,那么這個連接的其他所有的包都會自動地被SNAT,而且這個規(guī)則還會應(yīng)用于這個連接所在流的所有數(shù)據(jù)包。
既然提到了ip包轉(zhuǎn)發(fā)的問題,我們也不妨費一些文字做一些簡要的說明,當(dāng)iptables被用來安裝在一個提供WWW或E_mail服務(wù)的主機上以期為主機提供保護時是不涉及包轉(zhuǎn)發(fā)的,但當(dāng)iptables被用在網(wǎng)絡(luò)的邊界節(jié)點充當(dāng)一個安全網(wǎng)關(guān)時,就涉及到包轉(zhuǎn)發(fā)的問題了,這時,iptables需要通過不同的網(wǎng)卡來轉(zhuǎn)發(fā)數(shù)據(jù)包,在linux系統(tǒng)中,控制是否允許轉(zhuǎn)發(fā)數(shù)據(jù)包是有一個開關(guān)的,0表示不轉(zhuǎn)發(fā),1表示轉(zhuǎn)發(fā),只要更改 /etc/sysct.confl文件中的如下內(nèi)容:
#Controls IP Packets Forwarding
net.ipv4.ip_forward = 1
然后重啟系統(tǒng),這時系統(tǒng)就能夠進行包轉(zhuǎn)發(fā)了,還有一種方法是在內(nèi)核空間內(nèi)直接更改,通過改下列文件的參數(shù):
#echo 1 > /proc/sys/net/ipv4/ip_forward
注意,這個文件一旦更改,立即生效,但如果重啟系統(tǒng),將回到默認(rèn)設(shè)置,所以/etc/sysctl.conf文件無論如何都應(yīng)該將轉(zhuǎn)發(fā)開關(guān)置位為“1”。
看看下面的范例,一般一個SNAT的命令是這樣完成的:
#iptables –t nat –A POSTROUTING –s 192.168.1.0 –j SNAT --to-source 1.1.1.1
這條命令表示將內(nèi)部網(wǎng)絡(luò)的192.168.1.0/24網(wǎng)段的地址翻譯成1.1.1.1,這樣內(nèi)部地址就可以使用一個公有IP(Public IP address)地址共享上網(wǎng)了,當(dāng)然,還要有額外的策略允許內(nèi)部用戶上網(wǎng)才行哦,別忘了。
SNAT只有一個參數(shù),--to-source,它有幾種使用方法:
1、單獨的地址,就象上面的例子所示。
2、一段連續(xù)的地址,用連字符分隔,如1.1.1.1-1.1.1.10,這樣可以實現(xiàn)負(fù)載平衡。每個流會被隨機分配一個IP,但對于同一個流使用的是同一個IP。當(dāng)然,前提是你要有這么多的公有ip才行?。?br>3、在指定-p tcp 或 -p udp的前提下,可以指定源端口的范圍,如1.1.1.1:1024-32000,這樣包的源端口就被限制在1024-32000了。
DNAT:這個target是用來做目的網(wǎng)絡(luò)地址轉(zhuǎn)換的,意思是重寫包的目的IP地址。如果一個包被匹配了,那么和它屬于同一個流的所有的包都會被自動轉(zhuǎn)換,然后就可以被路由到正確的主機或網(wǎng)絡(luò)。DNAT target是非常有用的。比如,你的Web服務(wù)器在LAN內(nèi)部,而且沒有可在Internet上使用的真實IP地址,那就可以使用這個 target讓防火墻把所有到它自己HTTP端口的包轉(zhuǎn)發(fā)給LAN內(nèi)部真正的Web服務(wù)器。目的地址也可以是一個范圍,這樣的話,DNAT會為每一個流隨機分配一個地址。因此,我們可以用這個target做某種類型的負(fù)載平衡。
DNAT也和SNAT一樣只有一個參數(shù),--to-destination,看看下面的例子:
#iptables –t nat –A PREROUTING –d 1.1.1.1 –j DNAT --to-destination 192.168.1.24
上面的例子說明凡是訪問1.1.1.1的數(shù)據(jù)包都轉(zhuǎn)給內(nèi)網(wǎng)的192.168.1.24,這樣內(nèi)部的服務(wù)器就可以發(fā)布出去了?,F(xiàn)在問題來了,如果僅僅這樣配置還是存在一點問題的,假設(shè)內(nèi)部網(wǎng)絡(luò)的其他用戶也訪問這個經(jīng)過映射后的地址會怎樣?當(dāng)然他們完全可以直接訪問服務(wù)器的真實地址,但在一些具體的情況下,比如 dns的解析就是指向了映射后的地址。可以加一條這樣的語句:
#iptables –t nat –A POSTROUTING –d 1.1.1.1 –j SNAT –to-source 192.168.1.254
在這里,假設(shè)防火墻的內(nèi)網(wǎng)地址是192.168.1.254,通過這樣的配置,問題解決了,想一想為什么會這樣?看看下面的示意圖:也許你就明白了:

知道問題出在哪里了嗎?很明顯,當(dāng)客戶機192.168.1.23發(fā)起一個訪問請求給映射后的地址1.1.1.1,防火墻收到這個請求后根據(jù)策略表匹配發(fā)現(xiàn)是一個對內(nèi)部服務(wù)器192.168.1.24的映射,如果不加上面的那一行語句,防火墻會通過純路由的方式將數(shù)據(jù)包轉(zhuǎn)發(fā)給服務(wù)器 192.168.1.24,服務(wù)器收到請求后,發(fā)現(xiàn)源地址為192.168.1.23的客戶機發(fā)來了一個請求,并且這臺主機與自己在同一個網(wǎng)段內(nèi),于是直接將回應(yīng)包SYN+ACK發(fā)送給主機192.168.1.23,主機收到這個包后會感覺很奇怪,因為它從來就沒有給192.168.1.24發(fā)送過連接請求報文,所以就會將回應(yīng)報文丟棄,現(xiàn)在,我們對內(nèi)網(wǎng)主機通過映射后地址訪問內(nèi)網(wǎng)服務(wù)器的需求進行一些修改,如上面的哪條命令,我們對所有到1.1.1.1 的連接都做一個原地址路由,將連接的原地址改變成防火墻的內(nèi)網(wǎng)接口地址,于是問題解決了。
當(dāng)然,問題總有兩面性,對于服務(wù)器而言,所有訪問者這時都變成了防火墻內(nèi)網(wǎng)的接口地址,這對于服務(wù)器的審計是有影響的,在具體的配置過程中,使用者需要權(quán)衡利弊,在做配置決定。
MASQUERADE:這個鏈與SNAT的差別不大,回憶一下在進行SNAT的配置時需要指明一個固定的映射地址,但如果用戶的網(wǎng)絡(luò)使用的是ADSL這種動態(tài)獲取IP地址的方式,SNAT就不適用了,這時只能使用MASQUERADE(地址偽裝),在具體的處理過程中,系統(tǒng)需要讀取當(dāng)前的動態(tài)地址,然后用當(dāng)前的地址對數(shù)據(jù)包進行重新封裝:
#iptables –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE
MASQUERADE可以添加參數(shù)--to-ports 1024-30000,可以通過這個參數(shù)指定映射后的源端口范圍。
LOG:顧名思義,這條鏈?zhǔn)怯脕碛涗浫罩镜?。記錄日志有助于必要是為我們提供一些有用的信息,比如被防火墻DROP的數(shù)據(jù)包就有可能包含一些危險的動作,網(wǎng)絡(luò)發(fā)生故障時,我們也能夠通過LOG發(fā)現(xiàn)一些潛在的問題。
有兩個常用的選項,--log-level 、--log-prefix
--log-level 告訴iptables和 syslog使用哪個記錄等級。記錄等級的詳細(xì)信息可以查看文件syslog.conf,一般來說有以下幾種,它們的級別依次是:debug,info, notice,warning,warn,err,error,crit,alert, emerg,panic。其中,error和err、warn和warning、panic和emerg分別是同義詞,也就是說作用完全一樣的。注意這三種級別是不被贊成使用的,換句話說,就是不要使用它們(因為信息量太大)。信息級別說明了被記錄信息所反映的問題的嚴(yán)重程度。所有信息都是通過內(nèi)核的功能被記錄的,也就是說,先在文件 syslog.conf里設(shè)置
kern.info /var/log/iptables
然后再讓所有關(guān)于iptables的LOG信息使用級別info,就可以把所有的信息存入文件/var/log/iptables內(nèi)。注意,其中也可能會有其他的信息,它們是內(nèi)核中使用info 這個等級的其他部分產(chǎn)生的。有關(guān)日志的詳細(xì)信息,可以syslog和syslog.conf的man page。
--log-prefix 描述日志的前綴,這樣和grep或其他工具一起使用時就容易追蹤特定的問題,而且也方便從不同的規(guī)則輸出。前綴最多能有29個英文字符,這已經(jīng)是包括空白字符和其他特殊符號的總長度了。
#iptables –A FORWARD –p tcp –j LOG –log-prefix “tcp_packets “ –log-level info
這條語句表示需要記錄所有tcp協(xié)議的數(shù)據(jù)包,并以“tcp_packets”做為標(biāo)記。
第二章 范例
網(wǎng)絡(luò)環(huán)境

如上所示:這是一個非常典型的企業(yè)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),通過固定IP地址接入Internet,內(nèi)部網(wǎng)絡(luò)通過防火墻與Internet互連并進行安全控制,只允許內(nèi)部網(wǎng)絡(luò)的用戶通過ftp、http、smtp、和pop3與Internet連接,而禁止所有從外網(wǎng)到內(nèi)網(wǎng)的連接,內(nèi)部用戶通過防火墻的外網(wǎng)接口地址共享上網(wǎng)。運行腳本firewall.sh如下:
#!/bin/sh
# example.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables
###########################################################################
# Configuration options.
# Internet Configuration.
INET_IP="194.236.50.155"
INET_SERVER=”194.236.50.156”
INET_IFACE="eth0"
INET_BROADCAST="194.236.50.255"
###########################################################################
#Lan configuration
# your LAN's IP range and localhost IP. /24 means to only use the first 24
# bits of the 32 bit IP address. the same as netmask 255.255.255.0
LAN_IP="192.168.0.254"
LAN_SERVER=”192.168.0.1”
LAN_IP_RANGE="192.168.0.0/24"
LAN_BROADCAST=”192.168.0.255”
LAN_IFACE="eth1"
###########################################################################
# Localhost Configuration.
LO_IFACE="lo"
LO_IP="127.0.0.1"
###########################################################################
# IPTables Configuration.
IPTABLES="/usr/sbin/iptables"
###########################################################################
# Module loading.
# Needed to initially load modules
/sbin/depmod -a
# Required modules
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
##########################################################################
# Non-Required modules
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_ftp
###########################################################################
# /proc set up.
# Required proc configuration
echo "1" > /proc/sys/net/ipv4/ip_forward
###########################################################################
# rules set up.
# Filter table
# Set default policies
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
###########################################################################
# Create userspecified chains
# Create chain for bad tcp packets
$IPTABLES -N bad_tcp_packets
# Create separate chains for ICMP, TCP and UDP to traverse
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
###########################################################################
# Create content in userspecified chains
# bad_tcp_packets chain
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \
--log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
###########################################################################
# allowed chain
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
############################################################################
# TCP rules for the services of ftp, ssh, smtp,http,pop3
#
$IPTABLES -A tcp_packets -p TCP –m multiport --dports 21,22,25,80,110 -j allowed
############################################################################
# UDP rules for the services of dns
#
$IPTABLES -A udp_packets -p UDP --destination-port 53 -j ACCEPT
#
# In Microsoft Networks you will be swamped by broadcasts. These lines
# will prevent them from showing up in the logs. Uncomment the following
# line to make the policy active if you have such a network
#
#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \
#--destination-port 135:139 -j DROP
#$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE -d $LAN_BROADCAST \
#--destination-port 135:139 -j DROP
###########################################################################
# ICMP rules
#
$IPTABLES -A icmp_packets -p ICMP --icmp-type 8 -j ACCEPT
###########################################################################
# INPUT chain
#
# Bad TCP packets you don't want.
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
#
# Rules for special networks not part of the Internet
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
# Drop the packet from Internet
#
$IPTABLES -A INPUT -p ALL -i $INET_IFACE –j DROP
# Log weird packets that don't match the above.
#
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix " INPUT packet died: "
###########################################################################
# FORWARD chain
#
# Bad TCP packets we don't want
#
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
#
# Accept the packets we actually want to forward
#
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD –p tcp -i $LAN_IFACE -j tcp_packets
$IPTABLES -A FORWARD –p udp -i $LAN_IFACE -j udp_packets
$IPTABLES -A FORWARD -p icmp -i $LAN_IFACE -j icmp_packets
#
# Log weird packets that don't match the above.
#
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "FORWARD packet died: "
#
# OUTPUT chain
#
# Bad TCP packets we don't want.
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
#
# Special OUTPUT rules to decide which IP's to allow.
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
#
# Log weird packets that don't match the above.
#
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "OUTPUT packet died: "
###########################################################################
# nat table
-j DNAT --to-destination $LAN_SERVER
# POSTROUTING chain
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
編輯好腳本后,為其添加可執(zhí)行權(quán)限:
#chmod ugo+x firewall.sh
將firewall.sh腳本移動到/etc目錄下:
#mv firewall.sh /etc/
確保系統(tǒng)在啟動是能夠運行該腳本,添加如下語句到/etc/rc.d/rc.local文件中:
#echo sh /etc/firewall.sh >> /etc/rc.d/rc.local
第三章 Iptables的新功能
在netfilter 的官方網(wǎng)站,2004年03月02日,發(fā)布了新的patch,在新的patch中公布了一些iptables可以使用的新的功能,有一些還是非常實用的。比如可以用來定義IP地址范圍段的iprange、定義連續(xù)或不連續(xù)端口范圍的mport、定義時間規(guī)則的time,定義網(wǎng)絡(luò)流量配額的quota等,這些功能本人已經(jīng)測試過,基本上還不錯,但其他的一些功能,在本人來看還不是特別實用,因此沒有測試,讀者如果感興趣,也可以自己用用看,別忘了告訴我結(jié)果哦?.
在使用這些新的功能前,首先需要將這些patch編譯進核心,當(dāng)然也可以將他們做為Modules使用,至于如何編譯核心,我在前面已經(jīng)講過了。
寫到這里,花了我好幾天的功夫,實在是累了,這一章就不仔細(xì)寫了,就好像維納斯缺一個胳膊卻是美的化身,本文也在第三章留一些缺憾,相信如果您已經(jīng)仔細(xì)的閱讀了本文的前兩章,并進行了實際的操作,相信在第三章,您可以憑借自己的能力搞定我沒有仔細(xì)闡述的那些問題的。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
iptables學(xué)習(xí)筆錄
Netfilter框架
Linux防火墻iptables學(xué)習(xí)筆記(三)iptables命令詳解和舉例
RHEL5.7下iptables防火墻配置(上)
iptables詳解(轉(zhuǎn))
Linux防火墻應(yīng)用珠璣
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服