Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138949
  • 博文数量: 8
  • 博客积分: 666
  • 博客等级: 上士
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-30 22:46
文章分类
文章存档

2012年(5)

2011年(3)

我的朋友

分类: LINUX

2012-01-06 14:58:42

iptables 限制连接数,网速,下载

1,首先 配置yum源,配置yum源为的是搭建编译环境,若已有编译环境,可略。
需要四个软件包:
iptables-1.4.6.tar.bz2  l7-protocols-2009-05-28.tar.gz  linux-2.6.28.10.tar.gz  netfilter-layer7-v2.22.tar.gz
首先装编译环境


yum grouplist
yum install  "Development Libraries" "Development Tools"


解压其中两个文件并制定解压目录, 做软连接便于管理,如编译了多个内核,并打补丁


tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src
tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src
ln –s  /usr/src/linux-2.6.28.10/   /usr/src/linux
cd /usr/src/linux/
patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch

2,选择需要的内核模块
Before you configure kernel make sure you have development tools (gcc compilers and related tools) are installed on your system.

cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config
make  menuconfig

在弹出的文本窗口里,选择需要编译的模块。服务器不需要的,可以去掉,如声卡,万M网卡等,切记不要忘记保存。这里需要以下模块
Networking support → Networking Options →Network packet filtering framework →Code Netfilter Configuration
  Netfilter connection tracking support
  "layer7" match support
  "string" match support
  "time"  match support
  "iprange"  match support
  "connlimit"  match support
  "state"  match support
  "conntrack"  connection  match support
  "mac"  address  match support
   "multiport" Multiple port match support
FTP protocol support (NEW)


Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
IPv4 connection tracking support (required for NAT)
   Full NAT
              MASQUERADE target support                                                                                 
              NETMAP target support                                                                            
              REDIRECT target support

大多时候都是远程连接的,在编译过程中,断掉了就前功尽弃。screen 实现在断开SSH的情况下,在服务器上继续执行程序。参考 http://www.ibm.com/developerworks/cn/linux/l-cn-screen/

yum install screen
screen
screen  –r  #查看screen
screen  –r  3353   #调出


Start compiling and installing


make
make modules_install
make install


Edit the /boot/grub/grub.conf, set the default booting kernel to the new kernel 。Restart
不建议直接,修改启动新内核,先手动启用新内核,确认没问题啦。再改grub.conf,修改默认启动
如下,尽管新内核已出现,默认启动的还是老内核
# grub.conf generated by anaconda
# 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/sda1
#          initrd /boot/initrd-version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.28.10)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.28.10 ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.28.10.img
title Red Hat Enterprise Linux AS (2.6.9-55.EL)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-55.EL ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.9-55.EL.img
~                                                                                                                                             
~                                                                                 
3,哦重启并不成功
  1,发新版本不能启动,因为编译时没有选择selinux模块,老内核是有的。
    错误提示:Enforcing mode requested but no policy loaded. Halting now.
              kernel panic - not syncing: Attenpted to kill init!
    错误分析:原内核中启用了selinux,新内核未选择selinux的选项,不能成功启动。
    解决方法:修改grub.conf文件,在root=LABEL=/ 后加入 enforcing=0
  
  2,由于新内核没有成功启动,就死机啦。强制关机导致文件系统错误,表现为老内核不能启动
    Linux主机因经常非正常关机、突然断电、设备数据读写异常等原因导致文件系统的破坏,比较常见的是超级块(super-block)损坏,超级块是文件系统的核心档案,记录了该文件系统的类型、大小、空闲磁盘块等信息。
  当文件系统超级块损坏时,Linux系统将无法识别该文件系统,也就无法挂载使用
  当通过 /etc/fstab 配置文件自动加载的文件系统出现错误时,Linux系统会开机自检,并提示用户进行文件系统的修复操作
  当/dev/sdb1 分区的超级块出现错误时,启动后系统提示" Give root password for maintenance "
   输入root用户密码,进入临时shell环境
  # fsck -yt ext3 /dev/sdb1
  # exit
  -t 指定文件系统
  -y 对发现的问题自动回答yes
  3,手动启用新内核,报错 Kernel panic-not syncing fatal exception in interrupt,google了许多文档,终于没有解决。http://blog.csdn.net/willand1981/article/details/5663356作者提供了一些解决问题的思路

Kernel panic-not syncing fatal exception in interrupt     
问题仍在,重新编译安装
以下是去掉编译失败的内核,让后参考上面。

make mrproper
make clean


3,重新编译之后,启动新内核成功
修改默认启动为新内核
vi /etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.28.10)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.28.10 ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.28.10.img
title Red Hat Enterprise Linux AS (2.6.9-55.EL)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.9-55.EL ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.9-55.EL.img
~                                            
4,启动后服务可用
已手动指定了地址
可以访问google
elinks
网卡相关的四个文件
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-ethX
/etc/hosts
/etc/resolv.conf

查看当前内核版本,和当前ip

uname –r
ifconfig

双网卡,只有eth0获得了地址,启动是没有配置第二块网卡驱动所致。lspci查看网卡型号,下载对应的网卡驱动,编译安装即可。
eth1可以获得ip啦,却不是我指定的ip,又找不到其他的网卡,很奇怪。

安装新版本的iptables。iptables不是服务,而是工具。redhat把她做成了服务。先备份,卸载之后iptables文件也会被删除,删除了就要手动去写

cp /etc/rc.d/init.d/iptables  ~/iptables
cp /etc/sysconfig/iptables-config ~/

5,安装iptables,打补丁
卸掉老的iptables。切记不要用yum去卸载,yum有依赖关系,会将依赖的包全部卸掉,可能导致系统崩溃

rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps
tar jxvf iptables-1.4.6.tar.bz2 -C  /usr/src
cd /usr/src/iptables-1.4.6
cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*   ./extensions/
./configure  --prefix=/usr  --with-ksource=/usr/src/linux
make
make install


最后一个补丁 linux下文件都有相关安装说明,如INSTALL, README等。参照安装说明,即可安装

tar zxvf l7-protocols-2009-05-28.tar.gz
cd l7-protocols-2009-05-28
make install

移回iptables文件,并修改iptables文件,将路径改为which找到的正确的iptables文件路径。将/sbin/$iptables 替换为/usr/sbin/$iptables

mv ~/iptables  /etc/rc.d/init.d/
mv ~/ iptables-config /etc/sysconfig/
which iptables
vi /etc/rc.d/init.d/iptables

启动iptables,启动成功,即可添加iptables规则
#service iptables start


iptables限制连接数
这里介绍三种限制方式
1、限制局域网内每个用户的连接数为50
iptables -I FORWARD -p tcp -m connlimit –connlimit-above 50 -j REJECT
2、限制指定局域网用户XXX.XXX.XXX.XXX的连接数为50 (这里的XXX.XXX.XXX.XXX改成大家要限制的用户的IP)
iptables -I FORWARD -p tcp -s XXX.XXX.XXX.XXX -m connlimit –connlimit-above 50 -j REJECT
这里举个例子,比如要限制192.168.1.2这个用户的连接数为50
iptables -I FORWARD -p tcp -s 192.168.1.2 -m connlimit –connlimit-above 50 -j REJECT
3、限制除用户XXX.XXX.XXX.XXX以外的IP连接数为50 (也就是除了XXX.XXX.XXX.XXX用户不限制其它的都限,这个好吧,可以给自己开特权^_^)
iptables -I FORWARD -p tcp -s !XXX.XXX.XXX.XXX -m connlimit –connlimit-above 50 -j REJECT
这里也举个例子,比如要除了不限制192.168.1.2外,限制其它所有用户的连接数为50
iptables -I FORWARD -p tcp -s !192.168.1.2 -m connlimit –connlimit-above 50 -j REJECT

iptables规则供参考

-A FORWARD -s 192.168.1.128/26 -i eth1 -o eth0 -j ACCEPT
-A FORWARD -s 192.168.1.128/26 -i eth1 -o eth0 -j ACCEPT

#指定开放时间段
-A FORWARD -s 192.168.1.179/26 -i eth1 -o eth0 -m layer7 --l7proto qq -m time --timestart 11:00:00 --timestop 13:00:00  -j RE
JECT --reject-with icmp-port-unreachable
-A FORWARD -s 192.168.1.178/26 -i eth1 -o eth0 -m layer7 --l7proto qq -m time --timestart 11:00:00 --timestop 13:00:00  -j RE
JECT --reject-with icmp-port-unreachable
#-A FORWARD -s 192.168.1.129/26 -i eth1 -o eth0 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 61.135.209.217/32 -i eth1 -o eth0 -j DROP
#-A FORWARD -s 192.168.1.128/26 -d 61.135.209.218/32 -i eth1 -o eth0 -j DROP
#-A FORWARD -s 192.168.1.128/26 -d 123.58.173.89/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 123.58.173.106/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 204.152.191.37/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 199.6.1.164/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 149.20.20.133/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 130.239.17.4/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -s 192.168.1.128/26 -d 123.129.214.98/32 -i eth1 -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
#-A FORWARD -i eth0 -o eth1 -p tcp -m tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
#-A FORWARD -i eth1 -o eth0 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT --reject-with icmp-port-unreachable

#限制7层应用程序
#-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto qq -j REJECT --reject-with -icmp-port-unreachable
#-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto msnmessenger -j REJECT --reject-with -icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto edonkey -j REJECT --reject-with -icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto bittorrent -j REJECT --reject-with -icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto xunlei -j REJECT --reject-with -icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto kugoo -j REJECT --reject-with -icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m layer7 --l7proto pplive -j REJECT --reject-with icmp-port-unreachable

#通过字符串限制
-A FORWARD -i eth1 -o eth0 -m string --string(以下关键字都要加上此选项,才生效) "qq.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "verycd.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "funsion.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "pptv.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "ppstream.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "uusee.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "youku.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "xunlei.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "tudou.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "56.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "ku6.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i eth1 -o eth0 -m string "6.cn.com" --algo bm --to 65535 -j REJECT --reject-with icmp-port-unreachable

#限速
#-A FORWARD -i eth0 -d 192.168.0.2 -m limit --limit 10/s --limit-burst 10 -j ACCEPT


谢谢
阅读(2062) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~