Squid i podział łącza
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.
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.


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 "Uruchamianie QoS" #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 "Ograniczenie downloadu..." # 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 "Ograniczenie uploadu..." # 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 "Ograniczenie wlaczone!"
(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 "Firewall wyczyszczony!" echo "1" > /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 "IPT SYN-FLOOD: " 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 "IPT INPUT: " #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 "IPT OUTPUT: " iptables -A OUTPUT -j DROP echo "Firewall wlaczony!"
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
.
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…;)