Linux 自帶防火牆 Iptables 基本配置

tonywi888發表於2007-04-12
一、 語法

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. 使用完整的域名,如“”;
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”命令。

二、 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伺服器: 198.168.80.11
ftp伺服器:ftp.yourdomain.com 198.168.80.12
email伺服器:mail.yourdomain.com 198.168.80.13

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

0. 載入模組

要使用iptables,還必須載入相關模組。可以使用以下命令載入相關模組:
#modprobe iptable_tables
modprobe命令會自動載入指定模組及其相關模組。iptables_filter模組會在執行時自動載入。

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###########
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##################
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
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
iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT

##Define smtp packets
iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

##Define packets from Internet server to Intranet
iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT

##Define packets from Intranet to Internet
iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT

##Define fregment rule
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

##Define icmp rule
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-910242/,如需轉載,請註明出處,否則將追究法律責任。

相關文章