天天看點

iptables的應用

摘要:本文介紹linux2.4.x核心中的防火牆工具--iptables的原理與配置,同時還給出了實際運用的例子,在文章的最後歸納了iptables與ipchains的差別。

一、 概述

從1.1核心開始,linux就已經具有包過慮功能了,在2.0的核心中我們采用ipfwadm來操作核心包過慮規則。之後在2.2核心中,采用了大家并不陌生的ipchains來控制核心包過慮規則。現在最新linux核心版本是2.4.1,在2.4核心中我們不再使用ipchains,而是采用一個全新的核心包過慮管理工具--iptables。 這個全新的核心包過慮工具将使使用者更易于了解其工作原理,更容易被使用,當然也将具有更為強大的功能。

我們說過iptables隻是一個管理核心包過慮的工具,iptables 可以加入、插入或删除核心包過濾表格(鍊)中的規則。實際上真正來執行這些過慮規則的是netfilter(Linux 核心中一個通用架構)及其相關子產品(如iptables子產品和nat子產品),下面我們一起來看看netfilter的工作原理。

二、 原理

netfilter是Linux 核心中一個通用架構,它提供了一系列的"表"(tables),每個表由若幹"鍊"(chains)組成,而每條鍊中可以有一條或數條規則(rule)組成。我們可以這樣來了解,netfilter是表的容器,表是鍊的容器,而鍊又是規則的容器(如圖一所示)。

系統預設的表為"filter",該表中包含了INPUT、FORWARD和OUTPUT 3個鍊。每一條鍊中可以有一條或數條規則,每一條規則都是這樣定義的“如果資料標頭符合這樣的條件,就這樣處理這個資料包”。當一個資料包到達一個鍊時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統将根據該條規則所定義的方法處理該資料包;如果不滿足則繼續檢查下一條規則。最後,如果該資料包不符合該鍊中任一條規則的話,系統就會根據該鍊預先定義的政策(policy)來處理該資料包。

資料包在filter表中的流程如圖二所示。有資料包進入系統時,系統首先根據路由表決定将資料包發給哪一條鍊,則可能有三種情況:

1. 如果資料包的目的位址是本機,則系統将資料包送往INPUT鍊,如果通過規則檢查,則該包被發給相應的本地程序處理;如果沒通過規則檢查,系統就會将這個包丢掉;

2. 如果資料包的目的位址不是本機,也就是說,這個包将被轉發,則系統将資料包送往FORWARD鍊,如果通過規則檢查,則該包被發給相應的本地程序處理;如果沒通過規則檢查,系統就會将這個包丢掉;

3. 如果資料包是由本地系統程序産生的,則系統将其送往OUTPUT鍊,如果通過規則檢查,則該包被發給相應的本地程序處理;如果沒通過規則檢查,系統就會将這個包丢掉。

從以上我們可以看出,netfilter比起以前的ipfwadm和ipchains思路上清晰了好多,也好了解了好多,這對于原先對ipfwadm和ipchains總是感到一頭霧水的使用者來說無疑是一個福音。

三、 準備工作

1. 系統需求

netfilter要求核心版本不低于2.3.5,在編譯新核心時,要求選擇和netfilter相關的項目。這些項目通常都是位于“Networking options”子項下。以2.4.0核心為例,我們應該選中的項目有:

[*] Kernel/User netlink socket

[ ] Routing messages

<*> Netlink device emulation

[*] Network packet filtering (replaces ipchains)

.......

然後,在“IP: Netfilter Configuration ---->”選中:

Connection tracking (required for masq/NAT)

FTP protocol support

IP tables support (required for filtering/masq/NAT)

limit match support

MAC address match support

Netfilter MARK match support

Multiple port match support

TOS match support

Connection state match support

Packet filtering

REJECT target support

Full NAT

MASQUERADE target support

REDIRECT target support

Packet mangling

TOS target support

MARK target support

LOG target support

ipchains (2.2-style) support

ipfwadm (2.0-style) support

其中最後兩個項目可以不選,但是如果你比較懷念ipchains或者ipfwadm,你也可以将其選中,以便在2.4核心中使用ipchians或ipfwadm。但是需要注意的是,iptables是和ipchians/ipfwadm相對立的,在使用iptables的同時就不能同時使用ipchains/ipfwadm。編譯成功後,這些子產品檔案都位于以下目錄中

/lib/modules/2.4.0/kernel/net/ipv4/netfilter

編譯2.4.0的新核心時還應該注意要在“Processor type and features”中選擇和你的CPU相對應的正确的CPU選項,否則新核心可能無法正常工作。

2. 載入子產品

要使用iptables,還必須載入相關子產品。可以使用以下指令載入相關子產品:

#modprobe iptable_tables

modprobe指令會自動載入指定子產品及其相關子產品。iptables_filter子產品會在運作時自動載入。

三、 文法

1. 對鍊的操作

建立一個新鍊 (-N)。

删除一個空鍊 (-X)。

改變一個内建鍊的原則 (-P)。

列出一個鍊中的規則 (-L)。

清除一個鍊中的所有規則 (-F)。

歸零(zero) 一個鍊中所有規則的封包位元組(byte) 記數器 (-Z)。

2. 對規則的操作

加入(append) 一個新規則到一個鍊 (-A)的最後。

在鍊内某個位置插入(insert) 一個新規則(-I),通常是插在最前面。

在鍊内某個位置替換(replace) 一條規則 (-R)。

在鍊内某個位置删除(delete) 一條規則 (-D)。

删除(delete) 鍊内第一條規則 (-D)。

3. 指定源位址和目的位址

通過--source/--src/-s來指定源位址(這裡的/表示或者的意思,下同),通過--destination/--dst/-s來指定目的位址。可以使用以下四中方法來指定ip位址:

a. 使用完整的域名,如“[url]www.linuxaid.com.cn[/url]”;

b. 使用ip位址,如“192.168.1.1”;

c. 用x.x.x.x/x.x.x.x指定一個網絡位址,如“192.168.1.0/255.255.255.0”;

d. 用x.x.x.x/x指定一個網絡位址,如“192.168.1.0/24”這裡的24表明了子網路遮罩的有效位數,這是 UNIX環境中通常使用的表示方法。

預設的子網路遮罩數是32,也就是說指定192.168.1.1等效于192.168.1.1/32。

4. 指定協定

可以通過--protocol/-p選項來指定協定,比如-p tcp。

5. 指定網絡接口将

可以使用--in-interface/-i或--out-interface/-o來指定網絡接口。需要注意的是,對于INPUT鍊來說,隻可能有-i,也即隻會有進入的包;通理,對于OUTPUT鍊來說,隻可能有-o,也即隻會有出去的包。隻有FORWARD鍊既可以有-i的網絡接口,也可以有-o的網絡接口。我們也可以指定一個目前并不存在的網絡接口,比如ppp0,這時隻有撥号成功後該規則才有效。

6. 指定ip碎片

在TCP/IP通訊過程中,每一個網絡接口都有一個最大傳輸單元(MTU),這個參數定義了可以通過的資料包的最大尺寸。如果一個資料包大于這個參數值時,系統會将其劃分成更小的數個資料包(稱之為ip碎片)來傳輸,而接收方則對這些ip碎片再進行重組以還原整個包。

但是再進行包過濾的時候,ip碎片會導緻這樣一個問題:當系統将大資料包劃分成ip碎片傳送時,第一個碎片含有完整的標頭資訊,但是後續的碎片隻有標頭的部分資訊,比如源位址,目的位址。是以假如我們有這樣一條規則:

iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT

并且這時的FORWARD的政策(policy)為DROP時,系統隻會讓第一個ip碎片通過,而丢掉其餘的ip碎片,因為第一個碎片含有完整的標頭資訊,可以滿足該規則的條件,而餘下的碎片因為標頭資訊不完整而無法滿足規則定義的條件,因而無法通過。

我們可以通過--fragment/-f選項來指定第二個及其以後的ip碎片,比如以上面的例子為例,我們可以再加上這樣一條規則來解決這個問題:

iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT

但是需要注意的是,現在已經有好多進行ip碎片攻擊的執行個體(比如向Win98 NT4/SP5,6 Win2K發送大量的ip碎片進行DoS攻擊),是以允許ip碎片通過是有安全隐患的,對于這一點我們可以采用iptables的比對擴充來進行限制,但是這又會影響服務品質,我們将在下面讨論這個問題。

  

7. 指定非

可以在某些選項前加上!來表示非指定值,比如“-s -! 192.168.1.1/32”表示除了192.168.1.1以外的ip位址,“-p -! tcp”表示除了tcp以外的協定。

8. TCP比對擴充

通過使用--tcp-flags選項可以根據tcp包的标志位進行過濾,該選項後接兩個參數:第一個參數為要檢查的标志位,可以是SYN,ACK,FIN,RST,URG,PSH的組合,可以用ALL指定所有标志位;第二個參數是标志位值為1的标志。比如你要過濾掉所有SYN标志位為1的tcp包,可以使用以下規則:

iptables -A FORWARD -p tcp --tcp-flags ALL SYN -j DROP

選項--syn是以上的一種特殊情況,相當于“--tcp-flags SYN,RST,ACK SYN”的簡寫。

9. mac比對擴充

可以使用-m選項來擴充比對内容。使用--match mac/-m mac比對擴充可以用來檢查ip資料包的源mac位址。隻要在--mac-source後面跟上mac位址就可以了。比如:

iptables -A FORWARD -m mac --mac-source 00:00:BA:A5:7D:12 -j DROP

需要注意的是一個ip包在經過路由器轉發後,其源mac位址已經變成了路由器的mac位址。

10. limit比對擴充

limit擴充是一個非常有用的比對擴充。使用-m nat 來指定,其後可以有兩個選項:

--limit avg: 指定機關時間内允許通過的資料包的個數。機關時間可以是/second、/minute、/hour、/day或使用第一個字母,比如5/second和5/s是一樣的,都是表示每秒可以通過5個資料包,預設值是3/hour。

  --limit-burst number:指定觸發事件的閥值,預設值是5。

看起來好像有點複雜,就讓我們來看一個例子:

假設又如下的規則:

iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT

iptables -P INPUT DROP

然後從另一部主機上ping這部主機,就會發生如下的現象:

首先我們可以看到前四個包的回應都很正常,然後從第五個包開始,我們每10秒可以收到一個正常的回應。這是因為我們設定了機關時間(在這裡是每分鐘)内允許通過的資料包的個數是每分鐘6個,也即每10秒鐘一個;其次我們又設定了事件觸發閥值為5,是以我們的前四個包都是正常的,隻是從第五個包開始,限制規則開始生效,故隻能每10秒收到一個正常回應。

假設我們停止ping,30秒後又開始ping,這時的現象是:

前兩個包是正常的,從第三個包開始丢包,這是因為在這裡我的允許一個包通過的周期是10秒,如果在一個周期内系統沒有收到符合條件的包,系統的觸發值就會恢複1,是以假如我們30秒内沒有符合條件的包通過,系統的觸發值就會恢複到3,假如5個周期内都沒有符合條件的包通過,系統都觸發值就會完全恢複。不知道你明白了沒有,歡迎你來信讨論。

11. LOG目标擴充

netfilter預設的目标(也就是一旦滿足規則所定義以後系統對資料包的處理方法)有:

ACEEPT:接收并轉發資料包

DORP:丢掉資料包

目标擴充子產品提供了擴充的目标。LOG目标提供了記錄資料包的功能。該目标擴充有以下幾個參數:

--log-level:指定記錄資訊的級别,級别有debug、info、notice、warning、err、crit、alert、emerg分别對應7到0的數字。其含義請參看syslog.conf的man手冊。

--log-prefix:後接一個最長為30個字元的字元串,該字元串将出現在每一條日志的前面。

12. REJECT目标擴充

該目标擴充完全和DORP标準目标一樣,除了向發送方傳回一個“port unreachable”的icmp資訊外。

還有其他一些擴充是常用的,如果你想了解可以參考Packet-Filtering-HOWTO。當然,最直接獲得幫助的辦法是檢視iptables的線上幫助,比如想得到關于mac比對擴充的幫助可以執行“iptables -m mac -help”指令,想得到LOG目标擴充的幫助可以執行“iptables -j LOG -help”指令。

用iptales實作包過慮型防火牆(二)

[url]http://LinuxAid.com.cn[/url] bye2000

本文版權由linuxAid和作者所有

四、 iptables使用執行個體

首先讓我們看一下伺服器/客戶機的互動原理。伺服器提供某特定功能的服務總是由特定的背景程式提供的。在TCP/IP網絡中,常常把這個特定的服務綁定到特定的TCP或UDP端口。之後,該背景程式就不斷地監聽(listen)該端口,一旦接收到符合條件的用戶端請求,該服務進行TCP握手後就同用戶端建立一個連接配接,響應客戶請求。與此同時,再産生一個該綁定的拷貝,繼續監聽用戶端的請求。

舉一個具體的例子:假設網絡中有一台伺服器A(IP位址為1.1.1.1)提供WWW服務,另有客戶機B(2.2.2.2)、C(3.3.3.3)。首先,伺服器A運作提供WWW服務的背景程式(比如Apache)并且把該服務綁定到端口80,也就是說,在端口80進行監聽。當B發起一個連接配接請求時,B将打開一個大于1024的連接配接端口(1024内為已定義端口),假設為1037。A在接收到請求後,用80端口與B建立連接配接以響應B的請求,同時産生一個80端口綁定的拷貝,繼續監聽用戶端的請求。假如A又接收到C的連接配接請求(設連接配接請求端口為1071),則A在與C建立連接配接的同時又産生一個80端口綁定的拷貝繼續監聽用戶端的請求。如下所示,因為系統是以源位址、源端口、目的位址、目的端口來辨別一個連接配接的,是以在這裡每個連接配接都是唯一的。

伺服器 用戶端

連接配接1:a.b.c.1:80 <=> a.b.c.4:1037

連接配接2:a.b.c.1:80 <=> a.b.c.7:1071

每一種特定的服務都有自己特定的端口,一般說來小于1024的端口多為保留端口,或者說是已定義端口,低端口配置設定給衆所周知的服務(如WWW、FTP等等),從512到1024的端口通常保留給特殊的UNIX TCP/IP應用程式,具體情況請參考/etc/services檔案或RFC1700。

假設網絡環境如下:某一機關,租用DDN專線上網,網絡拓撲如下:

+--------------+

| 内部網段 | eth1+--------+eth0 DDN

| +------------|firewall|<===============>Internet

| 198.168.80.0 | +--------+

eth0: 198.199.37.254

eth1: 198.168.80.254

以上的IP位址都是Internet上真實的IP,故沒有用到IP欺騙。并且,我們假設在内部網中存在以下伺服器:

www伺服器:[url]www.yourdomain.com[/url] 198.168.80.11

ftp伺服器:ftp.yourdomain.com 198.168.80.12

email伺服器:mail.yourdomain.com 198.168.80.13

下面我們将用iptables一步一步地來建立我們的包過濾防火牆,需要說明的是,在這個例子中,我們主要是對内部的各種伺服器提供保護。

1. 在/etc/rc.d/目錄下用touch指令建立firewall檔案,執行chmod u+x firewll以更改檔案屬性 ,編輯/etc/rc.d/rc.local檔案,在末尾加上 /etc/rc.d/firewall 以確定開機時能自動執行該腳本。

2. 重新整理所有的鍊的規則

#!/bin/sh

echo "Starting iptables rules..."

#Refresh all chains

/sbin/iptables -F

3. 我們将首先禁止轉發任何包,然後再一步步設定允許通過的包。

是以首先設定防火牆FORWARD鍊的政策為DROP:

/sbin/iptables -P FORWARD DROP

4.設定關于伺服器的包過慮規則:

在這裡需要注意的是,伺服器/客戶機互動是有來有往的,也就是說是雙向的,是以我們不僅僅要設定資料包出去的規則,還要設定資料包傳回的規則,我們先建立針對來自Internet資料包的過慮規則。

WWW服務:服務端口為80,采用tcp或udp協定。規則為:eth0=>允許目的為内部網WWW伺服器的包。

###########################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服務:FTP服務有點特别,因為需要兩個端口,因為FTP有指令通道和資料通道。其中指令端口為21,資料端口為20,并且有主動和消極兩種服務模式,其消極模式連接配接過程為:FTP用戶端首先向FTP伺服器發起連接配接請求,三步握手後建立指令通道,然後由FTP伺服器請求建立資料通道,成功後開始傳輸資料,現在大多數FTP用戶端均支援消極模式,因為這種模式可以提高安全性。FTP服務采用tcp協定。規則為:eth0=>僅允許目的為内部網ftp伺服器的包。

############################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服務:包含兩個協定,一是smtp,一是pop3。出于安全性考慮,通常隻提供對内的pop3服務,是以在這裡我們隻考慮針對smtp的安全性問題。smtp端口為21,采用tcp協定。eth0=>僅允許目的為email伺服器的smtp請求。

###########################Define smtp packets####################################

/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

5. 設定針對Intranet客戶的過慮規則:

在本例中我們的防火牆位于網關的位置,是以我們主要是防止來自Internet的攻擊,不能防止來自Intranet的攻擊。假如我們的伺服器都是基于linux的,也可以在每一部伺服器上設定相關的過慮規則來防止來自Intranet的攻擊。對于Internet對Intranet客戶的傳回包,我們定義如下規則。

#############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伺服器;第二條接收來自Internet的非連接配接請求tcp包;最後一條接收所有udp包,主要是針對oicq等使用udp的服務。

6. 接受來自整個Intranet的資料包過慮,我們定義如下規則:

#############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碎片數量進行限制,以防止ip碎片攻擊。

#################################Define fregment rule##################################

/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

說明:對不管來自哪裡的ip碎片都進行限制,允許每秒通過100個ip碎片,該限制觸發的條件是100個ip碎片。

8. 設定icmp包過濾

icmp包通常用于網絡測試等,故允許所有的icmp包通過。但是黑客常常采用icmp進行攻擊,如ping of death等,是以我們采用limit比對擴充加以限制:

#################################Define icmp rule##################################

/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

說明:對不管來自哪裡的icmp包都進行限制,允許每秒通過一個包,該限制觸發的條件是10個包。

通過以上個步驟,我們建立了一個相對完整的防火牆。隻對外開放了有限的幾個端口,同時提供了客戶對Internet的無縫通路,并且對ip碎片攻擊和icmp的ping of death提供了有效的防護手段。以下是完整的腳本檔案内容,希望通過這個執行個體能是對iptables的用法有所了解:

#############Define packets from Intranet to Internet###############

五、 iptables與ipchains的差別

  ·iptables的預設鍊的名稱從小寫換成大寫,并且意義不再相同:INPUT和OUTPUT分别放置對目的位址是本機以及本機發出的資料包的過慮規則。

  ·-i選項現在隻代表輸入網絡接口,輸入網絡接口則使用-o選項。

  ·TCP和UDP端口現在需要用--source-port或--sport(或--destination-port/--dport)選項拼寫出來并且必須置于"-p tcp"或"-p udp"選項之後,因為它們分别是載入TCP和UDP擴充的。

  ·以前TCP的"-y"标志現在改為"--syn",并且必須置于"-p tcp"之後。

  ·原來的DENY目标最後改為了DROP。

  ·可以在清單顯示單個鍊的同時将其清空。

  ·可以在清空内建鍊的同時将政策計數器清零。

  ·清單顯示鍊時可顯示計數器的目前瞬時值。

  ·REJECT和LOG現在變成了擴充目标,即意味着它們成為獨立的核心子產品。

  ·鍊名可以長達31個字元。

  ·MASQ現在改為MASQUERADE,并且使用不同的文法。REDIRECT保留原名稱,但也改變了所使用的文法。

用iptables實作NAT

摘要

  本文是“用iptales實作包過慮型防火牆”的姊妹篇,主要介紹如何使用iptbales實作linux2.4下的強大的NAT功能。關于iptables的詳細文法請參考“用iptales實作包過慮型防火牆”一文。需要申明的是,本文絕對不是NAT-HOWTO的簡單重複或是中文版,在整個的叙述過程中,作者都在試圖用自己的語言來表達自己的了解,自己的思想。(2002-06-24 14:30:19)

By 書生

1.概述

1.1 什麼是NAT

  在傳統的标準的TCP/IP通信過程中,所有的路由器僅僅是充當一個中間人的角色,也就是通常所說的存儲轉發,路由器并不會對轉發的資料包進行修改,更為确切的說,除了将源MAC位址換成自己的MAC位址以外,路由器不會對轉發的資料包做任何修改。NAT(Network Address Translation網絡位址翻譯)恰恰是出于某種特殊需要而對資料包的源ip位址、目的ip位址、源端口、目的端口進行改寫的操作。

1.2 為什麼要進行NAT

  我們來看看再什麼情況下我們需要做NAT。

  假設有一家ISP提供園區Internet接入服務,為了友善管理,該ISP配置設定給園區使用者的IP位址都是僞IP,但是部分使用者要求建立自己的WWW伺服器對外釋出資訊,這時候我們就可以通過NAT來提供這種服務了。我們可以再防火牆的外部網卡上綁定多個合法IP位址,然後通過NAT技術使發給其中某一個IP位址的包轉發至内部某一使用者的WWW伺服器上,然後再将該内部WWW伺服器響應包僞裝成該合法IP發出的包。

  再比如使用撥号上網的網吧,因為隻有一個合法的IP位址,必須采用某種手段讓其他機器也可以上網,通常是采用代理伺服器的方式,但是代理伺服器,尤其是應用層代理伺服器,隻能支援有限的協定,如果過了一段時間後又有新的服務出來,則隻能等待代理伺服器支援該新應用的更新版本。如果采用NAT來解決這個問題,

  因為隻在應用層以下進行處理,不但可以獲得很高的通路速度,而且可以無縫的支援任何新的服務或應用。

  還有一個方面的應用就是重定向,也就是當接收到一個包後,不是轉發這個包,而是将其重定向到系統上的某一個應用程式。最常見的應用就是和squid配合使用成為透明代理,在對http流量進行緩存的同時,可以提供對Internet的無縫通路。

1.3 NAT的類型

  在linux2.4的NAT-HOWTO中,作者從原理的角度将NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是改變轉發資料包的源位址,所謂DNAT就是改變轉發資料包的目的位址。

2.原理

  下圖是linux2.4的原理圖:

nat原理圖

  在“用iptales實作包過慮型防火牆”一文中我們說過,netfilter是Linux 核心中一個通用架構,它提供了一系列的"表"(tables),每個表由若幹"鍊"(chains)組成,而每條鍊中可以有一條或數條規則(rule)組成。并且系統預設的表是"filter"。但是在使用NAT的時候,我們所使用的表不再是"filter",而是"nat"表,是以我們必須使用"-t nat"選項來顯式地指明這一點。因為系統預設的表是"filter",是以在使用filter功能時,我們沒有必要顯式的指明"-t filter"。

  同filter表一樣,nat表也有三條預設的"鍊"(chains),這三條鍊也是規則的容器,它們分别是:

* PREROUTING:可以在這裡定義進行目的NAT的規則,因為路由器進行路由時隻檢查資料包的目的ip位址,是以為了使資料包得以正确路由,我們必須在路由之前就進行目的NAT;

* POSTROUTING:可以在這裡定義進行源NAT的規則,系統在決定了資料包的路由以後在執行該鍊中的規則。

* OUTPUT:定義對本地産生的資料包的目的NAT規則。

3.操作文法

  如前所述,在使用iptables的NAT功能時,我們必須在每一條規則中使用"-t nat"顯示的指明使用nat表。然後使用以下的選項:

3.1 對規則的操作

* 加入(append) 一個新規則到一個鍊 (-A)的最後。

* 在鍊内某個位置插入(insert) 一個新規則(-I),通常是插在最前面。

* 在鍊内某個位置替換(replace) 一條規則 (-R)。

* 在鍊内某個位置删除(delete) 一條規則 (-D)。

* 删除(delete) 鍊内第一條規則 (-D)。

3.2 指定源位址和目的位址

  通過--source/--src/-s來指定源位址(這裡的/表示或者的意思,下同),通過--destination/--dst/-s來指定目的位址。可以使用以下四中方法來指定ip位址:

1. 使用完整的域名,如“[url]www.linuxaid.com.cn[/url]”;

2. 使用ip位址,如“192.168.1.1”;

3. 用x.x.x.x/x.x.x.x指定一個網絡位址,如“192.168.1.0/255.255.255.0”;

4. 用x.x.x.x/x指定一個網絡位址,如“192.168.1.0/24”這裡的24表明了子網路遮罩的有效位數,這是UNIX環境中通常使用的表示方法。預設的子網路遮罩數是32,也就是說指定192.168.1.1等效于192.168.1.1/32。

3.3 指定網絡接口

  可以使用--in-interface/-i或--out-interface/-o來指定網絡接口。從NAT的原理可以看出,對于PREROUTING鍊,我們隻能用-i指定進來的網絡接口;而對于POSTROUTING和OUTPUT我們隻能用-o指定出去的網絡接口。

3.4 指定協定及端口

  可以通過--protocol/-p選項來指定協定,如果是udp和tcp協定,還可--source-port/--sport和 --destination-port/--dport來指明端口。

4.準備工作

4.1 編譯核心,編譯時選中以下選項,具體可參看“用iptales實作包過慮型防火牆”一文:

 MASQUERADE target support

 REDIRECT target support

4.2 要使用NAT表時,必須首先載入相關子產品:

modprobe ip_tables

modprobe ip_nat_ftp

iptable_nat 子產品會在運作時自動載入。

5.使用執行個體

5.1 源NAT(SNAT)

  比如,更改所有來自192.168.1.0/24的資料包的源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

  這裡需要注意的是,系統在路由及過慮等處理直到資料包要被送出時才進行SNAT。

  有一種SNAT的特殊情況是ip欺騙,也就是所謂的Masquerading,通常建議在使用撥号上網的時候使用,或者說在合法ip位址不固定的情況下使用。比如

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

  可以看出,這時候我們沒有必要顯式的指定源ip位址等資訊。

5.2 目的SNAT(DNAT)

  比如,更改所有來自192.168.1.0/24的資料包的目的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

  這裡需要注意的是,系統是先進行DNAT,然後才進行路由及過慮等操作。

  有一種DNAT的特殊情況是重定向,也就是所謂的Redirection,這時候就相當于将符合條件的資料包的目的ip位址改為資料包進入系統時的網絡接口的ip位址。通常是在與squid配置形成透明代理時使用,假設squid的監聽端口是3128,我們可以通過以下語句來将來自192.168.1.0/24,目的端口為80的資料包重定向到squid監聽端口:

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 使用撥号帶動區域網路上網

  小型企業、網吧等多使用撥号網絡上網,通常可能使用代理,但是考慮到成本、對協定的支援等因素,建議使用ip欺騙方式帶動區域網上網。

  成功更新核心後安裝iptables,然後執行以下腳本:

#載入相關子產品

#進行ip僞裝

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

6.2 ip映射

  假設有一家ISP提供園區Internet接入服務,為了友善管理,該ISP配置設定給園區使用者的IP位址都是僞IP,但是部分使用者要求建立自己的WWW伺服器對外釋出資訊。我們可以再防火牆的外部網卡上綁定多個合法IP位址,然後通過ip映射使發給其中某一個IP位址的包轉發至内部某一使用者的WWW伺服器上,然後再将該内部WWW伺服器響應包僞裝成該合法IP發出的包。

  我們假設以下情景:

該ISP配置設定給A機關www伺服器的ip為:

僞ip:192.168.1.100

真實ip:202.110.123.100

該ISP配置設定給B機關www伺服器的ip為:

僞ip:192.168.1.200

真實ip:202.110.123.200

linux防火牆的ip位址分别為:

内網接口eth1:192.168.1.1

外網接口eth0:202.110.123.1

  然後我們将配置設定給A、B機關的真實ip綁定到防火牆的外網接口,以root權限執行以下指令:

ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0

ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0

  首先,對防火牆接收到的目的ip為202.110.123.100和202.110.123.200的所有資料包進行目的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的資料包進行源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的資料包都将分别被轉發給192.168.1.100和192.168.1.200;而所有來自192.168.1.100和192.168.1.200的資料包都将分别被僞裝成由202.110.123.100和202.110.123.200,進而也就實作了ip映射。

繼續閱讀