深入淺出Netfilter/iptables防火墻框架(入門篇)
原創【51CTO獨家特稿】Linux系統管理員們都接觸過Netfilter/iptables,這是Linux系統自帶的免費防火墻,功能十分強大。在這個《深入淺出Netfilter/iptables防火墻框架》系列中,51CTO安全/Linux專家李洋將對Netfilter/iptables進行詳盡的、條理的介紹。上一篇(基礎篇)介紹了netfilter/iptables的原理,本文是入門篇,介紹Netfilter/iptables框架的安裝、啟動和簡單應用。
1、安裝和啟動Netfilter/iptables系統
因為Netfilter/iptables的netfilter組件是與內核2.4.x集成在一起的,高版本的Linux都配備了netfilter這個內核工具,所以一般不須要下載,而只要下載并安裝iptables用戶空間工具的源代碼包:http://www.netfilter.org/projects/iptables/downloads.html。目前,最新源代碼安裝包是:iptables-1.4.10.tar.bz2。
在開始安裝iptables用戶空間工具之前,要對系統做某些修改,主要有如下選項須要配置修改:
- CONFIG_PACKET:如果要使應用程序和程序直接使用某些網絡設備,那么這個選項是有用的。
- CONFIG_IP_NF_MATCH_STATE:如果要配置有狀態的防火墻,那么這個選項非常重要而且很有用。這類防火墻會記得先前關于信息包過濾所做的決定,并根據它們做出新的決定。
- CONFIG_IP_NF_FILTER:這個選項提供一個基本的信息包過濾框架。如果打開這個選項,則會將一個基本過濾表(帶有內置的INPUT、FORWARD和OUTPUT鏈)添加到內核空間。
- CONFIG_IP_NF_TARGET_REJECT:這個選項允許指定:應該發送ICMP錯誤消息來響應已被DROP掉的入站信息包,而不是簡單地殺死這些信息包。
安裝源代碼包:
//將源代碼文件解壓縮 #bzip2 -d iptables-1.4.10-tar.bz2 #tar -xvf iptables 1.4.10.tar //切換目錄 #cd iptables 1.4.10 //編譯該工具,指定編譯的內核目錄為/usr/src/linux-2.6.4-8 #make KERNEL_DIR=/usr/src/linux-2.4.16-8 //執行make install命令,同樣設定內核目錄為/usr/src/linux-2.6.4-8 #make install KERNEL_DIR=/usr/src/linux-2.6.4-8
安裝完成后,就可以啟動防火墻了:
//使用service命令手工啟動 # service iptables start
如果想要在系統啟動的時候也啟動該防火墻服務,那么可以使用setup命令,然后進入System service選項,選擇iptables守護進程即可。
2、 Iptables簡單應用
1) 基本規則應用
下面將給出運用上述框架理論形成規則的一些簡單示例,以供讀者在實際的應用過程中進行模仿和使用:
(1)接受來自指定IP地址的所有流入的數據包:
#iptables -A INPUT -s 203.159.0.10 -j ACCEPT
(2)只接受來自指定端口(服務)的數據包:
#iptables -D INPUT --dport 80 -j DROP
(3)允許轉發所有到本地(198.168.10.13)smtp服務器的數據包:
#iptables -A FORWARD -p tcp -d 198.168.10.13 --dport smtp -i eth0 -j ACCEPT
(4)允許轉發所有到本地的udp數據包(諸如即時通信等軟件產生的數據包):
#iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
(5)拒絕發往WWW服務器的客戶端的請求數據包:
#iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j REJECT
(6)允許目的為指定端口的tcp數據包進入:
#iptables -A INPUT -p tcp -m multiport --destination-port 21,53,80,25,110 ACCEPT
(7)允許來源為指定端口的tcp數據包進入:
#iptables -A INPUT -p tcp -m multiport --source-port 21,53,80,25,110 ACCEPT
(8)丟掉SYN和ACK標志位置位的數據包:
#iptables -A INPUT-p tcp --tcp-flags ALL SYN,ACK DROP
2) 碎片檢測及流量控制
(1)檢查IP碎片:在TCP/IP網絡中,鏈路層具有最大傳輸單元MTU這個特性,它限制了數據幀的最大長度,不同的網絡類型都有一個上限值。以太網的MTU是1500。如果IP層有數據包要傳,而且數據包的長度超過了MTU,那么IP層就要對數據包進行分片(fragmentation)操作,使每一片的長度都小于或等于MTU,這些被分段的片段就成為IP碎片。那么,如果在防火墻處不對IP碎片進行特別處理的話,那么有可能部分IP碎片會被防火墻攔截,從而影響到接受端對這些碎片的還原,并最終影響到信息的完整性和可用性問題,所以,下面的例子給出防火墻允許IP碎片通過的規則:
#iptables -A FORWARD -p tcp -f -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
需要特別留意上述規則中的-f選項,它指定了第二個以及以后的IP碎片將由防火墻來處理通過,否則的話,考慮下面的規則,防火墻有可能對其第二個及其以后的IP碎片進行攔截,從而影響正常的信息流通:
#iptables -A FORWARD -p tcp -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
(2)速率限制:iptables提供了非常健全的速率控制機制,主要用來限制由外向內的單位時間內通過的數據包個數,這樣做的一個直接的好處就是盡可能地抑制前面多次提到的拒絕服務攻擊或者是分布式拒絕服務攻擊,因為這兩種攻擊的一個非常典型的表現就是單位時間內有很多數據包涌向目的地。所以,我們可以使用下面的規則來限制單位時間內允許通過防火墻,從而進入被保護網絡的數據包個數:
#iptables -A INPUT -m limit --limit 200/second #iptables -A INPUT -m limit --limit 10000/minute
上述兩條規則分別限制1秒內和1分鐘內通過的數據包個數不能超過200和10000個。當然,在實際應用中,也可以通過/second、/minute、、/hour、/day這樣的時間間隔來進行設定,并且,其中諸如200和10000這些具體數值的設定需要用戶根據具體情況和經驗來進行設定,沒有規定的數值可循。
另外,在設定速率限制后,還可以設定超過該限制所觸發的一些處理事件,比如說直接丟棄。下面的規則表示當速率超過200限制后,將直接對后續數據包進行丟棄:
#iptables -A INPUT -m limit --limit-burst 200
【編輯推薦】