iptables的應用

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. 使用完整的域名,如“www.linuxaid.com.cn”;

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實現包過慮型防火牆(二)

http://LinuxAid.com.cn 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服務器:www.yourdomain.com 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的用法有所瞭解:

#!/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的區別

  ·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. 使用完整的域名,如“www.linuxaid.com.cn”;

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實現包過慮型防火牆”一文:

Full NAT

 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,然後執行以下腳本:

#載入相關模塊

modprobe ip_tables

modprobe ip_nat_ftp

#進行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

  成功升級內核後安裝iptables,然後執行以下腳本:

#載入相關模塊

modprobe ip_tables

modprobe ip_nat_ftp

  首先,對防火牆接收到的目的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映


發佈了19 篇原創文章 · 獲贊 7 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章