big problem z traffic shapingiem i IMQ

Przemysław Backiel przemyslaw.backiel w backiel.com.pl
Wto, 21 Mar 2006, 13:25:03 CET


Witam,

mam taki skrypt

(wiele markowan wywaliłem tutaj aby nie zasmiecac obrazu)

#!/bin/sh
#Sciezka do plikow wykonywalnych
PATH="/sbin:/usr/local/sbin:$PATH"
TC=/sbin/tc
IPTABLES=/usr/sbin/iptables
IP=/sbin/ip

# Parametry łącza w kilobitach, podanie wartość trochę poniżej 
rzeczywistych
# powinno zaowocować bardzo miłym efektem w postaci małego opóźnienia
# PR_WYSYL=predkosc wysylania , PR_ZCIAG=predkosc zciagania
PR_WYSYL=1000
PR_ZCIAG=1000

# Interfejs wysyłający w świat pakiety (tu wpisać interface od strony
# internetu)
IF_OUT=eth0
# Interfejs (wirtualny) IMQ używany do kolejkowania ruchu przychodzącego
# (tego najlepiej nie ruszać)
IF_IN=eth1

case "$1" in

	start)

echo "STARTING FIREWALL"

#Ladujemy moduly
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ip_nat_irc
modprobe ip_nat_ftp
modprobe sch_htb
modprobe sch_sfq
modprobe sch_esfq
modprobe sch_wrr
modprobe cls_fw
modprobe cls_u32
modprobe cls_route
modprobe sch_esfq
modprobe ipt_MARK
modprobe ipt_TOS
modprobe ipt_TTL
modprobe ipt_CLASSIFY
modprobe ipt_helper
modprobe ipt_ipp2p
modprobe ipt_layer7
modprobe imq numdevs=4

#Czyscimy reguly firewalla
iptables -F
iptables -F -t nat
iptables -t nat -Z
iptables -F -t mangle
iptables -t mangle -Z

#Zalaczamy forwarding w kernelu
echo 1 > /proc/sys/net/ipv4/ip_forward

### Zabezpieczenia ###
echo "STARTING SECURITY..."
#Bug wykryty w iptables
iptables -A OUTPUT -m state -p icmp --state INVALID -j DROP

#Ochrona przed atakiem SMURF
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#Nie akceptujemy pakietow "Source route"
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

# Nie przyjmujemy pakietow ICMP redirect,
# ktore moga zmienic nasza tablice routingu
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects

# Wlaczamy ochrone przed blednymi pakietami ICMP error
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo "SECURITY IS RUNNING"
echo "Uruchamiamy IMQ"
/sbin/ip link set imq0 down
/sbin/ip link set imq1 down
/sbin/ip link set imq2 down
/sbin/ip link set imq0 up
/sbin/ip link set imq1 up
/sbin/ip link set imq2 up

$IPTABLES -t mangle -I POSTROUTING -o ppp+ -j IMQ --todev 0
$IPTABLES -t mangle -I PREROUTING -i ppp+ -j IMQ --todev 1
$IPTABLES -t mangle -A POSTROUTING -o eth1 -j IMQ --todev 0
$IPTABLES -t mangle -A PREROUTING -i eth1 -j IMQ --todev 1

#$IPTABLES -t mangle -A PREROUTING -i eth0 -j IMQ --todev 2


echo "IMQ uruchomione"



$IPTABLES -t mangle -A PREROUTING -p tcp -i $IF_OUT -j CONNMARK 
--restore-mark
$IPTABLES -t mangle -A POSTROUTING -p tcp -o $IF_OUT -j CONNMARK 
--restore-mark


#Interfejs lokalny
iptables -A INPUT -i lo -j ACCEPT

#Przychodzace pakiety dla serwera IDENT odrzucamy z komunikatem ICMP
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with 
icmp-port-unreachable

#irc szybko ma dzialac
iptables -A INPUT -p tcp -d $ADRES_WAN --dport 8080 -j REJECT 
--reject-with icmp-port-unreachable
iptables -A INPUT -p tcp -d $ADRES_WAN --dport 3128 -j REJECT 
--reject-with icmp-port-unreachable
iptables -A INPUT -p tcp -d $ADRES_WAN --dport 1080 -j REJECT 
--reject-with icmp-port-unreachable
#Wpuszczamy wszystko z LAN
iptables -A INPUT -i eth1 -s 192.168.0.0/255.255.254.0 -j ACCEPT
iptables -A FORWARD -i eth1 -s 192.168.0.0/255.255.254.0 -j ACCEPT
iptables -A FORWARD -i ppp+ -s 192.168.0.0/255.255.254.0 -j ACCEPT
iptables -A FORWARD -i ppp+ -s 192.168.134.0/255.255.254.0 -j ACCEPT
iptables -A FORWARD -i eth0 -s 0/0 -j ACCEPT


#Akceptujemy polaczenia juz nawiazane

iptables -A INPUT -p tcp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p tcp -j ACCEPT -m state --state RELATED
iptables -A INPUT -p udp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p udp -j ACCEPT -m state --state RELATED
iptables -A INPUT -p icmp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p icmp -j ACCEPT -m state --state RELATED
iptables -A FORWARD -p tcp -j ACCEPT -m state --state ESTABLISHED
iptables -A FORWARD -p tcp -j ACCEPT -m state --state RELATED
iptables -A FORWARD -p udp -j ACCEPT -m state --state ESTABLISHED
iptables -A FORWARD -p udp -j ACCEPT -m state --state RELATED
iptables -A FORWARD -p icmp -j ACCEPT -m state --state ESTABLISHED
iptables -A FORWARD -p icmp -j ACCEPT -m state --state RELATED

#Wpuszczamy ping na interfejsie lokalnym
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT -i eth1
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT -i ppp+

##Uslugi na serwerze wypuszczane w swiat##

#dns
iptables -A INPUT -p udp -d $ADRES_WAN --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -d $ADRES_WAN --dport 53 -j ACCEPT

iptables -A INPUT -i ppp+ -j ACCEPT


####################################################################################
##NAT##

$IPTABLES -t nat -I POSTROUTING -s 192.168.134.43 -j SNAT --to-source 
194.88.154.130
$IPTABLES -t nat -I PREROUTING -d 194.88.155.130 -j DNAT 
--to-destination 192.168.134.43

$IPTABLES -t nat -I POSTROUTING -s 192.168.135.100 -j SNAT --to-source 
194.88.154.131
$IPTABLES -t nat -I PREROUTING -d 194.88.155.131 -j DNAT 
--to-destination 192.168.135.100

echo "ROZPOCZETO: ustawianie redirect proxy"


#$IPTABLES -t nat -A PREROUTING -i eth1 -s 192.168.0.1/32 -p tcp --dport 
80 -j REDIRECT --to-port 8080


#ustawianie ttl
$IPTABLES -t mangle -A POSTROUTING -d 192.168.0.0/255.255.254.0 -j TTL 
--ttl-set 1
$IPTABLES -t mangle -A POSTROUTING -d 192.168.1.3/255.255.255.255 -j TTL 
--ttl-set 1



######---KLASYFIKACJA ZE WZGLĘDU NA PORT---######
#http
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p tcp --dport 80 -m mark 
--mark 0 -j MARK --set-mark 7;
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p tcp --sport 80 -m mark 
--mark 0 -j MARK --set-mark 7;
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p tcp --dport 80 -m mark 
--mark 0 -j MARK --set-mark 7;
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p tcp --sport 80 -m mark 
--mark 0 -j MARK --set-mark 7;



echo "KLASYFIKOWANIE RUCHU DLA GIER"

#rozne rozpoznawane gry
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -m layer7 --l7proto 
subspace -j MARK --set-mark 4
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -m layer7 --l7proto 
subspace -j MARK --set-mark 4

$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -m layer7 --l7proto 
counterstrike-source -j MARK --set-mark 4
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -m layer7 --l7proto 
counterstrike-source -j MARK --set-mark 4


echo "zakonczono: KLASYFIKOWANIE RUCHU DLA GIER"
# ftp pasywne - latajace po roznych portach
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -m helper --helper ftp -j 
MARK --set-mark 9
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -m helper --helper ftp -j 
MARK --set-mark 9
$IPTABLES -t mangle -A PREROUTING -i $IF_IN -m helper --helper ftp -j 
MARK --set-mark 9
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -m helper --helper ftp -j 
MARK --set-mark 9

$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p udp --dport 21 -j MARK 
--set-mark 9
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p tcp --dport 21 -j MARK 
--set-mark 9
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p udp --sport 21 -j MARK 
--set-mark 9
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p tcp --sport 21 -j MARK 
--set-mark 9

$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p udp --dport 20 -j MARK 
--set-mark 9
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p tcp --dport 20 -j MARK 
--set-mark 9
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p udp --sport 20 -j MARK 
--set-mark 9
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p tcp --sport 20 -j MARK 
--set-mark 9


# to co wykryje ipp2p do 10
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -m layer7 --l7proto 
bittorrent -j MARK --set-mark 10
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -m layer7 --l7proto 
bittorrent -j MARK --set-mark 10

$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -m layer7 --l7proto 
fasttrack -j MARK --set-mark 10
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -m layer7 --l7proto 
fasttrack -j MARK --set-mark 10

$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p tcp  -m ipp2p --ipp2p -j 
MARK --set-mark 6;
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p tcp  -m ipp2p --ipp2p 
-j MARK --set-mark 6;
$IPTABLES -t mangle -A PREROUTING -i $IF_OUT -p udp  -m ipp2p --ipp2p -j 
MARK --set-mark 6;
$IPTABLES -t mangle -A POSTROUTING -o $IF_OUT -p udp  -m ipp2p --ipp2p 
-j MARK --set-mark 6;

$IPTABLES -t mangle -A PREROUTING -p tcp -i $IF_OUT -j CONNMARK --save-mark
$IPTABLES -t mangle -A POSTROUTING -p tcp -o $IF_OUT -j CONNMARK --save-mark


#Reszte odrzucamy i logujemy
iptables -A INPUT -j LOG -m limit --limit 10/hour --log-prefix 
"PODEJRZANY INPUT:"
iptables -A INPUT -j DROP
iptables -A FORWARD -j LOG -m limit --limit 10/hour --log-prefix 
"PODEJRZANY FORWARD:"
iptables -A FORWARD -j DROP

echo "FIREWALL LOADED"
echo "***************"

	;;
	stop)
echo "FIREWALL IS GOING DOWN..."
#/etc/rc.d/firewall/starcraft.sh stop
iptables -F
iptables -F -t nat
iptables -t nat -Z
iptables -F -t mangle
iptables -t mangle -Z
#/sbin/ip link set imq2 down
/sbin/ip link set imq1 down
/sbin/ip link set imq0 down


echo 0 > /proc/sys/net/ipv4/ip_forward

echo "FIREWALL STOPPED"
	;;

restart)
	$0 stop
	$0 start
	;;
  *)
echo "Uzycie: firewall (start|stop|restart)"
esac

exit 0

------------------------------------------------------------------------

i jaki efekt?

gdy odpale powyzszy skrypt i do htb bede wrzucał powyzsze marki (IMQ 
wyłączone) wszystko działa ok
gdy włącze IMQ (tak jak powyzej) to ruch idzie jak krew z nosa 
(oczywiscie marki do HTB wrzucam, jak do urządzeń IMQ0/1), do 
odpowiednich kolejek trafia mikro ruch, reszta chyba do defaultowej 
kolejki, ping podskakuje niemiłosiernie

co robie nie tak tutaj?
dlaczego tak się dzieje? jak to naprawić
naprawde liczy na pomoc, bo po problemach ze stabilnoscią, mam teraz 
problem z działaniem :(

aha
co chce osiągnąć
ograniczac transfer dla ludzi ktorzy łącza się via static IP/DHCP oraz 
przez pppoe
koncetrator pppoe jest na tej samej maszynie

prosze o pomoc

z IMQ walcze juz ze 3-4 tygodnie i ciągle w lesie jestem :(

-- 
Z powazaniem
Przemyslaw Backiel



Więcej informacji o liście dyskusyjnej pld-users-pl