当前位置: 首页 > news >正文

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 --->

新加入的模块都在这里 选中新加入的模块
<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服务器就完成了。

相关文章:

  • C# 中的Retry 模型
  • Apple应用消息通知 swift前端c#后端
  • MySQL数据库灾难恢复
  • 使用C# Diagnostics.DebuggerDisplay属性提高调试信息可读性
  • PDI简单介绍之ETL工具-----spoon
  • python flask web环境配置步骤
  • python flask SQLAlchemy 的用法
  • Blog须知
  • Azure VM Scalable Sets -- 适用IAAS架构
  • 数据库设计技巧14则
  • 一张图说明HTTPS 握手过程
  • linux-2.6.26内核中ARM中断实现详解(1)
  • 创建Azure scheduler完成日常任务
  • (TipsTricks)用客户端模板精简JavaScript代码
  • eclipse 生成发布的apk (signed zipalign过程)
  • 深入了解以太坊
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2018一半小结一波
  • Android 控件背景颜色处理
  • Apache的基本使用
  • canvas绘制圆角头像
  • es6
  • github从入门到放弃(1)
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Laravel 实践之路: 数据库迁移与数据填充
  • uva 10370 Above Average
  • Vue--数据传输
  • 闭包--闭包之tab栏切换(四)
  • 记一次和乔布斯合作最难忘的经历
  • 聊聊flink的BlobWriter
  • 嵌入式文件系统
  • 数据结构java版之冒泡排序及优化
  • 双管齐下,VMware的容器新战略
  • 微信小程序设置上一页数据
  • 学习Vue.js的五个小例子
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 智能合约Solidity教程-事件和日志(一)
  • FaaS 的简单实践
  • 进程与线程(三)——进程/线程间通信
  • 通过调用文摘列表API获取文摘
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​2020 年大前端技术趋势解读
  • #define 用法
  • $.each()与$(selector).each()
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C语言)fgets与fputs函数详解
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转) Face-Resources
  • (轉貼) UML中文FAQ (OO) (UML)
  • .axf 转化 .bin文件 的方法
  • .gitignore文件设置了忽略但不生效