strona przystosowana do rozdzielczości 1024x768

POWRÓT DO STRONY FREESCO


Opowieść o tym jak zmusiłem przeźroczystą kałamarnicę do współpracy 

Na co to komu:

Co można zrobić aby przyspieszyć nędzne łącze ? Odpowiedź brzmi: zrobić squida. Jak zmusić userów do korzystania z proxy ? Odpowiedź: zrobić squida transparentnego (transparent proxy), czyli niewidocznego dla userów, czyli przeźroczystego. Upieczemy zarazem dwie pieczenie na jednym ogniu, bo keszować będziemy strony (i pliki) oraz wyplenimy programy p2p (kaaza) działające na porcie 80. Opis dotyczy konfiguracji w środowisku FreeSCO.


Potrzebne materiały:

Do przodu !!!:

Jeżeli mamy już squida to spróbujemy na tym co mamy przekierować wywołania z wewnątrz sieci na port http (80) na port proxy (domyślnie 3128 w squid.conf ale może też być to port 8080). Czyli wbijamy z palca regułkę redirect

ipfwadm -I -i accept -r 3128 -P tcp -S 192.168.0.0/24 -D any/0 www

Badanie efektów pracy naszej poprzedniej jest proste. Po chwili krótszej lub dłuższej spróbujmy otworzyć jakąś stronę łebową. Jeżeli działa to prawdopodobnie odnieśliśmy sukces. Jeszcze sprawdźmy 

ipfwadm -I -l

Jeżeli jest na liście obecny wpis taki jak poniżej i www działa to mamy właśnie przeźroczyste proxy. Możecie więc czytać dalej lub też nie. 

acc/r tcp 192.168.0.0/24 anywhere any -> http => 3128

Jeżeli jednak nie działa lub nie mamy squida to trzeba zainstalować squida po kompilacji (na pewno) z opcją transparent. Zaczynamy od ściągnięcia plików squid.tgz i lib.tgz oraz install. Wrzucamy je następnie na serwer np. za pomocą FTP. Już spod freesco nadajemy plikowi install prawa 755 czyli czynimy go wykonywalnym (executable). Ja to robię z lenistwa w MC. Potem możemy skopiwać go (plik install) do katalogu /mnt/router/rc/rcuser aby przy ochocie użycia nie wpisywać kilometrowych scieżek dostępowych. Możemy też przy umieszczeniu owego pliku w innym katalogu zrobić tzw. dowiązanie symboliczne za pomocą ln -s. W każdym następnym krokiem naszym będzie wydanie polecenia. Oczywiście będąc w katalogu z ściągniętym plikiem tgz.

install squid.tgz

Następnie 

install lib.tgz

Po tych czynnościach będąc w katalogu /mnt pod linuxem natkniemy się na nowo utworzony katalog /opt, niech nas to nie dziwi...W tym oto katalogu zawarte są nasze programy właśnie zainstalowane. Sięgamy zatem na chwilkę do katalogu /mnt/router/rc i w pliku rc_lib usuwamy "#", czyli znak zwany potocznie haszem (chaszem ?) lub płotkiem, z wpisu 

ln -s /mnt/opt/lib/libm.so.5 /lib/libm.so.5

Jest to wpis czyniący dowiązanie symboliczne do biblioteki potrzebnej squid'owi do pracy. Teraz mamy przed sobą najtrudniejszy kawałek roboty, odpalenie i konfigurację kałamarnicy. Zaczynamy od pliku konfiguracyjnego programu squid, znajduje się on w naszym przypadku w /mnt/opt/squid/squid.conf. Oto jego najważniejsze fragmenty, do przystosowania. Celowo pominąłem komentarze angielskie aby nie wprowadzać zamieszania, usunąłem je też z pliku, jeżeli chce je ktoś obejrzeć można je znależć w pliku /mnt/opt/squid/etc/squid.conf.default. Zaczynamy od opcji niezbędnych dla uruchomienia proxy:

http_port 3128 Port na którym proxy ma działać, czasem spotykamy jeszcze port 8080
cache_mem 16 MB Ilość pamięci przeznaczonej dla squid'a, ogólnie teoria mówi o ustaleniu tej wartości na 1/3 ilości pamięci w systemie, warto jednak poeksperymentować z tą wartością, gdyż wiadomo że wydajność dyskowa we FreeSCO pozostawia wiele do życzenia (brak DMA i obsługi dysków SCSI), zatem główną akcelerację uzyskujemy poprzez trafienia w pamięci. Generalnie im więcej tym lepie,j jednak bez przesady !!! TO NIE JEST WARTOŚĆ MAKSYMALNEJ PAMIĘCI ALOKOWANEJ PRZEZ PROCES SQUID'A !!! Squid zabierze jej trochę więcej :-) jakieś dwa lub trzy razy więcej...to według dokumentacji. To raczej pamięć przeznaczona na bieżące złapane pliki stron, i pliki aktualnie zapisywane na HDD.
maximum_object_size 1024 KB Maksymalna wielkość obiektów które będą składowane przez proxy, jeżeli chcemy przyspieszyć tylko działanie stron internetowych ustawiamy tą wielkość dość nisko. W tym przypadku to 1 MB, przy wyjściu z założenia że nie potrzebne jest keszowanie plików ściąganych z www, i przy niezbyt wielkiej przestrzeni dyskowej przeznaczonej na cache więcej Mii nie trzeba
cache_dir ufs /mnt/ext/cache 120 16 16 Ta opcja definiuje ścieżkę do katalogu cache który jest katalogiem roboczym squid'a, jego wielkość i strukturę. Ścieżka u Mnie do /mnt/ext/cache prowadzi do katalogu na partycji ext2, której założenie opisałem poprzednio. Kałamarnica lepiej się czuje na partycji linux'owej. Pierwsza liczba po ścieżce dostępowej mówi nam o rozmiarze cache w megabajtach. I tu istnieje wiele rozbieżnych opinii na ten temat. Osobiście uważam że nie ma zbyt wielkiego sensu robić ogromnych rozmiarów keszu, mając świadomość że większy zasób zmagazynowanych plików jest trudniejszy do przeszukania i przy prędkości transferów dyskowych FreeSCO kluczową rolę odgrywa pamięć, nie ma sensu gromadzić dużo. Lepiej częściej odświeżać  cache. Następne dwie cyfry definiują na drzewo katalogów w którym gromadzone będą pliki. Mój przykład to 16 podkatalogów w 16 katalogach. Tu też kłania się teza że im więcej katalogów tym trudniej (i dłużej) je przeszukiwać jest. Nam przecież chodzi o jak największą wydajność a nie ogromnych rozmiarów magazyn z niepotrzebnymi rzeczami... 
dns_nameservers 194.204.159.1 194.204.152.34 Adresy serwerów DNS, w tym przykładzie to serwery TPSA ale jeżeli twój provider,  inny niż TPSA ma swe własne DNS'y to powinieneś je tu umieścić. Natomiast jeżeli sam posiadasz serwer DNS, choćby tylko cached-only (tryb buforowania), możesz podać tutaj jego adres. Jednak zdarzyło mi się poddać się problemowi nie działania adresu wewnętrznego serwera DNS (w formie 192.168.0.1). W tym wypadku pomogło podanie jako DNS adresu pętli wewnętrznej (loopback) 127.0.0.1. Jeżeli u siebie miałem podane DNS'y TPSA to znacznie częściej następowało zrywanie wczytywania strony, trzeba było odświeżać. Przy własnym DNS ten problem też występuje, ale raczej sporadycznie. Optymalnym rozwiązaniem jest wpisanie kilku DNS'ów. Ja mam taki wpis: 

dns_nameservers 127.0.0.1 194.204.159.1 194.204.152.34 193.110.121.20

Czyli najpierw własny, a potem tepsowe.

acl nasi src 192.168.0.0/255.255.255.0 Tworzę grupę "nasi" której adresem sieciowym jest adres naszej sieci
acl all src 0.0.0.0/0.0.0.0 Oraz grupę wszystkich adresów sieciowych "all"
http_access allow nasi I zezwalam grupe "nasi"  na korzystanie z proxy
http_access deny all Oraz zabraniam wszystkim innym dostępu. Tu jest trochę na opak jako że jadąc od góry najpierw pozwoliłem na dostęp grupie nasi a potem zabroniłem grupie "all" czyli wszystkim włącznie z grupą "nasi". Ale można powiedzieć że jedziemy od dołu. I tak robimy...:-)
acl FTP proto FTP Teraz tworzę wpis FTP która nie wyróżnia się niczym szczególnym oprócz tego że przypisany ma protokół FTP
always_direct allow FTP I tutaj używam poprzedniego wpisu aby zawsze bezpośrednio (bez udziału squid'a) używać FTP. Czyli squid nie wtrąca się do FTP 
client_netmask 255.255.255.0 Maska sieciowa komputerów klienckich
cache_mgr admin@serwera.proxy Adres administratora, używany jako "user" przy logowaniu się do strony zarządzania przez www squida. Zobaczyć go możemy także na tzw "error pages" lub inaczej "error messages" czyli stronach (komunikatach) które zobaczymy w przypadku wystąpienia jakiegoś błędu.
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
Potraktowałem te opcje jako jeden segment z powodu ich zależności. Są to opcje służące do pewnego rodzaju oszukania  naszego serwera proxy. Squid może działać także jako dopalacz dla lokalnego httpd. I tak na pierwszy rzut oka te opcje wyglądają, jakby służyły właśnie przyspieszeniu naszego serwera www. Lecz w przypadku przekierowania jaki zrobiliśmy lub zrobimy, kałamarnica musi myśleć że z jednej strony działa jako dopalacz dla lokalnego serwera www, a z drugiej jako lokalny serwer proxy. Tylko tak zadziała prawidłowo w trybie transparent. Ostatnia opcja wymusza dodatkowo używanie nagłówków hostów do magazynowania i buforowania obiektów w plikach podczas pracy przeźroczyście. Ustawienia te są także niezbędne czytania (i tym samym otwierania jako że mamy przekierowanie) adresów stron wpisywanych w formie "http://www.adres:port". Nie zalecam zmiany tych opcji, aczkolwiek można nimi manipulować. Jednak wtedy raczej już musimy dokładnie wiedzieć co robimy.

Po tym małym kawałku czarnej magii, musimy utworzyć system katalogów cache, który raczyliśmy zadeklarować powyżej. Tworzymy więc katalog który określiliśmy, jako katalog roboczy squid'a. W miejscu tym squid będzie przechowywał te najczęściej odwiedzane witryny. Właścicielem katalogu powinien być użytkownik na jakim uruchamiany jest squid. W naszym przypadku to nobody z grupy nobody. Można tak chown -R nobody /mnt/ext/cache. Drzewo podkatalogów utworzy sam squid jeżeli, w naszym przypadku wydamy komendę:

/mnt/opt/squid/bin/squid -z

Pomieli trochę dyskiem i wyjdzie do konsoli. Przykłady dotyczą tylko naszego przypadku.

I po ustawieniu tych opcji, oraz wpisaniu regułki przekierowania z 80 na 3128, powinien squid zadziałać jako serwer proxy działający niewidocznie dla użytkowników. Nie zostały ujęte niektóre opcje domyślne których dokładnie nie znam i których nie zmieniałem a kałamarnica działała transparentnie. Opiszę jeszcze opcje których używam a nie należą one do niezbędnych przy konfiguracji. Możemy nazwać to "dostrajaniem":

 
cachemgr_passwd tajne all Hasło dla usera podanego powyżej, potrzebne do zalogowania się na panel kontrolny squida (www). All oznacza dostęp do wszystkiego w takowym panelu. Inne opcje (info stats/objects, shutdown) do opanowania we własnym zakresie. Słowo "tajne jest oczywiście tylko przykładem.
visible_hostname cośtam.gdzieśtam.jesteśmy Nazwa hosta, ale nie ogólnie, lecz tylko dla użytku serwera cache. Wyświetlana np w komunikatach o błędach. 
reply_body_max_size 1024 KB Ustawia maksymalny rozmiar odpowiedzi w przypadku pobierania strony www. W zastosowaniu służy do ustawienia maksymalnej wielkości pliku który może być pobrany z serwera http. Łopatologicznie oznacza to że nikt nie ściągnie większego pliku niż 1 MB (w tym przykładzie) z jakiejkolwiek strony. Nie dotyczy to FTP.
cache_store_log none Wyłącza zapisywanie log'a o plikach magazynowanych przez cache. Dla mnie taki plik zawiera mnóstwo niepotrzebnych informacji więc go wyłączam. Pliki log'ów osiągają czasem b. duże rozmiary i niepotrzebnie zajmują miejsce na dysku
logfile_rotate 2 Przy rotacji log'ów starym plikom nadawane są numery. Wpis ten ogranicza najwyższy numer do 2. 
minimum_retry_timeout 15 seconds Definiuje czas po którym wywołana strona zostanie uznana za niedostępną (timeout).
acl QUERY urlpath_regex cgi-bin cgi \?
no_cache deny QUERY
Nie keszujemy obiektów z adresów URL zawierających odniesienia do skryptów CGI
reference_age 2 weeks Czas przechowywania obiektów w naszym cache. Domyślnie jest to okres 1 roku co dla Mnie jest okresem nie potrzebie długim. W podanym przykładzie obiekty w cache przechowywane będą dwa tygodnie
fake_user_agent szperacz Nazwa przeglądarki którą zobaczą serwery przy odwiedzinach. Jednym słowem możemy ukryć czego używamy do przeglądania inetu. Dla Mnie niepotrzebne i z doświadczenia wiem że raczej średnio skuteczne.

Wraz ze Squid'em dostaniemy skrypt cachemgr.cgi który po skopiowaniu do katalogu /mnt/router/wwa/cgi będzie można uruchomić wywolując http://192.168.0.1:82/cgi/cachemgr.cgi przy założeniu oczywiście że IP serwera to 192.168.0.1. I tutaj właśnie potrzebny będzie user zdefiniowany  w sekcji cache_mgr, oraz hasło ustawione w cachemgr_passwd. Jeżeli dostęp jest ustawiony na all to będziemy mogli zajrzeć do każdej opcji tej strony.

Po konfiguracji Squid'a musimy zabrać się do opracowania metody uruchamiania go. Aby w ogóle móc włączać i wyłączać proxy trzeba by stworzyć plik rc_z_squid, uczynić go wykonywalnym i skopiować do katalogu /mnt/router/rc/rcuser. Dlaczego go nazwałem z literką "z" w środku ? Wytłumaczenie jest w opisie instalacji partycji ext2.  W każdym razie mój plik rc_z_squid wygląda tak:

#!/bin/sh  
# Squid startup/shutdown script.  
. /etc/system.cfg  
. /etc/live.cfg  
. /etc/chat.pwd  
   
if [ "$1" = firewall ]; then Jeżeli argument to firewall
 [ "$ENAMSQ" = y ] && ipfwadm -I -i reject -P tcp -W $INET -D 0.0.0.0/0 3128 I jeżeli maskarada jest załączona to odrzucamy wszystkie wywołania z zewnątrz na port naszego squid'a
 exit i wychodzimy (tylko przy wywoływaniu, uruchamianiu firewall'a)
fi  
    
if [ "$1" = stop -o "$1" = restart ]; then Jeżeli skrypt jest wywoływany z argumentem "stop" lub "restart
 echo -n "Stopping squid... " Wypisujemy tekst od nowej linii 
 killall squid I "zabijamy" squid'a
 ipfwadm -I -d accept -r 3128 -P tcp -S 192.168.0.0/24 -D any/0 www Oraz kasujemy regułkę przekierowań wywołań http
 ipfwadm -I -d accept -r 3128 -P tcp -S 192.168.0.0/24 -D any/0 www Jeszcze raz to samo. Na wszekli wypadek. Czasem możemy przez  pomyłkę odpalić dwa razy rc_z_squid (mnie się to zadarzyło dyżo razy...). Wyskoczy błąd ipfwadm ale to nie szkodzi.
$DONE; [ "$1" = stop ] && exit; fi Jeżeli argumentem było stop to na tym kończymy
# if [ "$1" = start -o "$1" = restart ]; then Opcjonalnie dla ciągłej pracy proxy ta linijka jest z haszem na początku przez co jest traktowana jako komentarz. W takiej sytuacji  squid wystartuje wraz ze startem serwera. Jeżeli chcielibyśmy aby nasza kałamarnica nie pracowała cały czas to możemy odkomentować (usunąć znaczek "#"). Wtedy aby rc_z_squid odpalił cache potrzebny jest argument start przy wywołaniu, dokładnie tylko komenda  rc_z_squid start wystartuje squid'a. Poniżej jest opisany przykład nie ciągłej pracy cache załatwiony za pomocą skryptu ATD. Po odkomentowaniu tej linii musimy zrobić to samo z linijką zawierającą słowo "fi" poniżej w skrypcie.
 echo -n "Starting squid... " Wypisujemy od nowej linii tekst
 /mnt/opt/squid/bin/squid Uruchamiamy z podanej ścieżki squid'a
 ipfwadm -I -i accept -r 3128 -P tcp -S 192.168.0.0/24 -D any/0 www Oraz wpisujemy do listy reguł ipfwadm regułę o przekierowaniu wszystkich wywołań http z hostów sieci lokalnej na port serwera proxy
# fi W przypadku pracy przerywanej, odkomentuj tą linijkę
$DONE  

Jest skonfigurowane w ten sposób automatyczne uruchamianie proxy przy starcie serwera. Teraz podając komendę

rc_z_squid

Uruchamiamy proxy, i analogicznie

rc_z_squid stop

Zatrzymujemy je. Jeżeli chcemy zrestartować to 

rc_z_squid restart

Jeszcze, aby log'i naszego serwera cache nie rosły w nieskończoność musimy wykonać tzw. logrotate. Dokonamy tego z pomocą skryptu ATD który znajduje się w katalogu /mnt/router/etc. Ważne jest aby dokonywać zmian w ATD właśnie w tym katalogu, a nie w katalogu /etc który się znajduje w katalogu głównym naszego FreeSCO. Zakładam że wiecie jak zmusić ATD do robienia czegokolwiek w określonym czasie (fork ATD w rc_user).

if [ $C = 2300 ]; then O 23:00
 /mnt/opt/squid/bin/squid -k rotate Robimy tzw "log rotate" czyli stare logi zapisujemy z numerkiem a od teraz logować squid będzie do nowego pliku .log
fi  

Jeżeli jednak nie chcemy aby nasz squid cały czas pracował i zrobiliśmy już niezbędne działania w pliku rc_z_squid, możemy znowu posłużyć się ATD.

if [ $C = 1000 ]; then O godzinie 10:00 
 rc_z_squid start Odpalamy proxy
fi  
   
if [ $C = 2310 ]; then O godzinie 23:10
 rc_z_squid stop Wyłączamy proxy
fi  

To tylko przykład uruchamiania czasowego kałamarnicy. Możemy wykorzystać do tego celu np. cron'a.

Opis konfiguracji serwera proxy opartego na programie squid wykonałem na podstawie własnych doświadczeń i opisałem własną konfigurację. Oczywiście kierowałem się opisami w sieci, a także plikiem squid.conf.default . Raczej nie jest on przeznaczony dla ludzi którzy wklepują wszystko bez namysłu i zastanowienia. Generalnie wszystko opisane u Mnie działa. 

Spostrzeżenia i uwagi mile widziane, w miarę czasu opis będzie aktualizowany i uzupełniany. 

UWAGI 

Szary tekst tylko to komentarz !

Z uwagi na problemy z kompatybilnością (znak końca linii) nie zaleca się tworzyć plików wykonywalnych w linuxie pod Windows'em !

plikologia:

 rc_z_squid squid.conf squid.conf.default squid.tgz install lib.tgz 

źródła wiedzy:

małe FAQ:

-podczas wpisywania komedy /mnt/opt/squid/bin/squid -z wyskakuje mi: 

"2003/01/03 05:01:10| Creating Swap Directories
FATAL: Failed to make swap directory /mnt/ext/cache/00: (13) Permission denied
Squid Cache (Version 2.3.STABLE2): Terminated abnormally.

 

Sprawa jest jasna, nie może utworzyć katalogów cache z powodu:
-nie ma katalogu /mnt/ext/cache/ - utwórz go, lub zmień scieżkę dostępu w
squid.conf na inny wybrany przez Ciebie katalog
-katalog cache ma nieodpowiedniego właściciela, jeżeli masz MC to po
podświetleniu go (najazd "kursorem") wciśnij F9 i z menu FILE wybierz opcję
CHOWN i ustaw właściciela na "nobody" z grupy "nobody". Z palca ta komenda
wygląda tak: chown -R nobody /mnt/ext/cache

-nie można wywołać strony lokalnej na serwerze, nie działają także statystyki MRTG. Wszystko co działa lokalnie na porcie 80, i jest wywoływane z wewnątrz sieci możemy wyłączyć ze squid'a komendą ipfwadm -I -i acc -P tcp -W eth0 -D 192.168.0.1 80 wpisaną po komendzie przekierowania wszystkich pakietów, z palca, lub w rc_squid. Bez problemu też można wpisać zewnętrzny adres naszego serwera www, wtedy nie trzeba nic przekierowywać.

 

PODZIĘKOWANIA dla grupie dyskusyjnej  trzepak.freesco, oraz osobom: Maćkowi i Olkowi

--

 © 2002 - 2003 Robert R "RaaDaaR" - Kopiowanie w całości lub części bez pozwolenia autora zabronione