Vighter's Blog

Blog informatyczno-ekonomiczno-polityczno-polski :)

Squid i podział łącza

Skomentuj »

Dzisiejszy wpis będzie techniczny. Po 3 tygodniach (tj. czwartki, piątki – w szkole luźniej, więc można pracować w spokoju) walki z ograniczeniem łącza na sieci bezprzewodowej (Wspominałem, że mamy w szkole sieć bezprzewodową? Nie? No to wspominam. :P WiFi bez zabezpieczeń, ale Internet jest dopiero po zalogowaniu się przez VPN z imiennym certyfikatem). Download działał bez problemu, ale upload sporo krwi napsuł… :/ W necie znalazłem kilkanaście opisów (większość z pierwszej połowy dekady…), ale żaden nie chciał zadziałać. Dopiero, gdy znalazłem wpis na forum Slackware i odpowiednio go przystosowałem zechciało ruszyć. Też tedy opiszę, co mam w fazie TESTÓW – na wirtualnym serwerze ze Slackware i klientem Win2000 chodziło elegancko.

Bez ograniczenia
Z ograniczeniem

Tak to wyglądało przed ograniczeniem i po. Czyli ładnie przycina, mimo że działa razem ze squidem. Dobra, przejdźmy teraz do opisu.

Rekompilacja squida
Ano, niestety jest konieczna, gdyż standardowo squid nie posiada wsparcia zph Więc mamy 2 wyjścia. Albo nałożymy patcha zph, albo skompilujemy sobie nowego squida z serii 3.1 z opcją --enable-zph-qos. Ja wybrałem tą drugą możliwość. Skorzystałem z jakiegoś starego Slackbuilda – dostosowałem trochę do nowej wersji i stworzyło fajną paczkę do Slackware, polecam taką metodę. :)

Konfiguracja squida

visible_hostname darkstar
http_port 3128 transparent
logformat squid %tl %>a %>A %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
access_log /var/log/squid/access.log squid
cache_effective_user proxy
cache_effective_group proxy
cache_swap_low 90%
cache_swap_high 95%
cache_mem 320 MB
maximum_object_size 32768 KB
minimum_object_size 0KB
maximum_object_size_in_memory 128 KB
cache_dir ufs /var/spool/squid 12000 16 256
acl manager proto cache_object
acl siec src 192.168.30.0/24 127.0.0.1
http_access allow siec
http_access deny manager all
http_access deny all
tcp_outgoing_tos 0x08 siec
server_persistent_connections off

Szczególnie ważne są 2 ostatnie linijki – trzeba oznaczyć pakiety TOSem.

QOS

#!/bin/bash

ilosc=20
i=11
zew=eth0
wew=eth1
glowna=5mbit
glowna=200kbit
down=200kbit
dmin=50kbit
dmax=100kbit
upl=100kbit
umin=25kbit
umax=50kbit
lan=98000kbit
siec=192.168.30.

#komunikat
echo &quot;Uruchamianie QoS&quot;

#ograniczanie download
tc qdisc del root dev $wew
tc qdisc add dev $wew root handle 1:0 htb
tc class add dev $wew parent 1:0 classid 1:1 htb rate $glowna ceil $glowna
tc class add dev $wew parent 1:1 classid 1:2 htb rate $down ceil $down
tc class add dev $wew parent 1:1 classid 1:3 htb rate $lan ceil $lan

echo &quot;Ograniczenie downloadu...&quot;
# zakladanie klas w petli
while [ $i -le $ilosc ]
do
	tc class add dev $wew parent 1:2 classid 1:$i htb rate $dmin ceil $dmax prio 1
	echo $siec$i
	tc filter add dev $wew protocol ip parent 1:0 u32 match ip dst $siec$i flowid 1:$i
	tc qdisc add dev $wew parent 1:$i handle $i:0 sfq perturb 10
	i=$[i + 1]
done

#ograniczanie upload
i=$[11]
znak=1
tc qdisc del root dev $zew		
tc qdisc add dev $zew root handle 2:0 htb
tc class add dev $zew parent 2:0 classid 2:1 htb rate $glowna ceil $glowna
tc class add dev $zew parent 2:0 classid 2:2 htb rate $upl ceil $upl
tc class add dev $zew parent 2:1 classid 2:3 htb rate $lan ceil $lan

echo &quot;Ograniczenie uploadu...&quot;
# zakladanie klas w petli
while [ $i -le $ilosc ]
do
	tc class add dev $zew parent 2:2 classid 2:$i htb rate $umin ceil $umax prio 1
	tc filter add dev $zew protocol ip parent 2:0 handle $znak fw flowid 2:$i
	echo $siec$i
	tc qdisc add dev $zew parent 2:$i handle $i:0 sfq perturb 10
	i=$[i + 1]
done

echo &quot;Ograniczenie wlaczone!&quot;

(Jakoś nie było czasu się zapoznać z HFSC, Tom, więc zrobiłem w HTB – ważne, że działa. ;) )

Firewall

#!/bin/bash

wan_if=eth0
lan_if=eth1
wan_ip=192.168.10
lan_ip=192.168.30.0/24

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F
iptables -X

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

echo &quot;Firewall wyczyszczony!&quot;

echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward

#loopback i pingi
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

#ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#lancuch syn-flood zabezpieczenie przed atakami DoS
iptables -N syn-flood
iptables -A INPUT -i $wan_if -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j LOG --log-level debug --log-prefix &quot;IPT SYN-FLOOD: &quot;
iptables -A syn-flood -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j LOG --log-level debug --log-prefix &quot;IPT INPUT: &quot;

#squid_dansguardian
iptables -A INPUT -i $lan_if -s $lan_ip -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -i $lan_if -s $lan_ip -p tcp --dport 3128 -j ACCEPT
iptables -t mangle -A PREROUTING -i $lan_ip -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 80 -m tos --tos 0x08 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -s $lan_ip -p tcp --dport 80 -j REDIRECT --to-port 8080

#routing
iptables -t filter -A FORWARD -s $lan_ip -d 0/0 -j ACCEPT
iptables -t filter -A FORWARD -s 0/0 -d $lan_ip -j ACCEPT
iptables -t nat -A POSTROUTING -s $lan_ip -d 0/0 -j MASQUERADE

#wszystkie poprawne pakiety moga wychodzic
iptables -A OUTPUT -m state ! --state INVALID -j ACCEPT
iptables -A OUTPUT -j LOG --log-level debug --log-prefix &quot;IPT OUTPUT: &quot;
iptables -A OUTPUT -j DROP

echo &quot;Firewall wlaczony!&quot;

I to byłoby na tyle. Powinno ładnie przycinać, ale jak już wspomniałem, jest to w fazie eksperymentalnej, co nie przeszkodziło mi wczoraj wieczorem we wdrożeniu tego rozwiązania w szkole – w najgorszym wypadku przez jakiś czas nie będzie neta :P .
Jakby komuś się chciało przetestować i podzielić opinią, to byłoby fajnie.

Teraz jeszcze muszę zrobić takie przekierowanie, że gdy ktoś będzie chciał się połączyć z netem bez VPN, to zostanie przekierowany na wewnętrzny serwer WWW, gdzie będzie informacja o konieczności użycia VPN. Też jest sporo opisów, tylko że żaden nie chce zadziałać…:/

Edit: No i w szkole nie działa ograniczanie. Może to temu, że jest więcej interfejsów lokalnych. Muszę sobie stworzyć wirtualny model sieci szkolnej i sprawdzić, co zadziała. Oprócz tego dzisiaj wszyscy narzekali, że net mulił i czasami w ogóle nie chciało się połączyć – jakby to moja wina, że akurat coś z DNSami robili… Ale takie już życie admina…;)

Written by Vighter

20 Marzec 2010 @ 10:33

Napisane w Linux, Open Source

Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Zmień )

Twitter picture

You are commenting using your Twitter account. Log Out / Zmień )

Facebook photo

You are commenting using your Facebook account. Log Out / Zmień )

Connecting to %s

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.