Linux 自帶防火牆 Iptables 基本配置
一、 語法
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@]
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iptables配置-Linux系統安全防火牆Linux防火牆
- Linux 防火牆配置(iptables和firewalld)詳細教程。Linux防火牆
- Linux設定防火牆iptablesLinux防火牆
- Linux基礎命令---iptables防火牆Linux防火牆
- iptables防火牆防火牆
- 防火牆iptables防火牆
- linux iptables安全技術與防火牆Linux防火牆
- Linux IPTables:如何新增防火牆規則Linux防火牆
- Linux配置防火牆Linux防火牆
- iptables實用知識 ,一文學會配置linux防火牆Linux防火牆
- Iptables防火牆應用防火牆
- iptables防火牆規則防火牆
- Linux系統iptables與Firewalld防火牆區別?Linux防火牆
- Linux 防火牆配置使用Linux防火牆
- 基於iptables防火牆堵漏防火牆
- Centos6防火牆基本配置CentOS防火牆
- Linux 防火牆:關於 iptables 和 firewalld 的那些事Linux防火牆
- Linux防火牆介紹和iptables常用命令Linux防火牆
- linux中的firewalld防火牆配置Linux防火牆
- 在Linux中,如何配置防火牆?Linux防火牆
- linux防火牆使用以及配置Linux防火牆
- 20條IPTables防火牆規則用法!防火牆
- iptables防火牆如何記錄日誌防火牆
- linux apf 防火牆安裝與配置Linux防火牆
- 防火牆配置防火牆
- win10關防火牆方法_如何關閉win10自帶防火牆Win10防火牆
- windows/Linux 防火牆安裝配置規則WindowsLinux防火牆
- 超級實用的 iptables 防火牆指令碼防火牆指令碼
- Linux防火牆命令Linux防火牆
- LINUX 防火牆 firewalldLinux防火牆
- CentOS 中 iptables 和 firewall 防火牆的相關命令CentOS防火牆
- 體驗iptables 企業級的防火牆實戰防火牆
- linux之openEuler /centos7防火牆基本使用指南LinuxCentOS防火牆
- Linux的銅牆鐵壁iptablesLinux
- 1、iptables-基礎-包過濾防火牆-四層防火牆(只支援4層協議)防火牆協議
- linux 7 防火牆操作Linux防火牆
- Linux防火牆基礎Linux防火牆
- 在Linux中,如何配置防火牆和安全規則?Linux防火牆
- 如何在 Linux 系統中配置 firewalld 防火牆策略Linux防火牆