l7filter:介紹
能過濾7層協議,例如過濾QQ、迅雷
原版只支持2.6.28,不支持centos6的2.6.32;馬哥的版本支持2.6.32
實現l7filter:
給內核(netfilter)打補丁。下載內核源碼打補丁後,從新編譯
內核源碼從內核官網下載版本2.6.32,與紅帽官網的同一版本不一樣,紅帽在其上集成最新驅動
紅帽內核源碼rpm包內置密鑰,若是檢測不經過則沒法編譯,可是咱們能夠關閉該檢測
http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/
kernel-2.6.32-431.11.2.el6.src.rpm
安裝此源碼包,就解壓到當前目錄,生成一個編譯內核的環境
給iptables打補丁。先卸載iptables的rpm,再下載其源碼來打補丁
diff/patch:打補丁的知識
diff是比對舊程序和新程序的源碼以便生成補丁的工具
diff [-u] 舊源碼 新源碼 > 新版本補丁.patch
patch打補丁
單箇舊源碼文件:
給舊源碼打補丁
patch [選項] 舊源碼 < 新版本補丁.patch
還原舊源碼
patch -R 新源碼 < 新版本補丁.patch
多箇舊源碼文件(有目錄層級)
patch -p[num] < 新版本補丁
例如:
a/b/c/d.txt 當前目錄下的源碼目錄中的源碼
cd a/b 打補丁的目錄,跳過2級目錄
patch -p2 < 新版本補丁
rpmbuild [選項]
SPECS文件 製做rpm包
-ba 既製做源碼包又製做二進制包
-bb 製做二進制包
實驗:使用layer7禁止QQ聯網
要安裝的包
kernel-2.6.32-431.11.2.el6.src.rpm 待打補丁的內核(netfilter)源碼
iptables-1.4.7-11.el6.src.rpm 待打補丁的iptables源碼
netfilter-layer7-v2.23.tar.bz2 layer7在內核和iptables的源碼補丁
l7-protocols-2009-05-28.tar.gz layer7的特徵碼
實驗步驟
第一步.對內核源碼打補丁後,編譯安裝
a.安裝kernel源碼
uname -r
useradd mockbuild 添加內核源碼安裝用戶
rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm 注意:會自動解壓到當前用戶的家目錄下
cd ~
cd rpmbuild
SOURCES 源碼文件目錄
config-x86_64-generic[-rhel] 在不一樣平臺編譯的配置文件
至關於當前系統的/boot/config-${內核版本}
linux-${內核版本號}.tar.bz2 紅帽的內核源碼
解壓內核源碼
SPECS 製做rpm的指導文件
cd SOURCES
tar xf linux-${內核版本號}.tar.bz2 -C /usr/src
cd /usr/src
ln -sv linux-${內核版本號} linux
b.給內核源碼打補丁
cd ~
tar xf netfilter-layer7-v2.23.tar.bz2 -C /usr/src
cd /usr/src/linux
patch -p1 < ../netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
c.編譯安裝內核並重啓
cp /boot/config-2.6.32-358.el6.x86_64 .config 使用本地的配置模板來編譯
make menuconfig
配置內核選項
啓用layer7模塊,由於源模板沒配置該選項
Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration ---> 啓用"layer7" match support
關閉模塊簽名校驗和內核簽名校驗,不然內核編譯後沒法安裝
Enable loadable module support ---> 禁用 Module signature verification (EXPERIMENTAL)
Cryptographic API ---> 禁用 In-kernel signature checker (EXPERIMENTAL)
爲了編譯更快,能夠去掉一些驅動和沒必要要的功能。例如硬件驅動、虛擬化等
yum -y install screen
screen 防止編譯過程當中中斷
從新編譯:
make help
make mrproper
cp /boot/config-2.6.32-358.el6.x86_64 .config
make menuconfig
.....
make -j 4 利用CPU核心並行編譯
make modules_install
make install
init 6
uname -r
2.6.32 版本號不夠長是由於編譯時沒配置
ls /lib/modules/2.6.32/kernel/net/netfilter/
nf_conntrack.ko xt_layer7.ko 新增的模塊依賴於前者,兩個模塊同時裝載纔有效
第二步.對iptables打補丁後,編譯rpm後安裝
a.安裝iptables源碼
cd ~
rm -fr rpmbuild 安裝源碼時會從新生成該目錄,所以將前面安裝內核源碼生成的目錄刪掉
rpm -ivh iptables-1.4.7-11.el6.src.rpm
b.給源碼打補丁
cd rpmbuild/SOURCES
tar xf iptables-1.4.7.tar.bz2
cd iptables-1.4.7
cp /usr/src/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* extensions/
cd ..
rm iptables-1.4.7.tar.bz2
tar jcf iptables-1.4.7.tar.bz2 iptables-1.4.7
rm -fr iptables-1.4.7
c.編譯製做rpm包
cd ../SPECS
vim iptables.spec 修改編譯參數,讓其基於修改後的內核源碼來編譯
更改%build區域中的編譯值:刪除--with-kernel、--with-kbuild選項,修改--with-ksource=/usr/src/linux
./configure --enable-devel --enable-libipq --bindir=/bin --sbindir=/sbin --sysconfdir=/etc --libdir=/%{_lib} --libexecdir=/%{_lib} --mandir=%{_mandir} --includedir=%{_includedir} --with-ksource=/usr/src/linux
修改發行版本號,11改成11.1
Release: 11.1%{?dist}
添加打包者信息,在Provides:指令後追加
Packager: Tangsw <tsw1107@163.com>
添加修改日誌,在%changelog指令後添加
* Sat Dec 5 2015 Tangsw <tsw1107@163.com> 1.4.7-11.1
- add layer7 module
rpmbuild -ba iptables.spec
cd ..;ls
SOURCES/ SPECS/ SRPMS/ BUILD/ BUILDROOT/ RPMS/ 生成了後面4個目錄
ls SRPMS 源碼rpm包
iptables-1.4.7-11.1.el6.src.rpm
cd RPMS/x86_64/; ls 二進制rpm包
iptables-1.4.7-11.1.el6.x86_64.rpm v4版本包
iptables-ipv6-1.4.7-11.1.el6.x86_64.rpm v6版本包
iptables-devel-1.4.7-11.1.el6.x86_64.rpm devel包
iptables-debuginfo-1.4.7-11.1.el6.x86_64.rpm
d.安裝rpm包
rpm -qi iptables 查看本地版本
rpm -Uvh iptables-1.4.7-11.1.el6.x86_64.rpm iptables-ipv6-1.4.7-11.1.el6.x86_64.rpm 升級新版本
rpm -qa | grep iptables
iptables-1.4.7-11.1.el6.x86_64
iptables-ipv6-1.4.7-11.1.el6.x86_64
rpm -ql iptables | grep layer7
/lib64/xtables/libxt_layer7.so
第三步.安裝layer7的特徵碼
tar xf l7-protocols-2009-05-28.tar.gz
cd l7-protocols-2009-05-28
make install
ls /etc/l7-protocols/protocols
kugoo.pat、qq.pat、pplive.pat、xunlei.pat
第四步.配置測試環境
NAT服務器:
外網IP:192.168.8.15
內網IP:192.168.56.15
DNS: 192.168.8.1
內網客戶端:
IP:192.168.56.16
GW: 192.168.56.15
DNS: 192.168.8.1
a.以編譯後的新內核啓動
b.配置NAT服務器
開啓forward內核參數
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
添加nat規則,在內網經過nat服務器上外網
iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j SNAT --to-source 192.168.8.15
添加filter規則,禁止qq連線,添加前先加載layer7相關模塊,並設置參數
modprobe nf_conntrack
modprobe xt_layer7
sysctl -a | grep nf_conntrack
vim /etc/sysctl.conf
net.netfilter.nf_conntrack_acct=1
sysctl -p
iptables -t filter -A FORWARD -s 192.168.56.0/24 -m layer7 --l7proto qq -j REJECT
第五部.測試
192.168.56.16主機能訪問網頁,但不能上QQ