實驗環境:
Vmware9虛擬機,CentOS6.5系統,netfilter-layer7-v2.23.tar.bz2
編譯新內核的緣由:
新版本的CentOS6.5系統不支持老版本的layer7軟件,官方的layer7版本爲netfilter-layer7-v2.22.tar.bz2,經修改後的layer7版本爲netfilter-layer7-v2.23.tar.bz2,可以支持CentOS6.5版本的系統,但更高版本的系統不支持,如CentOS7,所以修改後的新版layer7可以支持CentOS6.5及以前版本。製作者:馬哥教育馬永亮老師。
實驗步驟:
一,編譯安裝RedHat官方源碼包的內核文件。實驗中使用的版本是:kernel-2.6.32-431.11.2.el6.src.rpm
[root@localhost ~]# ls #在root用戶的家目錄下準備的安裝文件: anaconda-ks.cfg install.log install.log.syslog kernel-2.6.32-431.11.2.el6.src.rpm netfilter-layer7-v2.23.tar.bz2 iptables-1.4.7-11.el6.src.rpm l7-protocols-2009-05-28.tar.gz [root@localhost ~]# rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm warning: kernel-2.6.32-431.11.2.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY 1:kernel ########################################### [100%] [root@localhost ~]# ls ###安裝完成後會在當前目錄生成rpmbuild目錄 anaconda-ks.cfg install.log.syslog mariadb-10.0.12 rpmbuild install.log kernel-2.6.32-431.11.2.el6.src.rpm mariadb-10.0.12.tar.gz [root@localhost ~]# cd rpmbuild/SOURCES [root@localhost SOURCES]# tar xf linux-2.6.32-431.11.2.el6.tar.bz2 -C /usr/src [root@localhost SOURCES]# cd /usr/src [root@localhost src]# ln -sv linux-2.6.32-431.11.2.el6/ linux `linux' -> `linux-2.6.32-431.11.2.el6/' [root@localhost src]# cd [root@localhost ~]# tar xf netfilter-layer7-v2.23.tar.bz2 -C /usr/src/ [root@localhost ~]# cd /usr/src [root@localhost src]# ls debug kernels linux linux-2.6.32-431.11.2.el6 netfilter-layer7-v2.23 [root@localhost src]# cd netfilter-layer7-v2.23/ [root@localhost netfilter-layer7-v2.23]# ls ##kernel-2.6.32-lay7-2.23patch是內核的補丁文件。 CHANGELOG kernel-2.6.32-layer7-2.23.patch [root@localhost netfilter-layer7-v2.23]# cd ../linux [root@bogon linux]# patch -p1 < ../netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch ###向內核打補丁 [root@bogon linux]# cp /boot/config-2.6.32-431.el6.x86_64 .config
經過這些步驟後,向新內核打的補丁文件完成,然後開始編譯新內核。
[root@bogon linux]# make menuconfig 需要選中的選項是: Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration ---> "layer7" match support 然後取消RedHat的內核校驗功能: Enable loadable module support ---> Module signature verification (EXPERIMENTAL) Cryptographic API ---> In-kernel signature checker (EXPERIMENTAL) 開始執行編譯安裝 [root@bogon linux]# make [root@bogon linux]# make install
編譯安裝完成後生成的新內核版本爲2.6.32,之前的版本是2.6.32-431.el6.x86_64,重啓系統,選擇新內核啓動。
二、編譯安裝iptables
[root@bogon ~]# rpm -ivh iptables-1.4.7-11.el6.src.rpm ###安裝後也會生成rpmbuild目錄 [root@bogon ~]# cd rpmbuild/SOURCES [root@bogon SOURCES]# tar xf iptables-1.4.7.tar.bz2 ###將iptables源碼包解壓出來 [root@bogon SOURCES]# cd iptables-1.4.7 [root@bogon iptables-1.4.7] cp /usr/src/netfilter/iptables-1.4.3forward-for-kernel-2.6.20forward ./extensions ###向解壓出來的iptables源碼包目錄中添加iptables的補丁文件 [root@bogon iptables-1.4.7] cd .. [root@bogon SOURCES] rm iptables-1.4.7.tar.bz2 ###刪除原來的iptables源碼包,使用新的iptables源碼包,新的源碼包還需要創建成tar.bz2的格式。 [root@bogon SOURCES] tar -jcf iptables-1.4.7.tar.bz2 iptables-1.4.7 [root@bogon SOURCES]# cd ../SPECS/ [root@bogon SPECS]# vim iptables.spec ###修改rpm包製作的指導文件,添加內容: ./configure --enable-devel --enable-libipq --bindir=/bin --sbindir=/sbin --sysconfdir=/etc --libdir=/%{_lib} --libexecdir=/%{_lib} --mandir=%{_mandir} --includedir=%{_includedir} --with-ksource=/usr/src/linux ###將編譯的選項中指向的內核源碼包的位置更改爲我們解壓縮出來的源碼包的位置,同時將iptables的版本改變一下,之前是11,把它提高一個版本爲12,同時可以添加其他的信息,製作者信息等等。 Name: iptables Summary: Tools for managing Linux kernel packet filtering capabilities Version: 1.4.7 Release: 12%{?dist} [root@bogon SPECS]# rpmbuild -ba iptables.spec ###生成iptables的源碼rpm包和對應的二進制格式的rpm包 [root@bogon SPECS] cd .. [root@bogon rpmbuild]# ls ###可以看到生成了RPMS和SRPMS兩個目錄 BUILD BUILDROOT RPMS SOURCES SPECS SRPMS [root@bogon rpmbuild]# cd RPMS/x86_64 [root@bogon RPMS]# rpm -Uvh iptables-1.4.7-12.el6.x86_64.rpm iptables-ipv6-1.4.7-12.el6.x86_64.rpm 升級安裝iptables後會在/lib/modules/2.6.32/kernel/net/netfilter目錄下生成xt_layer7.ko文件
三、安裝l7-protocol文件:
[root@localhost ~]# tar xf l7-protocols-2009-05-28.tar.gz [root@localhost ~]# cd l7-protocols-2009-05-28 [root@localhost l7-protocols-2009-05-28]# make install [root@localhost l7-protocols-2009-05-28]# cd /etc/l7-protocols/protocols/ ###該目錄下有許多協議用於控制對應的應用程序對網絡的訪問,其中有QQ,迅雷等等。
四、加載nf_conntrack和layer7模塊,設置iptables規則。
[root@bogon ~]# modprobe nf_conntrack [root@bogon ~]# modprobe xt_layer7 [root@bogon ~]# vim /etc/sysctl.conf ###添加如下參數: net.ipv4.ip_forward = 1 ###網卡間轉發的功能要打開,否則代理上網的主機無法爲客戶端轉發數據包 net.netfilter.nf_conntrack_acct = 1 ###這個參數可以利用layer7模塊對特殊協議的數據報文進行過濾,所以一定要設置,否則layer7加載了也不會生效。 [root@bogon ~]# sysctl -p ###使修改後的參數立即生效 代理上網的主機需要有兩塊網卡,一個可以聯網,一個用戶連接內網客戶端,作爲內網的網關使用。iptables的規則設置如下: [root@bogon ~]# iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 192.168.227.133 [root@bogon ~]# iptables -A FORWARD -m layer7 --l7proto qq -j REJECT
設置這兩項以後如果客戶端的主機使用QQ就不能上網了,但如果在局域網內部還需要添加一臺DNS服務器,以方便爲客戶端主機解析外網地址,方便使用瀏覽器瀏覽網站,如果需要對其他的軟件設置過濾功能,在iptables中添加規則就可以了。