公司最近有要求,需要封一些和辦公無關的東西,又不想買硬體防火牆。我只好用iptables實現了,2.6核心編譯核心為IPTABLES添加模
塊(ipp2p+l7協議),今天就寫最近工作需要的吧,技術淺陋,不敢說原創,借鑒了很多前人的東西,還望各位大蝦不要笑話。
系統安裝CentOS5.1 預設核心 Linux-2.6.18-53.el5 ,預設
的iptables版本是1.3.5
需要的安裝包,放在/root下吧
kernel-2.6.18-53.el5.src.rpm //核心的源碼包//
iptables-1.3.5.tar.bz2 //iptables-1.3.5的安裝源碼包//
dhcp-3.0.5-7.el5.i386.rpm //dhcp服務所用的包//
libpcap-0.9.4-11.el5.i386.rpm //很多網路軟體所依附的驅動包//
libpcap-devel-0.9.4-11.el5.i386.rpm //libcap的開發包//
l7-protocols-2008-02-20.tar.gz //layer7協議的安裝包//
netfilter-layer7-v2.17.tar.gz //核心和iptables的補丁//
ipp2p-0.99.15.tar.gz // ip2p2的模組,能限制迅雷.BT.QQ旋風和主流的網路電視//
tcptrack-1.2.0.tar.gz //一個簡單的流量查看工具//
防火牆選擇關閉
關閉SELINUX
配好網卡IP
網路設定資訊
外網卡:192.168.0.1 255.255.255.0
內網卡:192.168.3.1 255.255.255.0
預設閘道: 192.168.0.1
DNS: 219.141.136.10
211.94.69.34
以上配置資訊你可根據實際需求來配置,不用照搬
系統裝完用root登陸
# rpm -qa | grep kernel
把 kernel-smp*.rpm 和 kernel-smp-devel*.rpm 這兩個包卸掉
# rpm -e --nodeps kernel-smp
# rpm -e --nodeps kernel-smp-devel
查看grub.conf 啟動項就變成一項啦 否則系統預設啟動項是SMP多處理器的,我的機器只有一個CPU,所以就卸掉啦,當然你要是雙核或有多個CPU就不要卸載了
#cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/hda1
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=1
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-53.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.18-53.el5 ro root=LABEL=/1
initrd /boot/initrd-2.6.18-53.el5.img
修改SSH遠程啟用root登陸
# vi /etc/ssh/sshd_config
#PermitRootLogin yes 找到這句把前面的#注釋去掉 儲存退出
注意:因為iptables我們以後要配的 所以安裝的時候選擇不啟用,也就是說你現在的機器INPUT、OUTPUT都是ACCEPT 如果你不是選擇防火牆使你SSH串連不上,可以停掉,反正我們等下升級完它後還是會自己寫指令碼的 否則就沒升級它的必要啦
現在我們需要關閉些不重要的服務
#ntsysv
只保留以下幾個服務就夠了,其他都不選
crond
microcode_ctl
network
syslog
sshd
選好後儲存退出
重啟 #reboot
好,以上步驟都是在主機上做的,以後我們可以終端SSH上去。
開工!!!
解開所有壓縮包
# tar zxvf ipp2p-0.99.15.tar.gz -C /usr/src/
# tar zxvf l7-protocols-2008-02-20.tar.gz -C /usr/src/
# tar zxvf netfilter-layer7-v2.17.tar.gz -C /usr/src/
# tar xvjf iptables-1.3.5.tar.bz2 -C /usr/src/
修正rpm包安裝key警告問題
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
建立核心源碼包安裝所需使用者
# useradd mockbuild
安裝源碼包 考一份核心到 /usr/src/linux-2.6.18做編譯使用,如果編譯失敗 可以刪除後再考新的 所以不建議做軟串連操作
# rpm -ivh kernel-2.6.18-53.el5.src.rpm
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target=i686 kernel-2.6.spec
# cp -a /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686 /usr/src/linux-2.6.18
修改拷貝的核心與當前系統核心版本一致(很重要,否則編譯出來的模組不能被核心所使用)
# cd /usr/src/linux-2.6.18
# vi Makefile
修改 EXTRAVERSION = -prep
該成 EXTRAVERSION = -53.el5
保持跟uname -r 的版本一致 檢測一下
# uname -r
2.6.18-53.el5
# head -n4 Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
EXTRAVERSION = -53.el5
# make mrproper
該命令確保原始碼目錄下沒有不正確的.o檔案以及檔案的互相依賴。
#make oldconfig
該命令是產生就的核心設定檔,運行完後就會有.config檔案了
好了,現在為核心打補丁並添加模組
設定核心和iptables的環境變數
# export KERNEL_DIR=/usr/src/linux-2.6.18 //設定核心源碼路徑//
# export IPTABLES_DIR=/usr/src/iptables-1.3.5 //設定iptables-1.3.5源碼路徑//
添加Layer-7模組
# cd /usr/src/linux-2.6.18
# patch -p1 < /usr/src/netfilter-layer7-v2.17/for_older_kernels/kernel-2.6.18-2.6.19-layer7-2.9.patch
//給核心打補丁//
# cd /usr/src/iptables-1.3.5
# patch -p1 <
/usr/src/netfilter-layer7-v2.6/iptables-layer7-2.6.patch //iptables
打補丁//
# chmod +x extensions/.layer7-test
l7-filter模組加入完成
安裝l7協議
# cd /usr/src/l7-protocols-2008-02-20 (提示:如果當前系統時間不對,安裝會報錯。刪除/etc/l7-protocols檔案夾 ,調整系統時間後,再安裝就好了)
# make install
為核心選擇新添加的模組
# cd /usr/src/linux-2.6.18
# make menuconfig
進入核心配置
選項路徑1:Loadable module support --->
source checksum for all modules 這項去掉 !!!不檢查模組源
選項路徑2:Networking --->
Networking options --->
Network packet filtering (replaces ipchains) --->
IP: Netfilter Configuration --->
新加入的模組都在這裡 選中新加入的模組
<M> Layer 7 match support (EXPERIMENTAL) //選中L7//
[ ] Layer 7 debugging output (NEW) (這個debug 就不要選啦)
(2048) Buffer size for application layer data (NEW)
儲存退出
在重新編譯核心之前,我們需要把現有的模組目錄改名。這樣,即使編譯失敗,只要把模組目錄名改回成原來,系統還和以前一樣的~呵呵
#mv /lib/modules/2.6.18-53.el5 /lib/modules/2.6.18-53.el5.old
好,現在來重新編譯核心!這個過程是很漫長的,呵呵,慢慢等吧。其實不重新編譯核心也能加模組,但很多功能支援的不好。執行後總有報錯ERREO
開始重新編譯核心
#make bzImage //字母“I”是大寫的,要多多注意哦//
執行這個命令以後你就可以等上一段時間了·很漫長,結束後
#make modules //編譯各個模組,等很久地,呵呵//
#make modules_install //安裝模組//
#mv /boot/System.map-2.6.18-53.el5 /boot/System.map-2.6.18-53.el5.old //備份原map檔案//
#cp System.map /boot/System.map-2.6.18-53.el5 //拷貝核心源碼目錄下的map檔案到"/boot"檔案夾下//
#reboot //重新啟動,使用新核心//
再次使用root使用者登陸ssh
開始安裝新的 iptables
(這個注釋不明白是什麼意思)
# vi /usr/src/linux-2.6.18/include/linux/config.h
用 // 把下面的中間三行注釋掉
#include <linux/autoconf.h>
//#if !defined (__KERNEL__) && !defined(__KERNGLUE__)
//#error including kernel header in userspace; use the glibc headers instead!
//#endif
#endif
儲存退出
# cd /usr/src/iptables-1.3.5
# export KERNEL_DIR=/usr/src/linux-2.6.18
# export IPTABLES_DIR=/usr/src/iptables-1.3.5
保證有這兩個環境變數存在(已經做過,可用 echo $ KERNEL_DIR和echo $ IPTABLES_DIR 查看目錄設定是否正確)然後安裝
# make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install
安裝ipp2p模組,使他支援更多的協議
# cd /usr/src/ipp2p-0.99.15
# vi Makefile
修改以下內容
把 #KERNEL_SRC = /usr/src/linux
改成 KERNEL_SRC = /usr/src/linux-2.6.18
把 KERNEL_SRC ?= $(firstword $(wildcard /lib/modules/$(shell uname -r)/build /usr/src/linux))
改成 #KERNEL_SRC ?= $(firstword $(wildcard /lib/modules/$(shell uname -r)/build /usr/src/linux))
以上其實就是改核心源碼和iptables源碼的路徑!!這裡一定要改對哦!!!
把 $(CC) -shared -o libipt_ipp2p.so libipt_ipp2p.o
改成 ld -shared -o libipt_ipp2p.so libipt_ipp2p.o
修改完畢
#make
cp libipt_ipp2p.so /lib/iptables //將編譯好的libipt_ipp2p.so模組複製過去//
cp ipt_ipp2p.ko /lib/modules/2.6.18-53.el5/kernel/net/ipv4/netfilter/ //將編譯好的ipt_ipp2p.ko模組複製過去//
好,所有模組都安裝好了
#depmod -a //更新核心模組的依賴關係//
安裝結束
測試
1、查看 iptables版本
# iptables –V
iptables v1.3.5
查看 ipp2p 版本
# iptables -m ipp2p -h | grep IPP2P
IPP2P v0.99.15 options:
以下是我的iptables規則指令碼,將以下指令碼存在一個檔案裡
#vi /root/firewall_acl
echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_conntrack
modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -F -t nat
/sbin/iptables -X -t nat
/sbin/iptables -Z -t nat
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -A FORWARD -p tcp -m multiport --dport 80,443 -m layer7 --l7proto qq -j DROP #封QQ
/sbin/iptables -A FORWARD -p udp --dport 4000 -j DROP #封QQ
/sbin/iptables -A FORWARD -p udp --dport 8000 -j DROP #封QQ
/sbin/iptables -A FORWARD -p tcp -m layer7 --l7proto socks -j DROP #使用使用socks代理
/sbin/iptables -A FORWARD -p tcp -m layer7 --l7proto httpagentqq -j DROP
/sbin/iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP #封MSN
/sbin/iptables -A FORWARD -p udp --dport 53 -m string --hex-string "|717103636F6D|" --algo bm -j DROP
#過濾tencent字元
/sbin/iptables -A FORWARD -p tcp -m ipp2p --edk --kazaa --gnu --bit --apple --soul --xunlei --pp -j DROP
#過濾迅雷,bt,和QQ旋風,QQ直播,pplive,ppstarm,把迅雷限制成單線程下載 TCP包
/sbin/iptables -A FORWARD -p udp -m ipp2p --edk --kazaa --gnu --bit
--apple --soul --xunlei --pp -j DROP
#過濾迅雷,bt,和QQ旋風,QQ直播,pplive,ppstarm,把迅雷限制成單線程下載 UDP包
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 串連狀態追蹤
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p udp -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p udp -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i eth1 -p icmp -j ACCEPT
/sbin/iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -i eth1 --dport 22 -j ACCEPT
#/sbin/iptables -A FORWARD -s 192.168.3.0/24 -m limit --limit 500/s -j ACCEPT
#這兩條不是必要,如要你要限制這個段的流量!!!
#/sbin/iptables -A FORWARD -s 192.168.3.0/24 -j DROP
#同上,這兩條必須成對出現,否則不生效!!!
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.3.0/24 -j MASQUERADE
/etc/rc.d/init.d/dhcpd start
儲存退出
#chmod 755 firewall_acl
#vi /etc/l7-protocols/protocols/httpagentqq.pat //建立一個L7的規則檔案,用來封QQ,內容如下//
# The HttpAgentqq Connect Action
httpagentqq
^/x43/x4F/x4E/x4E.+/x0D/x0A$
儲存退出
防火牆部分就做完了,現在做DHCP服務
#rpm -ivh dhcp-3.0.5-7.el5.i386.rpm
然後
#cd /root
#vi dhcpd.conf //編輯一個dhcp服務最基本的設定檔,裡面的DNS和IP池可以改成你自己實際需要的//
default-lease-time 259200;
max-lease-time 518400;
option domain-name "dhcp3.ibexrouter.com" ;
option domain-name-servers 219.141.136.10, 211.94.69.34 ;
ddns-update-style interim;
subnet 192.168.3.0 netmask 255.255.255.0 {
range 192.168.3.2 192.168.3.100;
option broadcast-address 192.168.3.255;
option routers 192.168.3.1;
}
儲存退出
#cp dhcpd.conf /etc/
會提示你受否覆蓋,按y覆蓋
然後你還要改DHCP工作在那個網卡上,當然是內網卡了
vi /etc/sysconfig/dhcpd
DHCPDARGS=eth0
儲存退出,讓DHCP工作在eth0這塊網卡上,也就是我的內網卡
# service dhcpd start //啟動DHCP服務//
#netstat -aunp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:67 0.0.0.0:* 1820/dhcpd
出現以上資訊說明DHCP成功啟動了~如果沒啟動,請仔細看看設定檔/etc/dhcpd.conf
DHCP安裝結束,現在安裝簡單的流量查看工具tcptrack,個人覺得挺好用的
#cd /root
#rpm -ivh libpcap-0.9.4-11.el5.i386.rpm //很多網路軟體所依附的驅動包//
#rpm -ivh libpcap-devel-0.9.4-11.el5.i386.rpm //libcap的開發包//
#tar zxvf tcptrack-1.2.0.tar.gz
#cd tcptrack-1.2.0
#./configure
#make
#make install
現在可以使用tcptrack來查看流量了
#tcptrack -i eth0 //想查看那塊網卡,把eth0換成相應的網卡名就OK了//
現在工作要收尾了
vi /etc/rc.d/rc/local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/root/firewall_acl //加一行,這行的作用是開機時載入這個指令碼,也就是我們的iptables規則了!//
好了,現在可以reboot了
重新啟動後,iptables規則生效!
DHCP可以自動為段內分配IP。
一個簡單的NAT伺服器就完成了。