|
|
ВНИМАНИЕ: Използвайте форумите на сайта за дa зададете вашите въпроси.
Въпрос |
От: usr |
Дата: 03/14/2007 |
Преди време бях намерил скрипт за cbq, който му задаваш
колко Kbit да има на дадено ip от цял клас мрежа C. И
скрипта прави за всички ip-та от 1-255 по примерно
100Kbit/s. Но за съжаление не си спомням как се казва
скрипта. Идеята е да не си играя да пиша 255 едни и същи
работи на мрежа ( ако имаш 10 мрежи си идва доста тегаво )
:) Някакви идеи
Благодаря предварително
|
Отговор #1 |
От: MadMaxIII |
Дата: 03/14/2007 |
#!/bin/bash
E=/sbin/tc
case $1 in start | stop)
a1=`ifconfig | grep eth | awk '{ print $1 }'`
n1=`echo $a1 | wc -w`
for i in `seq $n1`; do
d=`echo $a1 | awk -v s=$i '{ print $s }'`
#$E qdisc del dev $d root
done
$E qdisc del dev eth0 root
$E qdisc del dev eth1 root
;;
*) echo "Usage: myhtb [start|stop]"
esac
case $1 in start)
MY_IP=/path/to/rules/rules.txt
#rules.txt --> Файл с информация за потребителите
IN_DEV=eth1
MY_NET='192.168.0.'
#Мрежова карта и IP адрес на вътрешната мрежа
#ВНИМАНИЕ - адреса е от първите ТРИ цифри + ЧЕТИРИ точки
#===========================READ MY RULES AND
USERS============================
ip_count=0;N=`wc $MY_IP | awk '{ print $1 }'`
for i in `seq $N`; do rules=`head -n $i $MY_IP | tail -n 1`
mat=`expr match "$rules" '#'`; if [ "$mat" -eq 0 ];then
ip_count=`expr $ip_count + 1`
ip=`echo $rules | awk '{ print $1 }'`
#--------------------------------------------
my_ips[$ip_count]=$ip
my_set[$ip_count]=$rules
my_usr[$ip_count]=$MY_NET$ip
#--------------------------------------------
fi; done
DEV=eth0
NET=x.x.x.x/24
# Мрежова карта и IP адрес на външната мрежа
RATE1=10000
CEIL1=10000
RATE2=500
CEIL2=500
ID1=1:3
ID2=1:4
$E qdisc add dev $DEV root handle 1 htb default 99
$E class add dev $DEV parent 1: classid 1:2 htb rate
100Mbit
$E class add dev $DEV parent 1:2 classid 1:10 htb rate
100Mbit
$E filter add dev $DEV parent 1:0 protocol ip prio 100 u32
match ip src $NET match ip dst $NET classid 1:10
$E class add dev $DEV parent 1: classid $ID1 htb rate
$RATE1"kbit" ceil $CEIL1"kbit"
for i in `seq $ip_count`; do
j=${my_ips[$i]}
r=`echo ${my_set[$i]} | awk '{print($7)}'`
c=`echo ${my_set[$i]} | awk '{print($8)}'`
$E class add dev $DEV parent $ID1 classid 1:$j htb rate
$r"kbit" ceil $c"kbit" prio 5
$E filter add dev $DEV parent 1:0 protocol ip prio 200
handle 10$j fw classid 1:$j
done
$E class add dev $DEV parent 1: classid $ID2 htb rate
$RATE2"kbit" ceil $CEIL2"kbit"
for i in `seq $ip_count`; do
j=${my_ips[$i]}
r=`echo ${my_set[$i]} | awk '{print($9)}'`
c=`echo ${my_set[$i]} | awk '{print($10)}'`
$E class add dev $DEV parent $ID2 classid 1:1$j htb rate
$r"kbit" ceil $c"kbit" prio 5
$E filter add dev $DEV parent 1:0 protocol ip prio 200
handle 30$j fw classid 1:1$j
done
$E class add dev $DEV parent 1:20 classid 1:99 htb rate
64kbit prio 7
DEV=eth1
NET=192.168.0.0/24
DEF=99
RATE1=12000
CEIL1=12000
RATE2=600
CEIL2=600
ID1=1:3
ID2=1:4
$E qdisc add dev $DEV root handle 1 htb default $DEF
$E class add dev $DEV parent 1: classid 1:2 htb rate
100Mbit
$E class add dev $DEV parent 1:2 classid 1:10 htb rate
100Mbit
$E filter add dev $DEV parent 1:0 protocol ip prio 100 u32
match ip src $NET match ip dst $NET classid 1:10
$E class add dev $DEV parent 1: classid $ID1 htb rate
$RATE1"kbit" ceil $CEIL1"kbit"
for i in `seq $ip_count`; do
j=${my_ips[$i]}
r=`echo ${my_set[$i]} | awk '{print($3)}'`
c=`echo ${my_set[$i]} | awk '{print($4)}'`
$E class add dev $DEV parent $ID1 classid 1:$j htb rate
$r"kbit" ceil $c"kbit" prio 5
$E filter add dev $DEV parent 1:0 protocol ip prio 200
handle 20$j fw classid 1:$j
done
$E class add dev $DEV parent 1: classid $ID2 htb rate
$RATE1"kbit" ceil $CEIL1"kbit"
for i in `seq $ip_count`; do
j=${my_ips[$i]}
r=`echo ${my_set[$i]} | awk '{print($5)}'`
c=`echo ${my_set[$i]} | awk '{print($6)}'`
$E class add dev $DEV parent $ID2 classid 1:1$j htb rate
$r"kbit" ceil $c"kbit" prio 5
$E filter add dev $DEV parent 1:0 protocol ip prio 200
handle 40$j fw classid 1:1$j
done
$E class add dev $DEV parent 1:20 classid 1:99 htb rate
8kbit prio 7
;;
esac
#=============END=========================
Струкура на файла rules.txt:
#IP UserName BG in INT in BG out INT out
2 User1 512 2048 128 256 512 1024 64 128
IP - последната цифра от IP адреса на потребителя
Следват RATE & CEIL за входящ и изходящ трафик
#==========Този файл трябва да се стартира ПРЪВ !!!
# с него се разделя БГ и ВЪНШЕН нет
IPTABLES=/usr/local/sbin/iptables
EXTIF="eth0"
INTIF="eth1"
echo
"----------------------------------------------------------------------"
echo " External Interface: $EXTIF"
echo " Internal Interface: $INTIF"
echo " Clearing any existing rules and setting default
policy.."
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
echo
"----------------------------------------------------------------------"
echo
echo " Read IP for routing"
USERS=/path/to/file/users.txt
MY_IP=/path/to/file/ip.txt
BG_IP=/path/to/file/bg_nets.txt
# Тук са описани БГ адресите
MY_NET='192.168.201.'
#===========================READ MY RULES AND
USERS============================
ip_count=0;N=`wc $MY_IP | awk '{ print $1 }'`
for i in `seq $N`; do rules=`head -n $i $MY_IP | tail -n 1`
mat=`expr match "$rules" '#'`; if [ "$mat" -eq 0 ];then
ip_count=`expr $ip_count + 1`
ip=`echo $rules | awk '{ print $1 }'`
#--------------------------------------------
my_ips[$ip_count]=$ip
my_set[$ip_count]=$rules
my_usr[$ip_count]=$MY_NET$ip
#--------------------------------------------
fi; done
#===========================READ MY RULES AND
USERS============================
echo
"----------------------------------------------------------------------"
echo
echo "Read IP for BG peering..."
$IPTABLES -t mangle -N bg-out
$IPTABLES -t mangle -N bg-in
$IPTABLES -t mangle -N int-out
$IPTABLES -t mangle -N int-in
line_count=`wc $BG_IP | awk '{ print $1 }'`
#line_count=10
for i in `seq $line_count`
do
a1=`head -n $i $BG_IP | tail -n 1`
mat=`expr match "$a1" '#'`
if [ "$mat" -eq 0 ]
then
$IPTABLES -t mangle -A FORWARD -s $a1 -j bg-in
$IPTABLES -t mangle -A POSTROUTING -d $a1 -j bg-out
echo $a1
fi
done
$IPTABLES -t mangle -A FORWARD -d $MY_NET"0/26" -j int-in
$IPTABLES -t mangle -A POSTROUTING -s $MY_NET"0/26" -j
int-out
#$IPTABLES -t mangle -A FORWARD -j LOG --log-prefix "
Unknow-OUT "
#$IPTABLES -t mangle -A POSTROUTING -j LOG --log-prefix "
Unknow-IN "
echo
"----------------------------------------------------------------------"
echo
echo "List of IP for service..."
echo '' > $USERS
for i in `seq $ip_count`; do
a1=${my_ips[$i]}
echo $a1 >> $USERS
ip2=${my_usr[$i]}'/32'
c1='BG_out_'$a1
c2='BG_in_'$a1
c3='INT_out_'$a1
c4='INT_in_'$a1
$IPTABLES -t mangle -N $c1
$IPTABLES -t mangle -N $c2
$IPTABLES -t mangle -N $c3
$IPTABLES -t mangle -N $c4
$IPTABLES -t mangle -A bg-in -d $ip2 -j $c2
$IPTABLES -t mangle -A bg-out -s $ip2 -j $c1
$IPTABLES -t mangle -A int-in -d $ip2 -j $c4
$IPTABLES -t mangle -A int-out -s $ip2 -j $c3
$IPTABLES -t mangle -A $c1 -j MARK --set-mark 1`printf
"%03d" $a1`
$IPTABLES -t mangle -A $c2 -j MARK --set-mark 2`printf
"%03d" $a1`
$IPTABLES -t mangle -A $c3 -j MARK --set-mark 3`printf
"%03d" $a1`
$IPTABLES -t mangle -A $c4 -j MARK --set-mark 4`printf
"%03d" $a1`
$IPTABLES -t mangle -A $c1 -j ACCEPT
$IPTABLES -t mangle -A $c2 -j ACCEPT
$IPTABLES -t mangle -A $c3 -j ACCEPT
$IPTABLES -t mangle -A $c4 -j ACCEPT
echo $ip2
done
|
<< Помощ (3
) | как да си запиша клипче на десктопа (2
) >>
|
|
|
|
|