Audio és video blokkolása Squid-del

Az adott feladat: egy cégen belül blokkoljunk minden audio (pl. netrádió, mp3) és videó (flash és hagyományos) forgalmat, mert 1) tessék dolgozni 2) kicsi a sávszélesség. Tehát mit tehet itt egy ló?

Követelmények:

  • működjön
  • klienseket ne kelljen átkonfigurálni
  • ne kelljen kernelt fordítani
  • lehetőleg ne kelljen semmit fordítani
  • lehetőleg ne kelljen semmit kívülről telepíteni
  • cache-elni egyelőre nem akarunk

A cégnél van egy tűzfal (CentOS) beállított csomagszűréssel. Sajnos mivel ez tartalomszűrésre soványka, valami proxy kellene, ami okosan tudja lepattintani a nem megfelelő kéréseket. Szerencsére CentOS-ban van egy Squid nevű alkalmazás, ami erre (is) való. Ezt a címben már el is spoilerkedtem, úgyhogy haladjunk.

Adatok: squid a 3128-as default porton fog futni. Kliensek eth0 felől vannak, IP tartományuk: 172.16.0.0/16. Cég saját ip-tartománya az 1.2.3.0/24, erre nem akarunk proxy-t.

Böngészőket nem akarjuk piszkálni, úgyhogy transzparens proxy-t akarunk. Ehhez kell módosítani a tűzfalon ezt-azt.

Engedjük, hogy egyáltalán kapcsolódhassanak a proxy-nkhoz:


#> iptables -I INPUT  _megfelelo_hely_ -i eth0 -s 172.16.0.0/16 -p tcp --dport 3128 -j ACCEPT
#> iptables -I OUTPUT _megfelelo_hely_ -o eth0 -d 172.16.0.0/16 -p tcp --sport 3128 -j ACCEPT

80-as portot elkapjuk, és beletoljuk squid-be:


#> iptables -t nat -I PREROUTING _megfelelo_hely_ -i eth0  -p tcp -d ! 1.2.3.0/24 --dport 80 -j REDIRECT --to-port 3128

CentOS-on, ha használjuk az iptables service-t, akkor mentjük a beállítást (vagy más módon rögzítjük):


#> service iptables save

Ha eddig mindent jól csináltunk, akkor most garantáltan nem tudnak a felhasználók netezni, mert a squid még nem fut. Vagy ha fut is, nincs bekonfigolva. Akkor most vagy siessünk, vagy inkább először a squid-et állítsuk be.

A következő belállításokat blokkokba szerveztem, mindegyiket a saját helyére kell pakolni a konfigfájlban.

Mindenekelőtt ugye a transzparens proxy beállításai:

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

ACL-ek. Figyeljük a potenciális klienseket (CLIENTS), a válaszként kapott tartalom típusát (av_rep), az esetleg letöltendő filenév kiterjesztését (av_cd), a kérés típusát (audio, video) és a kérés URL-jét (audio_url, video_url). Az av_rep nagyon fontos, hiszen sokszor csak a válaszból derül ki, mit is töltene a felhasználó. Vedd észre, hogy az av_rep esetén rep_mime_type, a többi esetben req_mime_type a kulcsszó.


acl CLIENTS src 172.16.0.0/255.255.0.0

acl av_rep rep_mime_type -i ^application/(x-)?streamingmedia$
acl av_rep rep_mime_type -i ^video/
acl av_rep rep_mime_type -i ^audio/
acl av_rep rep_mime_type -i ^application/(x-)?pncmd$
acl av_rep rep_mime_type -i ^application/(x-)?ogg$
acl av_rep rep_mime_type -i ^application/vnd.ms.wms-hdr.asfv1$
acl av_rep rep_mime_type -i ^application/x-mms-framed$
acl av_rep rep_mime_type -i ^(application|text|image)/vnd\.rn-

acl av_cd rep_header Content-Disposition -i \.(asx|asf|flv|wmv|mpeg|mpg|mov)
acl av_cd rep_header Content-Disposition -i \.(mp3|ram|rm|ogg)

acl video req_mime_type -i ^application/(x-)?streamingmedia$
acl video req_mime_type -i ^video/

acl video_url url_regex -i \.(asx|asf|wmv|mpeg|mpg|mov|flv|avi)$
acl video_url url_regex -i /video/

acl audio req_mime_type -i ^audio/
acl audio req_mime_type -i ^application/(x-)?pncmd$
acl audio req_mime_type -i ^application/(x-)?ogg$
acl audio req_mime_type -i ^application/vnd.ms.wms-hdr.asfv1$
acl audio req_mime_type -i ^application/x-mms-framed$
acl audio req_mime_type -i ^(application|text|image)/vnd\.rn-

acl audio_url url_regex /SmpDsBhgRl
acl audio_url url_regex -i \.(mp3|m3u|ram|rm|ogg)$

A kérésekeket szabályozzuk a fenti ACL-ekkel. Nyilván a tartalom tiltása a kiensek beengedése elé kell kerüljön, mindez pedig a deny all elé:


http_access deny video
http_access deny audio
http_access deny video_url
http_access deny audio_url

http_access allow CLIENTS
#...http_access deny all

Szabályozzuk a lehetséges válaszokat is, ezt külön kell (http_reply_access allow all elé, ha van olyan):


http_reply_access deny av_rep
http_reply_access deny av_cd

Cache: azt beszéltük, hogy nem kell (pl. mert nincs tárhely, erőforrás)


cache_dir null /null

Ha megvolt, mehet a squid:


service squid condrestart

A fennt használt ACL-ek persze nem kőbe vésettek, mindenki variálhatja saját igényeinek megfelelően.

Egyelőre úgy néz ki, itt működik.

Kiegészítés: nem részleteztem, csak említettem, hogy ezen kívül már működött egy szigorúan beállított netfilter tűzfal. Mágikus portokra kapcsolódó stream-elgetés tehát eleve kizárt.

Kiegészítés 2: beraktam URL szűrést *.flv-re és *.avi-ra, mert egyes oldalak nem vacakolnak a Content-Type mezővel.

Kiegészítés 3: application/vnd.ms.wms-hdr.asfv1 és application/x-mms-framed, valamint mime regexpekhez -i kapcsoló (doksi nem írja, de squid megeszi)

Kiegészítés 4: új MIME-k, Content-Disposition, regexp-ek tömörítése.

Hozzászólások

Köszi, jól jön ez az írás!

-- pgergely --

Ha tenyleg arra mentek, hogy dogozzanak a dogozok, akkor

ifconfig eth0 down

ASK Me No Questions, I'll Tell You No Lies

nem vagyok verprofi, de nem jobb lenne ha forditva csinalnad?
ersd: felsorolni amit lehet, html php cgi stb
mert pl: van olyan webserver ami "unknown" nak nezi pl az mp3 at, vagy a rpm-t (red hat pkg manager) -t real audio nak

Attól tartok, túl sok problémát vetne fel a felhasználók felé, hogy hirtelen nem tudnak bizonyos dolgokat letölteni, ami nekem nem jutott az eszembe. Időt pedig keveset tudok áldozni erre a gépre, mert nem kifizetődő (külsősként tartjuk karban).

A lényeg, hogy elérjék a netet, de ne tudják a sávot foglalni alapvetően "csúnya" dolgokkal.

Nekem erőteljesen úgy tűnik hogy ezen szabályok mellett még a youtube és tsai simán elmennek. :(

Nem tudom mi lehet a hiba, nekem ez van az access.log-ban:


1181643088.725    500 192.168.111.1 TCP_DENIED/403 1424 
 GET http://youtube-371.vo.llnwd.net/d1/00/60/NVOFmu2ZIqI.flv -
 DIRECT/87.248.217.84 text/html

Itt úgy látszik, az URL-re vonatkozó szabály fogta meg.

Szerk.: de nem az, mert *.flv re nincs szabály. Az av_rep állítja meg, tehát a válasz szűréséhez kell támogatás a squid-be a Te esetedben.

Az ilyen hasznos okosságokat miért nem cuppantod rögtön a Wiki-be? S utána itt, vagy akárhol megemlíted (linkkel, nyilván) hogy van ilyen új cikk, s Te szerezted...