Linux內建防火牆Iptables基本配置

來源:互聯網
上載者:User

http://www.tianyablog.com/blogger/post_show.asp?BlogID=311462&PostID=10646176

一、 文法

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”命令。

二、 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一步一步地來建立我們的包過濾防火牆,需要說明的是,在這個例子中,我們主要是對內部的各種伺服器提供保護。

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

----------------------------------------------------------------------------
刪除檔案 /etc/sysconfig/iptables
service iptables save

iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p udp -m state --state NEW -m udp --dport 161 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 161 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 9680 -j ACCEPT

刪除規則:iptables -D RH-Firewall-1-INPUT 4
RH-Firewall-1-INPUT為規則所在類名.如Chain RH-Firewall-1-INPUT (0 references)

iptables -D RH-Firewall-1-INPUT 13
iptables -D INPUT 13

iptables -A RH-Firewall-1-INPUT -s ! 202.100.203.0/24 -p tcp -d 218.77.130.83 -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -p tcp -d 202.100.203.0/24 --dport ftp -i eth0 -j ACCEPT
iptables -A RH-Firewall-1-INPUT -s 202.100.203.0/24 -i eth0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

IP段地址表示:
x.0.0.0/8
x.x.0.0/16
x.x.x.0/24
x.x.x.x/32

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.