Administratorzy też mają poczucie humoru ;-)

Może czasami specyficzne, ale mają ;-) już niedługo Prima Aprilis i gdyby ktoś z Was jeszcze nie miał pomysłu jak zdener^H^H^H^H^H^H wkręcić swoich użytkowników, to polecam stary i sprawdzony numer z transparentnym proxy i odwracaniem obrazków/zdjęc na stronach WWW.

Co nam się przyda?

  • squid
  • lighttpd
  • perl
  • imagemagick
  • iptables
  • ofiar(a/y) ;-)

Co i jak będziemy psuć?

Jeśli posiadasz już squid'a w swojej sieci i Twoi użytkownicy korzystają z niego to jesteś w połowie drogi, jeśli nie, to czeka Cię instalacja i konfiguracja. Ja wykorzystuję w przykładzie dwa komputery, pierwszy to firewall (Ubuntu) który robi NAT, oraz laptopa na którym zainstalowałem squid'a oraz lighttpd (Debian).

Instalujemy squid'a i lighttpd:

# apt-get install squid lighttpd

Konfigurujemy Squid'a:

# cat /etc/squid/squid.conf
http_port 8080 transparent

acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 192.168.0.0/16
acl Safe_ports port 80
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT
http_access allow localnet
http_access allow localhost
http_access deny all

cache_effective_user www-data
cache_effective_group www-data

url_rewrite_program /usr/local/bin/joke.pl
access_log /var/log/squid/access.log squid

hosts_file /etc/hosts
coredump_dir /var/spool/squid

Parametr localnet, określa adresację Twojej sieci, w razie potrzeby popraw ją.

Konfiguracja lighttpd:

server.modules = (
"mod_access",
"mod_accesslog",
"mod_alias",
"mod_redirect",
)

server.document-root        = "/var/www/joke/"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
accesslog.filename          = "/var/log/lighttpd/access.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"

index-file.names            = ( "index.php", "index.html",
"index.htm", "default.htm", " index.lighttpd.html" )

url.access-deny             = ( "~", ".inc" )

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

dir-listing.encoding        = "utf-8"
server.dir-listing          = "disable"

Odwrócone pliki będą podawane z katalogu /var/www/joke/, ale może to być dowolny katalog na dysku, ważne, żeby squid miał tam prawo do zapisu, a lighttpd do odczytu. Jeśli posiadasz już jakiś inny serwer WWW też jest dobrze, wystarczy, że stworzysz jakiś VHOST, najważniejsze, żebyś miał dostęp do tego katalogu przez WWW. Poza tym obie konfiguracje są raczej minimalne dla tych usług, w squidzie ciekawostką może być linia:

url_rewrite_program /usr/local/bin/joke.pl

jest to ścieżka do skryptu który przetwarza zapytania od użytkowników, url_rewrite_program działa tak, że każde żądanie (url) jest przepuszczany przez skrypt na który wskazuje (joke.pl), skrypt wyłapuje pliki graficzne (jpg, png, gif), wykorzystując wyrażenie regularne i pobiera je używając wget'a, następnie przerabia (odwraca) wykorzystując mogrify i zapisuje na dysku do katalogu /var/www/joke/, przy okazji podmieniając link, tak by kierował squid'a do lokalnego serwera WWW (lighttpd). Spójrzmy jak wygląda nasz skrypt:

Gdybyś miał problemy z uruchomieniem squid'a sprawdź czy posiada uprawnienia do katalogów z logami /var/log/squid/ oraz do katalogu z cache'm (u mnie to /var/spool/squid). Całość da się zrobić na wiele sposobów, wszystko zależy od Twojej pomysłowości, ja poszedłem na skróty i wykorzystałem zewnętrzne narzędzia (wget, mogrify). ;-P

Mieszamy pakietami

Przejdźmy teraz do konfiguracji sieciowej, wykorzystajmy właściwości transparent proxy, czyli złapiemy ruch ruch od użytkowników i wpuścimy go po cichu do naszego serwera proxy (squid'a). Konfiguracja będzie zależała od tego czy masz na jednej maszynie firewall oraz squida + lighttpd, czy na dwóch różnych, w moim przypadku są to dwa różne, więc na firewall'u muszę złapać pakiety wychodzące do portu 80 i przekierować je do serwera ze squidem na port 8080. Wykorzystam iptables oraz SNAT i DNAT.

# iptables -t nat -A PREROUTING -s ! adres_komputera_ze_squidem -p tcp -m tcp --dport 80 -j DNAT --to-destination adres_komputera_ze_squidem:8080
# iptables -t nat -A POSTROUTING -s adresacja_sieci_lokalnej/maska -d adres_komputera_ze_squidem -j SNAT --to adres_komputera_ze_squidem

W moim przypadku, squid i lighttpd mają adres IP 192.168.1.237, a firewall 192.168.1.254, konfiguracja wygląda tak:

# iptables -t nat -A PREROUTING -s ! 192.168.1.237 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.237:8080
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.237 -j SNAT --to 192.168.1.254

Pierwsza reguła odpowiada za przekierowanie ruchu wszystkich hostów z wyjątkiem naszego serwera ze squid'em (inaczej byłoby zapętlenie), druga robi NAT'a, dbając o to, żeby pakiety powrotne do użytkownika wracały z adresem firewalla a nie squida (użytkownik i squid są w jednej sieci lokalnej, bez NAT'a squid odpowiedziałby bezpośrednio użytkownikowi).

W przypadku kiedy masz do dyspozycji tylko jeden serwer (firewall/router) i uruchamiasz na nim squid + lighttpd, wystarczy tylko jedna reguła iptables:

# iptables -D PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

Gdybyś chciał zawęzić cały dowcip tylko jednej strony to możesz dodać parametr -d (destination) do iptables i podać konkretny IP.

squid.conf, lighttpd.conf oraz skrypt joke.pl, są do pobrania stąd.

Jeśli wszystko poszło zgodnie z planem, wykonajmy mały test, www.blip.pl:

pogoda.interia.pl:

Udanego wkręcania ;-) co złego to nie ja ;p~