Linux 內核2.4 版本中集成了NetFilter框架,該框架是Linux平台新的網絡安全功能框架,實現了多種網絡安全功能:數據包過濾、狀態保持、NAT,以及抗攻擊等等。我們熟知的Iptables,僅僅是NetFilter框架在用戶空間的配置工具,負責從用戶命令行界面接收命令,然後轉化成內核認識的結構體,調用相應的內核操作函數,將規則插入到內核中去。
Iptables的使用方法請在Linux命令行界面中鍵入"man iptables",查看手冊頁的情況。
要使用Iptables,必須在編譯Linux內核的時候(內核的版本必須大於2.4)選擇與NetFilter相關的內核模塊,否則即使安裝了Iptables,也不能使用。別著急,看到NetFilter和Iptables,不要認為他們是兩個東西,它們一個是內核空間的實現模塊,稱作NetFilter,一個是用戶空間的控制命令解析器,稱作Iptables。兩者結合才能完成整體的工作。我們按以下的敘述順序說明Iptables和NetFilter的使用方法,以及如何使用它們增強主機的安全性。
將分如下章節討論
1. 內核NetFilter選項編譯過程
2. Iptables工具的安裝和編譯
3. NetFilter框架和Iptables使用方式概述
4. 使用Iptables增強主機安全性How-To
好了,開始我們的Iptables之旅吧!注意本手冊說明的過程都是在RedHat7.2 內核版本2.4.7,啟動程序為LILO,Shell為bash 上進行操作的。在別的版本的內核或者操作環境請具體參考系統手冊頁man信息。
2.1. 內核NetFilter選項編譯過程
2.1.1. 內核代碼的位置
安裝了Linux以後,內核部分的代碼在系統目錄 /usr/src/Linux-2.4/ 中。當然如果下載了新的內核代碼包,例如名為linux-kernel-2.4.X.tag.gz(X表示次要版本號),可以在任何一個目錄下解開該代碼包,但是一般的規律是將代碼包解壓到/usr/src/目錄下,使用的命令序列如下:
[test /root/]# pwd/root[test /root/]# mv linux-kernel-2.4.7.tag.gz /usr/src/[test /root/]# cd /usr/src/[test /usr/src/]# tar zxvf linux-kernel-2.4.7.tar.gz[test /usr/src/]# cd linux-kernel-2.4.7
好了,進入到了新的內核代碼目錄,我們現在開始對目錄進行裁減和編譯。注意:如果沒有支持2.4版本的內核,可以從http://www.kernel.org 的網站上獲得關於Linux內核的最新下載信息。
2.1.2. 內核代碼選項介紹
進入內核源代碼所在的目錄以後,在該目錄下使用如下命令進入內核配置界面:
make menuconfig
該命令會進入到一個ASCI的簡單菜單界面,讓用戶對需要的內核選項進行選取,然後自動保存成一個內核配置文件。進入配置界面後如下圖:
選中"Networking options",進入下一配置界面
本界面是專門配置Linux主機網絡特性的配置選項
本界面的內容包含了專門配置Netfilter選項
裡面羅列的選項一般都需要使用Space鍵選中。注意在高亮光標停留在某個選項上時,使用Space鍵可以將該選項加入內核中。但是一個選項和內核有三種關系:
· 模塊化方式加入。(在選項前顯示【M】)
· 直接編譯到內核中。(在選項前顯示【*】)
· 不加入內核(選項前顯示為空【】)
這兩種方式都沒有問題,一般推薦使用直接編譯到內核中。Space鍵可以在"模塊方式"、"直接編譯方式"、"忽略模塊"這三種方式之間進行切換。好了,選擇完你需要的選項以後,直接使用Tab鍵將高亮光標移動到"Exit"上,然後一路退出,到下一個界面。保存剛才對內核選項的配置,然後回車退出。
2.1.3. 內核代碼的編譯和安裝
編譯內核分為以下幾步:
1. 首先使用命令make dep命令編譯內核模塊之間的依賴關系。
2. 然後使用命令make bzImage 命令編譯壓縮的內核。
3. 最後連續使用make modules 和make modules_install命令將模塊化的選項編譯到內核中。
4. 好了,已經編譯完成了內核,現在新內核的名字叫做bzImage,路徑位置在(假設源代碼在/usr/src/Linux-2.4中)/usr/src/Linux-2.4/arch/i386/boot/下,名稱為bzImage。
5. 現在我們要使用這個新的內核啟動系統。將bzImage拷貝到/boot/目錄下,然後起個新的你喜歡的名字,我們假設為bzImage.nf。
2.1.4. 系統使用新編譯的內核重新啟動
1. 修改/etc/lilo.conf(假設你用LILO啟動系統),添加下列行:
image=/boot/bzImage.nf label=linux-nf read-only root=/dev/hda5 (換成你系統的根所在的硬件路徑)
2. 編輯完成以後,在shell中敲入命令lilo,安裝新的內核到啟動映像中。
3. 重新啟動系統(使用命令reboot,或者halt -r)
4. 在系統啟動以後,你會看到LILO提出的提示符,此時按TAB鍵,然後會出現可以使用的啟動內核,應該有linux-nf,它對應的內核就是/boot/bzImage.nf。直接敲入linux-nf,然後回車,系統就會使用bzImage.nf啟動。 2.2. Iptables工具的安裝和編譯
Iptables是Linux Netfilter框架的用戶端程序,負責接收用戶的命令,並且將用戶命令添加到內核中。Iptables一般是一個*.tar.gz的軟件包,下載以後使用如下命令序列將其展開:
[test /root]# pwd/root[test /root]# tar zxvf iptables-2.6.tar.gz[test /root]# cd iptables-2.6[test /root]# make[test /root]# make install
好了,現在可以直接在命令行方式下使用該命令了。該命令的語法後面介紹。
2.3. NetFilter框架和Iptables使用方法概述
Linux根據數據包在內核中的不同處理,將整個IP包在內核中的生存周期劃分為三個:PREROUTING、FORWARD、POSTROUTING。其他還有兩個LOCAL_INPUT和LOCAL_OUTPUT(一般簡寫成INPUT和OUTPUT),分別對應送入本機上層協議棧的數據包和本機發送出的數據包。如果想要保護本機的安全性,那麼只需關注INPUT和OUTPUT方向的數據包就可以了。其他幾個不需要關心。
這五個方向對應著內核中五條不同的規則鏈和三個不同的規則表。
Linux中規則鏈被組織在三個不同的規則表中:Filter 、NAT、Mangle。其中Filter針對過濾系統,NAT針對地址轉換系統,Mangle針對策略路由和特殊應用。規則鏈分配如下:
· Filter:INPUT、FORWARD、OUTPUT
· NAT:PREROUTING、POSTROUTING
· Mangle:PREROUTING、POSTROUTING
針對主機的安全性主要集中在Filter表中的INPUT和OUTPUT規則鏈,這兩個關鍵字在添加規則的時候會使用到。
在內核編譯了NetFilter系統以後,系統會自動建立這五個規則鏈和三個規則表。
我們在使用的時候主要要使用到的規則表是Filter表,規則鏈是INPUT和OUTPUT鏈。添加的主要規則都集中在這兩個鏈上。用圖示表示如下:
2.4. 使用Iptables增強主機的安全性How-To
1. 取消不必要的服務監聽端口
使用Linux下的Setup命令,進入ASCI圖形界面,限制主機提供的常用服務,例如FTP、Daytime、Echo、Telnet、WEB、syslog remote等等一系列不需要的服務。
然後使用下列命令序列重啟Xinetd:
[test /root]# cd /etc/init.d[test /root]# ./xinted restart
使用netstat -na命令觀察系統中是否有不期望的端口正在監聽。如果自己需要什麼服務,利用Setup工具打開服務,並且重啟Xinetd就可以了。
如果沒有不期望的端口被打開,可以進入下一步。
2. 修改INPUT和OUTPUT規則鏈的默認策略
使用下列命令序列:
[test /root]# iptables -P INPUT DROP[test /root]# iptables -P OUTPUT DROP
這樣以來,任何未經同意的數據包都會被系統拒絕。
添加如下命令控制訪問主機:
iptables -A INPUT -p PROTO -state ESTABLISHED ,RELATED -j ACCEPT
本條命令的含義是凡是屬於已經建立連接的數據包,或者關聯性連接的數據包都允許通過。注意將命令行中的"PROTO"換成真正的協議名稱tcp、 udp、 或者 icmp
iptables -A INPUT -s A.B.C.D/32 -p PROTO -dport PORT -j ACCEPT
這條命令的含義是允許從IP地址為A.B.C.D主機來的,協議為PROTO的IP包,訪問本主機的PORT端口的數據包允許通過。例如可以將PORT換成80 ,表示WEB服務,換成22,表示SSH服務等等。注意將PROTO換成tcp或者udp。
好了,只有經過上述命令添加的IP地址的主機,才能訪問該主機。
為了防止IP地址冒充,我們可以將IP地址和MAC地址進行綁定,使用如下命令:
arp -s A.B.C.D aa:bb:clearcase/" target="_blank" >cc:dd:ee:ff
表示A.B.C.DIP地址對應的MAC地址是aa:bb:cc:dd:ee:ff。
上述命令完成以後,主機的安全訪問就在NetFilter的控制之下了。
例如,允許10.0.0.41的主機訪問該服務器的SSH服務,使用如下命令:
iptables -A INPUT -s 10.0.0.41/32 -p tcp -dport 22 -j ACCEPT
允許10.0.0.0/24網段訪問news服務:
iptables -A INPUT -s 10.0.0.0/24 -p tcp -dport 532 -j ACCEPT
同時綁定內部主機的MAC地址和IP地址的對應關系。
最後可以使用下列命令觀察一下是否所有需要的規則都被完全的加入了內核中:
iptables -L