首页未分类 › CentOS 5.1 做NAT代理,实现封迅雷,BT,pplive

CentOS 5.1 做NAT代理,实现封迅雷,BT,pplive

 公司最近有要求,需要封一些和办公无关的东西,又不想买硬件防火墙。我只好用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 —> 新加入的模块都在这里 选中新加入的模块 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 ^x43x4Fx4Ex4E.+x0Dx0A$ 保存退出 防火墙部分就做完了,现在做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服务器就完成了。

发表评论