公司最近有要求,需要封一些和办公无关的东西,又不想买硬件防火墙。我只好用iptables实现了,2.6内核编译内核为IPTABLES添加模 块(ipp2p+l7协议),今天就写最近工作需要的吧,技术浅陋,不敢说原创,借鉴了很多前人的东西,还望各位大虾不要笑话。

    系统安装CentOS5.1   默认内核 Linux-2.6.18-53.el5 ,默认 <script src="http://www.net130.com/CMS/JS/newsad.js"></script> 的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服务器就完成了。

Logo

更多推荐