LinuxForum.Fans
Тема

Помогите найти ошибки в скрипте шейпера...

Автор: DECAL 5 сообщений 1821 просмотров
#247840

Помогите найти ошибки в скрипте шейпера, когда он запускается, при старте системы, то все клиенты на eth1 не могут соединиться и arp таблица пишет на ip адресах <не выполнено>, а eth0 хорошо работает:

text
#!/bin/bash

USER_IFACE='eth1' EXT_IFACE='eth0' DATA='/usr/local/accnt/conf/unlimit.dat' UFLAG='/usr/local/accnt/conf/unlimit.flg' TCBIN='/sbin/tc' IPT='/sbin/iptables'

get_user_iface () { user_iface=`ip -o route get $1 | sed 's/.*dev \(\S*\).*/\1/'` echo $user_iface }

flush () { for i in $USER_IFACE $EXT_IFACE; do ${TCBIN} qdisc del dev $i root #>/dev/null 2>&1 done }

init () { flush $IPT -t mangle -F $IPT -t mangle -A FORWARD -s 192.168.0.0/16 -d 193.93.49.64/27 -j RETURN $IPT -t mangle -A FORWARD -s 193.93.49.64/27 -d 192.168.0.0/16 -j RETURN $IPT -t mangle -A FORWARD -s 192.168.0.0/16 -d 91.220.230.0/24 -j RETURN $IPT -t mangle -A FORWARD -s 91.220.230.0/24 -d 192.168.0.0/16 -j RETURN $IPT -t mangle -A FORWARD -s 192.168.0.0/16 -d 192.168.0.0/16 -j RETURN

for i in $USER_IFACE $EXT_IFACE; do ${TCBIN} qdisc del dev $i root >/dev/null 2>&1 ${TCBIN} qdisc add dev $i root handle 1: htb done }

build () { init n=100 cat $DATA | while read ip rate;do echo $ip $rate USER_IFACE=`get_user_iface $ip`

${TCBIN} class add dev $EXT_IFACE parent 1: classid 1:$n htb rate $rate ceil $rate ${TCBIN} filter add dev $EXT_IFACE protocol ip parent 1:0 prio 0 handle $n fw classid 1:$n ${TCBIN} qdisc add dev $EXT_IFACE parent 1:$n handle $n: sfq perturb 10 $IPT -t mangle -A FORWARD -s $ip/32 -j MARK --set-mark $n let n++

${TCBIN} class add dev $USER_IFACE parent 1: classid 1:$n htb rate $rate ceil $rate ${TCBIN} filter add dev $USER_IFACE protocol ip parent 1:0 prio 0 handle $n fw classid 1:$n ${TCBIN} qdisc add dev $USER_IFACE parent 1:$n handle $n: sfq perturb 10 $IPT -t mangle -A FORWARD -d $ip/32 -j MARK --set-mark $n let n++

done

if [ -f ${UFLAG} ]; then /bin/rm ${UFLAG} fi }

attempt() { if [ -f ${UFLAG} ]; then build /bin/rm ${UFLAG} fi }

showtc() { for i in $USER_IFACE $EXT_IFACE; do echo ======= $i =============== ${TCBIN} qdisc show dev $i echo === Classes ${TCBIN} class show dev $i echo === Filters ${TCBIN} filter show dev $i done

}

# Main work

case $1 in start) build ;; stop) flush ;; check) attempt ;; restart) build ;; show) showtc ;; *) echo $"Usage: $prog {start|stop|restart|show}" exit 1 esac

#247844

Функции должны записываться так:

text

function_name() {
...function_body
}

...т.е. после имени функции перед парой круглых скобок пробела быть не должно.

#247851
Lupo Alberto написал:
Функции должны записываться так:
text

function_name() {
...function_body
}

...т.е. после имени функции перед парой круглых скобок пробела быть не должно.

Подправил не помогло...

text
#!/bin/bash

USER_IFACE='eth1' EXT_IFACE='eth0' DATA='/usr/local/accnt/conf/unlimit.dat' UFLAG='/usr/local/accnt/conf/unlimit.flg' TCBIN='/sbin/tc' IPT='/sbin/iptables'

get_user_iface() { user_iface=`ip -o route get $1 | sed 's/.*dev \(\S*\).*/\1/'` echo $user_iface }

flush() { for i in $USER_IFACE $EXT_IFACE; do ${TCBIN} qdisc del dev $i root #>/dev/null 2>&1 done }

init() { flush $IPT -t mangle -F $IPT -t mangle -A FORWARD -s 192.168.0.0/16 -d 193.93.49.64/27 -j RETURN $IPT -t mangle -A FORWARD -s 193.93.49.64/27 -d 192.168.0.0/16 -j RETURN $IPT -t mangle -A FORWARD -s 192.168.0.0/16 -d 91.220.230.0/24 -j RETURN $IPT -t mangle -A FORWARD -s 91.220.230.0/24 -d 192.168.0.0/16 -j RETURN $IPT -t mangle -A FORWARD -s 192.168.0.0/16 -d 192.168.0.0/16 -j RETURN

for i in $USER_IFACE $EXT_IFACE; do ${TCBIN} qdisc del dev $i root >/dev/null 2>&1 ${TCBIN} qdisc add dev $i root handle 1: htb done }

build() { init n=100 cat $DATA | while read ip rate;do echo $ip $rate USER_IFACE=`get_user_iface $ip`

${TCBIN} class add dev $EXT_IFACE parent 1: classid 1:$n htb rate $rate ceil $rate ${TCBIN} filter add dev $EXT_IFACE protocol ip parent 1:0 prio 0 handle $n fw classid 1:$n ${TCBIN} qdisc add dev $EXT_IFACE parent 1:$n handle $n: sfq perturb 10 $IPT -t mangle -A FORWARD -s $ip/32 -j MARK --set-mark $n let n++

${TCBIN} class add dev $USER_IFACE parent 1: classid 1:$n htb rate $rate ceil $rate ${TCBIN} filter add dev $USER_IFACE protocol ip parent 1:0 prio 0 handle $n fw classid 1:$n ${TCBIN} qdisc add dev $USER_IFACE parent 1:$n handle $n: sfq perturb 10 $IPT -t mangle -A FORWARD -d $ip/32 -j MARK --set-mark $n let n++

done

if [ -f ${UFLAG} ]; then /bin/rm ${UFLAG} fi }

attempt() { if [ -f ${UFLAG} ]; then build /bin/rm ${UFLAG} fi }

showtc() { for i in $USER_IFACE $EXT_IFACE; do echo ======= $i =============== ${TCBIN} qdisc show dev $i echo === Classes ${TCBIN} class show dev $i echo === Filters ${TCBIN} filter show dev $i done

}

# Main work

case $1 in start) build ;; stop) flush ;; check) attempt ;; restart) build ;; show) showtc ;; *) echo $"Usage: $prog {start|stop|restart|show}" exit 1 esac

#247855

А сами по себе команды, записанные в функциях, отрабатывают?
Если второй строкой записать

text

set -x

либо заменить первую на

text

#!/bin/bash -xv

скрипт будет запускаться в режиме отладки.
Пробуйте запускать скрипт с разными аргументами, вывод покажите.

#247861
Lupo Alberto написал:
А сами по себе команды, записанные в функциях, отрабатывают?

Этот скрипт вполне рабочий и всё отрабатывается. Я использую этот скрипт и на других маршрутизаторах с тем же дистрибутивом, но на других маршрутизаторах стоят vlan`ы и отличия в скриптах только эти:

text
USER_IFACE='eth1.2 eth1.3'

То есть тут я указываю один интерфейс, а там два... Видимо загвоздка в этом...

Войдите или зарегистрируйтесь, чтобы ответить.