在linux環境中,工作于內核空間的netfilter和工作于用戶空間的iptables共同組成了其功能強大且操作靈活的防火墻系統,對進出主機或內外網之間的流量基于IP地址、通信協議、端口以及連接狀態等進行管控,然而,對于一些使用非固定端口或者通信協議的應用程序,默認是沒有辦法做限制的,比如聊天軟件QQ、下載工具迅雷等,不過我們可以通過增添模塊的方式來實現應用程序管控。
一、實驗拓撲
主機A使用網卡eth0通過路由器接入公網(internet),使用網卡eth1與主機B相連,主機B網關指向主機A的eth1網卡的ip地址,通過A代理訪問internet。
二、實驗環境
(1)、實驗平臺:Vmware Workstation 10
(2)、系統平臺:
主機A:CentOS 6.5 x86_64
eth0:192.168.1.209
eth1:192.168.2.1
主機B:Windows 7 64位旗艦版
eth0:192.168.2.2
三、用到的軟件以及版本
四、實驗目的
在主機A上面給新內核打上l7layer netfilter補丁并進行編譯,提供支持layer7的iptables,在主機A上配置l7layer過濾,使主機B不能登錄QQ,以此來驗證其應用層過濾功能。
五、在主機A上做如下配置
(1)、給內核打補丁
由于我們下載的內核時rpm格式,首先我們先安裝它,注意,此處需創建mockbuild用戶,否則無法安裝內核rpm包。
安裝完以后,在當前目錄下生成目錄 ~/rpmbuild,進入到./rpmbuild/SOURCES/目錄下,查看其中文件
將該目錄中的內核歸檔文件展開至/usr/src下,并創建符號鏈接文件為linux
# tar -xf linux-2.6.32-431.11.2.e16.tar.bz2 -C /usr/src
查看解壓后的內核文件
如上圖我們可以看到Makefile文件,我們可以修改此文件來給我們新編譯的內核做標記,以便在多內核同時存在的情況下啟動系統是能到一眼認出我們需要啟動的內核,做以下修改后,為本文新編譯的內核添加-silently后綴。
將補丁文件展開至/usr/src目錄下并查看,
使用上圖標出的補丁文件對內核打補丁,注意,打補丁時將當前工作目錄切換至內核文件所在目錄(即本文上面創建的符號鏈接文件linux中)
注意 此處打補丁命令patch的選項“-p1”是指當前工作目錄相對需打補丁的文件目錄有幾層(本文件中切換至需打補丁文件所在目錄,即僅有當前目錄這一層,因此為p1)
(2)、編譯內核(注意,一下操作均在打完補丁后的內核文件所在目錄中執行,本文即/usr/src/linux目錄下)
為方便實驗基于當前系統的內核配置文件修改后進行編譯,當前內核配置文件存在于/boot/下
啟動menuconfig圖形界面配置內核
依下圖順序分別去掉模塊簽名認證和內核編譯時的簽名認證,如不取消,由于redhat內置密鑰驗證機制,編譯玩的內核將會出現安裝不通過的情況
選擇“啟用模塊裝卸載支持”,回車進入
選定圖示行,按空格鍵取消“模塊裝載前面認證”
返回到首頁,選擇圖示行,回車進入
選擇“內核簽名認證選項”,空格鍵取消
返回首頁,依下圖順序,選定l7laye netfilter模塊,使新編譯的內核擁有該模塊
保存退出。
一次執行如下操作,編譯安裝內核
# make -j 2 //指定使用兩個cpu核心并行執行make操作
# make modules_install //安裝內核配置文件種指定模塊
# make install //安裝新內核
安裝完成后,查看/boot/grub/grub.con,看以看到新內核已經生成配置信息。
重啟系統選擇新內核啟動。
(3)、提供支持7layer模塊的iptables,本文介紹兩種方式,一種是編譯安裝,另一種是制作成rpm包來安裝。
A、將打完補丁后的iptables原文件制作成rpm包進行升級安裝
本方式使用
1、安裝目標rpm包(本文使用iptables-1.4.7-11.e16.src.rpm
# rpm -ivh iptables-1.4.7-11 //此步會在當前目錄下生成rpmbuild目錄
2、為iptables打補丁使其支持7layer netfileter
# cd rpmbuild/SOURCE/下 //此目錄中有iptables的歸檔文件
# tar -xf iptables-1.4.7.tar.bz2 //展開歸檔文件
# cd iptables-1.4.7 //cd進展開后目錄
# cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* ./extensions/ //拷貝補丁文件至目標目錄
3、將打完補丁的新版本文件重新歸檔至~/rpmbuild/SOURCE/中(注意此處需提前移除源歸檔文件)
# mv ~/rpmbuild/SOURCE/iptables-1.4.7.tar.bz2 / //移除原歸檔文件
# tar -jcf iptables-1.4.7.tar.bz2 ~/rpmbuild/SOURCE/iptables-1.4.7/* //將打完補丁后的文件重新打包成歸檔文件。
4、修改spec文件,以便新做成的rpm包可以適用于我們新編譯的內核
# vim ~/rpmbuild/SPECS/iptables.spec
上述修改完成后,謹記保存退出,然后創建rpm安裝包
# rpmbuild iptables.spec
待執行完成后,查看rpmbuild目錄
# ls ~/rpmbuild
上圖示,創建rpm安裝包是新創建的目錄
上圖可以看到,RPM包已經創建成功
5、升級iptables為我們新創建的版本
查看升級生成文件確認支持7layer netfilter模塊
# rpm -ql iptables
查看iptables詳細安裝信息,確認版本
B、編譯安裝iptables
本方式使用
1、解壓iptables源碼歸檔包并為其打支持layer7 netfilter支持補丁
# tar -xf iptables-1.4.20.tar.bz2
# cd iptables-1.4.20
\\注意,此處打補丁不同于上文為內核打補丁的方式,此處只需將/usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/=目錄下的所有文件拷貝至~/iptables-1.4.20/extensions/目錄下即可
# cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* ~/iptables-1.4.20/extensions/
2、備份系統已安裝iptables的服務腳本文件和配置文件
忽略依賴方式卸載舊版本iptables,為編譯安裝新iptables做準備
3、編譯安裝iptables
# ./configure –prefix=/usr –with-ksource=/usr/src/linux
# make && make install
還原服務腳本文件和主配置文件,注意,由于此編譯安裝的iptables版本安裝路徑不同于其默認安裝路徑,因此要對服務腳本文件做以下修改
# cp /root/iptables /etc/rc.d/init.d/iptables
# cp /root/iptables-config /etc/sysconfig/iptables-config
# vim /etc/etc/rc.d/init.d/iptables
六、測試iptables應用層過濾
(1)裝載應用層過濾所需模塊
1、為應用層過濾提供特征碼(每個應用程序都有其特征碼,netfilter增加了l7layer模塊支持后,就是依此特征碼來做流量過濾的)
# tar -xf tar -xf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
2、由于l7layer過濾功能依賴于nf_conntract模塊,故需要將其裝載
修改配置文件,啟用nf_conntract模塊,使其永久有效
# vim /etc/sysctl.conf
# sysctl -p //確認此模塊生效
(2)、編輯/etc/sysctl.conf,啟用主機路由功能
# vim /etc/sysctl.conf
# sysctl -p //確認路由功能開啟并生效
添加防火墻策略,讓主機A成為主機B的上網代理服務器
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT –to-source 192.168.1.211
測試主機C能正常上網以及登錄QQ
上網正常
QQ也能正常登錄
在FORWARD鏈上配置netfilter策略,拒絕qq流量通過
# iptables -A FORWARD -m layer7 –l7proto qq -j REJECT
然后小退qq,重新登錄
可以看到,qq已經無法登錄,查看相應規則
看到有匹配到響應報文,應用層過濾已實現!
原創文章,作者:Silently,如若轉載,請注明出處:http://www.www58058.com/6181