Linux系統管理員們都接觸過Netfilter/iptables,這是Linux系統自帶的免費防火牆,功能十分強大。在這個《深入淺出Netfilter/iptables防火牆框架》系列中,我們將對Netfilter/iptables進行詳盡的、條理的介紹。上一篇(基礎篇)介紹了netfilter/iptables的原理,本文是入門篇,介紹Netfilter/iptables框架的安裝、啟動和簡單應用。

原文請見:http://os.51cto.com/art/201107/275664.htm

 

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使用者空間工具之前,要對系統做某些修改,主要有如下選項須要配置修改:

  1. CONFIG_PACKET:如果要使應用程式和程式直接使用某些網路裝置,那麼這個選項是有用的。
  2. CONFIG_IP_NF_MATCH_STATE:如果要配置有狀態的防火牆,那麼這個選項非常重要而且很有用。這類防火牆會記得先前關於資訊包過濾所做的決定,並根據它們做出新的決定。
  3. CONFIG_IP_NF_FILTER:這個選項提供一個基本的資訊包過濾框架。如果開啟這個選項,則會將一個基本過濾表(帶有內建的INPUT、FORWARD和OUTPUT鏈)新增到核心空間。
  4. 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