關於limit hashlimit資料整理

這幾天正在搗鼓防火牆,用到了hashlimit模塊。Google了一圈發現相關的文檔無論英文還

是中文都很少,

所以我就把自己的折騰的心得記錄下來吧。

hashlimit是iptables的一個匹配模塊,用它結合iptables的其它命令可以實現限速的功能

。(注意,單獨hashlimit模塊

是無法限速的)。

不過首先必須明確,hashlimit本身只是一個“匹配”模塊。我們知道,iptables的基本原

理是“匹配--處理”,hashlimit在

這個工作過程中只能起到匹配的作用,它本身是無法對網絡數據包進行任何處理的。我看到

網上有些hashlimit的例子裏面說只

用一條包含hashlimit匹配規則的iptables語句就可以實現限速,那是錯誤的。

實際上,利用hashlimit來限速需要包括兩個步驟。

1.對符合hashlimit匹配規則包放行

2.丟棄/拒絕未放行的包

下面是一個簡單的例子:

iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh

--hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode srcip

--hashlimit-htable-expire 90000 -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP

然後,我們來着重講講hashlimit模塊具體是如何工作的。hashlimit的匹配是基於令牌桶

(Token bucket)模型的。令牌桶是一種網絡通訊中常見的緩衝區工作原理,它有兩個重要

的參數,令牌桶容量n和令牌產生速率s。我們可以把令牌當成是門票,而令牌桶則是負責制

作和發放門票的管理員,它手裏最多有n張令牌。一開始,管理員開始手裏有n張令牌。每當

一個數據包到達後,管理員就看看手裏是否還有可用的令牌。如果有,就把令牌發給這個數

據包,hashlimit就告訴iptables,這個數據包被匹配了。而當管理員把手上所有的令牌都

發完了,再來的數據包就拿不到令牌了。這時,hashlimit模塊就告訴iptables,這個數據

包不能被匹配。

除了發放令牌之外,只要令牌桶中的令牌數量少於n,它就會以速率s來產生新的令牌,直到

令牌數量到達n爲止。

通過令牌桶機制,即可以有效的控制單位時間內通過(匹配)的數據包數量,又可以容許短

時間內突發的大量數據包的通過(只要數據包數量不超過令牌桶n)。

hashlimit模塊提供了兩個參數--hashlimit和--hashlimit-burst,分別對應於令牌產生速

率和令牌桶容量。

除了令牌桶模型外,hashlimit匹配的另外一個重要概念是匹配項。在hashlimit中,每個匹

配項擁有一個單獨的令牌桶,執行獨立的匹配計算。通過hashlimit的--hashlimit-mode參

數,你可以指定四種匹配項及其組合,即:srcip(每個源地址IP爲一個匹配項),dstip(

每個目的地址IP爲一個匹配項),srcport(每個源端口爲一個匹配項),dstport(每個目

的端口爲一個匹配項)

除了前面介紹的三個參數外,hashlimit還有一個必須要用的參數,即--hashlimit-name。

hashlimit會在/proc/net/ipt_hashlimit目錄中,爲每個調用了hashlimit模塊的iptables

命令建立一個文件,其中保存着各匹配項的信息。--hashlimit-name參數即用來指定該文件

的文件名。

好了,以上我們已經介紹了hashlimit的工作原理和相應的參數,下面我們來看幾個例子。

首先是前面的那個例子:

iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit-name ssh

--hashlimit 5/sec --hashlimit-burst 10 --hashlimit-mode -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP

在瞭解了hashlimit各參數的含義之後,我們現在就可以知道這兩條iptables命令的作用。

第一條的作用是,爲所有訪問本機22端口的不同IP建立一個匹配項,匹配項對應的令牌桶容

量爲10,令牌產生速率爲5個每秒。放行通過匹配的數據包。

第二條的作用是,丟棄所有其它訪問本機22端口的數據包。

通過這兩條命令,我們就實現了限制其它機器對本機22端口(ssh服務)頻繁訪問的功能,

再來我們看一個複雜點的限速。假設我們現在在一臺NAT網關上,想限制內部網某個網段

192.168.1.2/24對外的訪問頻率。(這個的主要作用是限制內部中毒主機對外的flood***

那我們可以這麼做:

iptables -N DEFLOOD

iptables -A FORWARD -s 192.168.1.2/24 -m state --state NEW -j DEFLOOD

iptables -A DEFLOOD -m hashlimit --hashlimit-name deflood --hashlimit 10/sec

--hashlimit-burst 10 --hashlimit-mode srcip -j ACCEPT

iptables -P DEFLOOD -j DROP

第一條命令建立了一個自定義的處理鏈

第二條命令,所有來自192.168.1.2/24網段,並且打算新建網絡連接的數據包,都進入

DEFLOOD鏈處理

第三條命令,在DEFLOOD鏈中,爲每個IP建立一個匹配項,對應令牌桶容量爲10,產生速率爲

10個每秒。放行通過匹配的數據包。

第四條命令,在DEFLOOD鏈中丟棄所有其它的數據包

以上我們介紹了hashlimit模塊的原理和使用。希望能對大家有所幫助:)

用iptables的limit或hashlimit模塊,目標是ACCEPT。當你設置300/s時,它大約每3ms發出一個令牌,獲得令牌的包可以發出去,沒有獲得令牌的包只能等待下一個令牌到來,這樣不會造成一些包丟失,更不會造成所謂“斷線”的。

limit匹配:限制匹配數據包的頻率或速率,看清楚了,它是用來限制匹配的數據包的頻率和速率的. 這裏“limit”這個詞經常給別人“限制”的誤解,其實準確說,應該是“按一定速率去匹配”

至於“限制”還是“放行”是後面 -j 動作來實現的

limit 僅僅是個 match 模塊,他的功能是匹配,匹配方式是按一定速率

以下2條是對icmp的burst限制

iptables -A INPUT -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT

iptables -A INPUT -p icmp -j DROP

第一條ipables的意思是限制ping包每一秒鐘一個,10個後重新開始.

同時可以限制IP碎片,每秒鐘只允許100個碎片,用來防止DoS***.

iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT

iptables limit 參數備忘

? 限制特定封包傳入速度

? 限制特定端口口連入頻率

? iptables Log 記錄參數備忘

? 自定 Chain 使用備忘

? 防治 SYN-Flood 碎片***

限制 ping (echo-request) 傳入的速度

限制前, 可正常每 0.2 秒 ping 一次

ping your.linux.ip -i 0.2

限制每秒只接受一個 icmp echo-request 封包

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

--limit 1/s 表示每秒一次; 1/m 則爲每分鐘一次

--limit-burst 表示允許觸發 limit 限制的最大次數 (預設 5)

再以每 0.2 秒 ping 一次, 得到的響應是每秒一次

ping your.linux.ip -i 0.2

限制 ssh 連入頻率

建立自訂 Chain, 限制 tcp 聯機每分鐘一次, 超過者觸發 Log 記錄 (記錄在 /var/log/messages)

iptables -N ratelimit

iptables -A ratelimit -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A ratelimit -p tcp --syn -m limit --limit 1/m --limit-burst 1 -j ACCEPT

iptables -A ratelimit -p tcp -j LOG --log-level "NOTICE" --log-prefix "[RATELIMIT]"

iptables -A ratelimit -p tcp -j DROP

引用自訂 Chain, 限制 ssh (tcp port 22) 連入頻率

iptables -A INPUT -p tcp --dport 22 -s 192.168.0.0/16 -j ACCEPT (特定 IP 來源不受限制)

iptables -A INPUT -p tcp --dport 22 -j ratelimit

參考數據: Mike's Blog - How to limit attack attempts in Linux

sshd_config 設定備忘:

? LoginGraceTime 30 密碼輸入時限爲 30 秒

? MaxAuthTries 2 最多隻能輸入 3 次密碼

同理可證

iptables -N pinglimit

iptables -A pinglimit -m limit --limit 1/s --limit-burst 1 -j ACCEPT

iptables -A pinglimit -j DROP

iptables -A INPUT -p icmp --icmp-type echo-request -j pinglimit

亦可達到每秒只接受一個 echo-request 封包

補充: 清除自訂 Chain

iptables -L -n --line-number

iptables -D INPUT n

iptables -F ratelimit

iptables -X ratelimit

防治 SYN-Flood 碎片***

iptables -N syn-flood

iptables -A syn-flood -m limit --limit 50/s --limit-burst 10 -j RETURN

iptables -A syn-flood -j DROP

iptables -I INPUT -j syn-flood

模擬***

wget http://www.xfocus.net/tools/200102/naptha-1.1.tgz

wget ftp://rpmfind.net/linux/freshrpms/redhat/7.0/libnet/libnet-1.0.1b-1.src.rpm

tar -zxf naptha-1.1.tgz

rpmbuild --recompile libnet-1.0.1b-1.src.rpm

cp -r /var/tmp/libnet-buildroot/usr/* /usr/local/

cd naptha-1.1

make

./synsend your.linux.host.ip 80 local.host.eth0.ip 0.1

若成功抵擋, 不久後會出現 Can't send packet!: Operation not permitted 的訊息

iprange a.b.c.d-a.b.c.d 表示這一段地址還是分別表示每一個包含的地址?

例 iptables -A -m iprange --src-range 172.16.1.10-172.16.16.1 -m limit --limit 300/second -j ACCEPT

表示172.16.1.10-172.16.16.1這段地址每秒一共匹配300個數據包

還是表示172.16.1.10-172.16.16.1地址中的每一個ip 分別匹配300個數據包?-------iprange a.b.c.d-a.b.c.d 表示這一段地址還是分別表示每一個包含的地址?

例 iptables -A -m iprange --src-range 172.16.1.10-172.16.16.1 -m limit --limit 300/second -j ACCEPT

表示172.16.1.10-172.16.16.1這段地址每秒一共匹配300個數據包

還是表示172.16.1.10-172.16.16.1地址中的每一個ip 分別匹配300個數據包?

limit

This module must be explicitly specified with `-m limit' or `--match limit'. It is used to restrict the rate of matches, such as for suppressing log messages. It will only match a given number of times per second (by default 3 matches per hour, with a burst of 5). It takes two optional arguments:

--limit

followed by a number; specifies the maximum average number of matches to allow per second. The number can specify units explicitly, using `/second', `/minute', `/hour' or `/day', or parts of them (so `5/second' is the same as `5/s').

--limit-burst

followed by a number, indicating the maximum burst before the above limit kicks in.

This match can often be used with the LOG target to do rate-limited logging. To understand how it works, let's look at the following rule, which logs packets with the default limit parameters:

# iptables -A FORWARD -m limit -j LOG

The first time this rule is reached, the packet will be logged; in fact, since the default burst is 5, the first five packets will be logged. After this, it will be twenty minutes before a packet will be logged from this rule, regardless of how many packets reach it. Also, every twenty minutes which passes without matching a packet, one of the burst will be regained; if no packets hit the rule for 100 minutes, the burst will be fully recharged; back where we started.

iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m limit --limit 6/minute --limit-burst 6 -j LOG --log-prefix="filter INPUT:"

列:

#!/bin/bash

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -N syn-flood

iptables -A INPUT -i eth0 -p tcp -m state --state NEW -j syn-flood

iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN

iptables -A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DROP

iptables -A INPUT -i eth0 -p tcp -d 0/0 --dport 80 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 3 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT

iptables -A INPUT -i eth0 -j DROP

流量控制

tc qdisc del dev eth0 root 2>/dev/null

##定義上傳總帶寬(用tc語法,這裏用的是htb過濾器)

##define root and default rule

tc qdisc add dev eth0 root handle 10: htb default 70

##define uplink max rate

tc class add dev eth0 parent 10: classid 10:1 htb rate 64kbps ceil 64kbps

##對不同的業務進行分類,定義不同的數據流量

##define second leaf

#tc class add dev eth0 parent 10:1 classid 10:10 htb rate 2kbps ceil 4kbps prio 2

#tc class add dev eth0 parent 10:1 classid 10:20 htb rate 2kbps ceil 4kbps prio 2

#tc class add dev eth0 parent 10:1 classid 10:30 htb rate 32kbps ceil 40kbps prio 3

tc class add dev eth0 parent 10:1 classid 10:40 htb rate 3kbps ceil 13kbps prio 0

tc class add dev eth0 parent 10:1 classid 10:50 htb rate 1kbps ceil 11kbps prio 1

tc class add dev eth0 parent 10:1 classid 10:60 htb rate 1kbps ceil 11kbps prio 1

tc class add dev eth0 parent 10:1 classid 10:70 htb rate 2kbps ceil 5kbps prio 1

##定義不同數據傳輸業務的優先級別和優化數據傳輸方法

##define rule for second leaf

#tc qdisc add dev eth0 parent 10:10 handle 101: pfifo

#tc qdisc add dev eth0 parent 10:20 handle 102: pfifo

#tc qdisc add dev eth0 parent 10:30 handle 103: pfifo

#tc qdisc add dev eth0 parent 10:40 handle 104: pfifo

#tc qdisc add dev eth0 parent 10:50 handle 105: pfifo

#tc qdisc add dev eth0 parent 10:60 handle 106: pfifo

#tc qdisc add dev eth0 parent 10:70 handle 107: pfifo

##tc qdisc add dev eth0 parent 10:10 handle 101: sfq perturb 10

##tc qdisc add dev eth0 parent 10:20 handle 102: sfq perturb 10

##tc qdisc add dev eth0 parent 10:30 handle 103: sfq perturb 10

tc qdisc add dev eth0 parent 10:40 handle 104: sfq perturb 5

tc qdisc add dev eth0 parent 10:50 handle 105: sfq perturb 10

tc qdisc add dev eth0 parent 10:60 handle 106: sfq perturb 10

tc qdisc add dev eth0 parent 10:70 handle 107: sfq perturb 10

##爲netfilter鏈中的mangle鏈打標記做好準備(做句柄標示)

##define fw for ipfilter

#tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10

#tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw classid 10:20

#tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30

tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw classid 10:40

tc filter add dev eth0 parent 10: protocol ip prio 100 handle 50 fw classid 10:50

tc filter add dev eth0 parent 10: protocol ip prio 100 handle 60 fw classid 10:60

tc filter add dev eth0 parent 10: protocol ip prio 100 handle 70 fw classid 10:70

###################################################################################

##下載端口配置(方法同上傳配置,只是在速率定義上有調整)

echo "Enabling downlink limit"

#downlink limit

##clear dev eth1 rule

tc qdisc del dev eth1 root 2>/dev/null

##define root and default rule

tc qdisc add dev eth1 root handle 10: htb default 70

##define downlink max rate

tc class add dev eth1 parent 10: classid 10:1 htb rate 128kbps ceil 128kbps

##define second leaf

#tc class add dev eth1 parent 10:1 classid 10:10 htb rate 2kbps ceil 32kbps prio 2

#tc class add dev eth1 parent 10:1 classid 10:20 htb rate 2kbps ceil 32kbps prio 2

#tc class add dev eth1 parent 10:1 classid 10:30 htb rate 32kbps ceil 212kbps prio 3

tc class add dev eth1 parent 10:1 classid 10:40 htb rate 5kbps ceil 20kbps prio 0

tc class add dev eth1 parent 10:1 classid 10:50 htb rate 2kbps ceil 17kbps prio 1

tc class add dev eth1 parent 10:1 classid 10:60 htb rate 2kbps ceil 17kbps prio 1

tc class add dev eth1 parent 10:1 classid 10:70 htb rate 3kbps ceil 5kbps prio 1

##define rule for second leaf

#tc qdisc add dev eth1 parent 10:10 handle 101: pfifo

#tc qdisc add dev eth1 parent 10:20 handle 102: pfifo

#tc qdisc add dev eth1 parent 10:30 handle 103: pfifo

#tc qdisc add dev eth1 parent 10:40 handle 104: pfifo

#tc qdisc add dev eth1 parent 10:50 handle 105: pfifo

#tc qdisc add dev eth1 parent 10:60 handle 106: pfifo

#tc qdisc add dev eth1 parent 10:70 handle 107: pfifo

##tc qdisc add dev eth1 parent 10:10 handle 101: sfq perturb 10

##tc qdisc add dev eth1 parent 10:20 handle 102: sfq perturb 10

##tc qdisc add dev eth1 parent 10:30 handle 103: sfq perturb 10

tc qdisc add dev eth1 parent 10:40 handle 104: sfq perturb 5

tc qdisc add dev eth1 parent 10:50 handle 105: sfq perturb 10

tc qdisc add dev eth1 parent 10:60 handle 106: sfq perturb 10

tc qdisc add dev eth1 parent 10:70 handle 107: sfq perturb 10

##define fw for ipfilter

#tc filter add dev eth1 parent 10: protocol ip prio 100 handle 10 fw classid 10:10

#tc filter add dev eth1 parent 10: protocol ip prio 100 handle 20 fw classid 10:20

#tc filter add dev eth1 parent 10: protocol ip prio 100 handle 30 fw classid 10:30

tc filter add dev eth1 parent 10: protocol ip prio 100 handle 40 fw classid 10:40

tc filter add dev eth1 parent 10: protocol ip prio 100 handle 50 fw classid 10:50

tc filter add dev eth1 parent 10: protocol ip prio 100 handle 60 fw classid 10:60

tc filter add dev eth1 parent 10: protocol ip prio 100 handle 70 fw classid 10:70

echo "Enabling mangle "

# uploads

#iptables -t mangle -A PREROUTING -s 192.168.0.6 -m layer7 --l7proto dns -j MARK --set-mark 10

#iptables -t mangle -A PREROUTING -s 192.168.0.6 -m layer7 --l7proto smtp -j MARK --set-mark 20

#iptables -t mangle -A PREROUTING -s 192.168.0.6 -m layer7 --l7proto http -j MARK --set-mark 30

##爲ip地址打標記以便進行流量控制--上傳

#iptables -t mangle -A PREROUTING -s 192.168.0.52 -j MARK --set-mark 40

#iptables -t mangle -A PREROUTING -s 192.168.0.0/24 -j MARK --set-mark 70

#iptables -t mangle -A PREROUTING -s 192.168.0.3 -j MARK --set-mark 60

# downloads

#iptables -t mangle -A POSTROUTING -d 192.168.0.6 -m layer7 --l7proto dns -j MARK --set-mark 10

#iptables -t mangle -A POSTROUTING -d 192.168.0.6 -m layer7 --l7proto smtp -j MARK --set-mark 20

#iptables -t mangle -A POSTROUTING -d 192.168.0.6 -m layer7 --l7proto http -j MARK --set-mark 30

##爲ip地址打標記以便進行流量控制--下載

#iptables -t mangle -A POSTROUTING -d 192.168.0.52 -j MARK --set-mark 40

#iptables -t mangle -A POSTROUTING -d 192.168.0.0/24 -j MARK --set-mark 70

#iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK --set-mark 60

DDOS Protection Script

#!/bin/sh

# Firewall script made by Magarus for verlihubforums.com and adminzone.ro

# Copyright @ 2007 - Saftoiu Mihai, All rights reserved.

# The distribution of this script without Saftoiu Mihai's

# approval is a violation of copyright and will be persued to the

# full extent of the law. You may use it ONLY for non-commercial use,

# except without the author's explicit approval.

# Define constants - Leave them alone

IPTABLES=`which iptables`

MODPROBE=`which modprobe`

$MODPROBE ip_conntrack

$MODPROBE ipt_recent

NR_IP=""

IP_LOOP=""

PORT_LOOP=""

# Modify tcp/ip parameters

# Reduce timeout

echo "15" > /proc/sys/net/ipv4/tcp_fin_timeout

# Increase backlog and max conn

echo "3000" > /proc/sys/net/core/netdev_max_backlog

echo "3000" > /proc/sys/net/core/somaxconn

# Reduce timeouts and retransmissions

echo "300" > /proc/sys/net/ipv4/tcp_keepalive_time

echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl

echo "1" > /proc/sys/net/ipv4/tcp_keepalive_probes

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

echo "2" > /proc/sys/net/ipv4/tcp_synack_retries

echo "1" > /proc/sys/net/ipv4/tcp_syn_retries

# Increase SYN backlog

echo "28000" > /proc/sys/net/ipv4/tcp_max_syn_backlog

# Decrease timeouts

echo "10" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_recv

echo "40" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent

# Check for spoofing / Use 2 instead of 1 bellow if it doesn't fix it

echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

# See that conntrack doesn't get overflowed

echo "220000" > /proc/sys/net/ipv4/ip_conntrack_max

# Use scaling

echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

# Remove overhead and unnecessary tcp/icmp params.

echo "0" > /proc/sys/net/ipv4/tcp_sack

echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

echo "0" > /proc/sys/net/ipv4/tcp_timestamps

# Increase available memory

echo "16777216" > /proc/sys/net/core/rmem_max

echo "16777216" > /proc/sys/net/core/wmem_max

echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem

echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_wmem

echo "1" > /proc/sys/net/ipv4/tcp_no_metrics_save

# Increase number of ports available (this is a must for future apache fix)

echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range

# Function for protection/hub/ip

protect_hub(){

$IPTABLES -A OUTPUT -s $IP_LOOP -p tcp --sport $PORT_LOOP --tcp-flags ALL PSH,ACK -m string --algo bm --string Pk=version --to 300 -j RST_LOOP_OUT

$IPTABLES -A INPUT -d $IP_LOOP -p tcp --dport $PORT_LOOP --syn -j SYN_CHECK

$IPTABLES -A INPUT -d $IP_LOOP -p tcp --dport $PORT_LOOP --tcp-flags ALL PSH,ACK -m string --algo bm --string MyNick --to 100 -j REJECT --reject-with tcp-reset

$IPTABLES -A INPUT -d $IP_LOOP -p tcp --dport $PORT_LOOP -m state --state RELATED,ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT -d $IP_LOOP -p tcp --dport $PORT_LOOP -j DROP

$IPTABLES -A INPUT -d $IP_LOOP -p udp --dport $PORT_LOOP -j DROP

$IPTABLES -A SYN_CHECK -d $IP_LOOP -p tcp --dport $PORT_LOOP -m hashlimit --hashlimit 2/min --hashlimit-mode srcip,dstip

--hashlimit-name dcclients --hashlimit-burst 1 --hashlimit-htable-expire 30000 --hashlimit-htable-gcinterval 1000 -j ACCEPT

$IPTABLES -A SYN_CHECK -d $IP_LOOP -p tcp --dport $PORT_LOOP -j REJECT --reject-with tcp-reset

$IPTABLES -A RST_LOOP_OUT -d $IP_LOOP -p tcp --sport $PORT_LOOP --tcp-flags ALL PSH,ACK -m conntrack --ctexpire 1:1000 -j REJECT --reject-with tcp-reset

$IPTABLES -A RST_LOOP_OUT -d $IP_LOOP -p tcp --sport $PORT_LOOP --tcp-flags ALL FIN,PSH,ACK -m conntrack --ctexpire 1:1000 -j REJECT --reject-with tcp-reset

}

# Main()

firewall_run(){

clear

echo -e "n Anti DDOS firewall for verlihub software, Copyright @ 2007 Saftoiu Mihai nn"

echo -e " How many ip addresses do you have allocated for your running hubs? c" && read NR_IP

NR_IP=`expr $NR_IP + 1`

ctl="1"

while [ "$ctl" -lt "$NR_IP" ]; do

echo -e "n Input ip no. $ctl = c"

read IP[$ctl]

let "ctl += 1"

done

echo -e "n"

ctl="1"

# Define custom chains

# Check syn chain frequency drops anyway

$IPTABLES -N SYN_CHECK

# Reset output packets so hub doesn't get locked up on output

$IPTABLES -N RST_LOOP_OUT

# Drop all junk data

$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

$IPTABLES -A INPUT -p tcp -m state --state INVALID,UNTRACKED -j DROP

# Enter loop

while [ "$ctl" -lt "$NR_IP" ]; do

IP_LOOP="${IP[$ctl]}"

echo -e "n How many hub ports are there on this ip ${IP[$ctl]}? c"

read NR_PORTS && NR_PORTS=`expr $NR_PORTS + 1` && ctlx="1"

while [ "$ctlx" -lt "$NR_PORTS" ]; do

echo -e "n Input port $ctlx for ${IP[$ctl]} : c"

read PORT[$ctlx] && PORT_LOOP="${PORT[$ctlx]}"

protect_hub

let "ctlx += 1"

done

let "ctl += 1"

done

}

# Clear the rules and any i might add

firewall_clear(){

clear

echo -e "nn Firewall rules are now being cleared...n"

$IPTABLES -t mangle -F

$IPTABLES -t filter -F

$IPTABLES -t raw -F

$IPTABLES -Z

$IPTABLES -X

$IPTABLES -P INPUT ACCEPT

$IPTABLES -P OUTPUT ACCEPT

$IPTABLES -P FORWARD ACCEPT

$IPTABLES -L

echo -e "n Firewall CLEARED!"

}

# Run-time options

case "$1" in

'start') firewall_run ;;

'stop') firewall_clear ;;

*) echo -e "nUsage: $0 [OPTION]..."

echo -e "nOPTIONS:"

echo -e " start Run the firewall."

echo -e " stop Stop the firewall."

echo -e "n " ;;

esac

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章