iptables利用connlimit模塊限制同一IP鏈接數

        轉:http://blog.51cto.com/mrxiong/1589429linux

  connlimit模塊容許你限制每一個客戶端IP的併發鏈接數,即每一個IP同時鏈接到一個服務器個數。shell

  connlimit模塊主要能夠限制內網用戶的網絡使用,對服務器而言則能夠限制每一個IP發起的鏈接數。centos

 

connlimit參數:服務器

  –connlimit-above n    #限制爲多少個網絡

  –connlimit-mask n     #這組主機的掩碼,默認是connlimit-mask 32 ,即每一個IP.併發

 

系統:centos 5.4 32位tcp

  須要的軟件包:iptables-1.3.8.tar.bz2 linux-2.6.18.tar.bz2 patch-o-matic-ng-20080214.tar.bz2 (這3個我都會提供給你們的)測試

 

1.準備工做ui

yum -y install gcc* make wget ncurses-devel ncurses bzip2spa

還有個重要的地方就是

若是你的系統安裝iptables,那就先把iptables停一下,避免後面的問題

services iptables stop

而後把3個軟件包解壓到/usr/src目錄下

tar jxf iptables-1.3.8.tar.bz2 -C /usr/src/

tar jxf patch-o-matic-ng-20080214.tar.bz2 -C /usr/src/

tar jxf linux-2.6.18.tar.bz2 -C /usr/src/

初始化內核

cd /usr/src/linux-2.6.18/

uname -r

2.6.18-164.el5

vi Makefile 改EXTRAVERSION =-164.el5

點擊查看原圖

設置patch-o-matic-ng-20080214須要用到的環境變量:

export KERNEL_DIR=/usr/src/linux-2.6.18

export KERNEL_SRC=/usr/src/linux-2.6.18

export IPTABLES_SRC=/usr/src/iptables-1.3.8/

export IPTABLES_DIR=/usr/src/iptables-1.3.8/

這裏說下,若是你不設置這4個環境變量的,後面你給內核下補丁和添加模塊是很煩的一件事情,爲何這麼說呢,讓大家看個例子:

KERNEL_DIR=/usr/src/linux-2.6.18 IPTABLES_DIR=/usr/src/iptables-1.3.8 ./runme time

是否是很麻煩啊,因此最好是添加上.

 

2.給內核下補丁和添加模塊

cd /usr/src/patch-o-matic-ng-20080214/

./runme --download

./runme connlimit

能夠看到connlimit模塊已經添加到內核裏,但尚未完.

點擊查看原圖

 

3.編輯內核配置文件,選中新增長的模塊

cd ../linux-2.6.18/

make menuconfig

這步的操做有點多,我就不截圖了.

在內核配置界面選中

Networking --->

Networking options --->

Network packet filtering (replaces ipchains) --->

IP: Netfilter Configuration --->

<M> Connections/IP limit match support

 

4.編譯內核模塊

make modules_prepare

修改net/ipv4/netfilter/Makefile,只編譯connlimit模塊,首先備份net/ipv4/netfilter/Makefile文件

mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.bak

新建 net/ipv4/netfilter/Makefile文件,並添加以下內容

vi net/ipv4/netfilter/Makefile

obj-m := ipt_connlimit.o

 

KDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

 

default:

$(MAKE) -C $(KDIR) M=$(PWD) modules

 

最後編譯內核模塊

make M=net/ipv4/netfilter/

 

5.將編譯好的ipt_connlimit.ko內核模塊複製到當前內核模塊目錄下,並加載內核模塊

cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/

爲內核模塊添加可執行權限

chmod +x /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/ipt_connlimit.ko

depmod -a

modprobe ipt_connlimit

運行lsmod | grep x_tables出現以下提示,說明內核模塊加載成功

x_tables               17349  7 ipt_connlimit,ipt_REJECT,xt_state,ip_tables,ip6t_REJECT,xt_tcpudp,ip6_tables

 

6.測試ipt_connlimit模塊

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT

service iptables save

service iptables start

 

例子:

限制同一IP同時最多100個http鏈接

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT

只容許每組C類IP同時100個http鏈接

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT

只容許每一個IP同時5個80端口轉發,超過的丟棄

iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP

限制某IP最多同時100個http鏈接

iptables -A INPUT -s 222.222.222.222 -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT

限制每IP在必定的時間(好比60秒)內容許新創建最多100個http鏈接數

iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 100 -j REJECT

iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT

 

iptables -A INPUT ! -s 127.0.0.1/32 -p tcp -m tcp --dport 8080 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 16 --connlimit-mask 32 --connlimit-saddr -j LOG --log-prefix "connlimit "

iptables -A INPUT ! -s 127.0.0.1/32 -p tcp -m tcp --dport 8080 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 16 --connlimit-mask 32 --connlimit-saddr -j REJECT --reject-with icmp-port-unreachable

iptables -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 16 --connlimit-mask 32 --connlimit-saddr -j LOG --log-prefix "connlimit "

iptables -A INPUT -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 16 --connlimit-mask 32 --connlimit-saddr -j REJECT --reject-with icmp-port-unreachable

相關文章
相關標籤/搜索