Bilindiği gibi squid web sayfalarının birer kopyasının kendisine alarak cache’ler ve bu şekilde daha önceden cachelenmiş herhangi bir web sayfası bir kullanıcı tarafından ikinci bir defa görüntülenmek istendiği zaman sonuçlar kullanıcıya squid’den döndürülür. Bu şekilde ilgili web sitelerine erişim hızlanmış olacağı gibi internet trafiğini de belli bir oranda azaltmış olursunuz. Ancak squid’in kullanım alanı bunla sınırlı değildir, squid kullanarak belli domain name’lere, dosya tiplerini, ip adreslerine erişimi de engelleyebilirsiniz. Hatta regex desteği ile içerisinde belli kelimelerin geçtiği alan adlarına ya da dosya tiplerine erişimin engellenmesi gibi işlemleri gerçekleştirebilirsiniz.

Ben normalde yasaklama konularından pek hazzetmeyen biri olsam da bazen bir okul, hastane vs. gibi kuruluşların networklerinde bir erişim mekanizmasına ihtiyaç duyulması pek doğal. İşte böyle bir kurum için bir adet proxy sunucusu gerekti ve ben de çok uzun bir aradan sonra bir squid kurulumu yaptım. Bu yazıda ilgili kurulama ait notları bulabilirsiniz.

Bu yazıda transparent olarak adlandırılan ve kullanıcı tarafında herhangi bir ayar yapmaya gerek kalmaksızın http trafiğinin squid’e yönlendirilmesi sureti yapılan şeffaf proxy uygulaması anlatılacağı için trafik yönlendirme işlemi için bir adet firewall’a gereksinim bulunuyor. Aksi taktirde networkteki kullanıcıları proxy’e yönlendirmek için client bilgisayarlara kurulu olan web browserlarda proxy ayarı yapılması gerekir. Bazı yerlerde bu ayarlar -windows domain ortamı bulunması durumunda- Group Policy Object üzerinden kullanıcıların web browser ayarları düzenlenerek yapılıyor ya da domain ortamı olmaması durumunda client bilgisayarlarda tek tek ayar yapmak vs. gibi ilkel bir yol izleniyor. Her iki durumda da kullanucıların proxy ayarlarını değiştirebilmeleri söz konusu olduğundan dolayı böyle bir uygulama yapmak için kullanıcılara hiç bir şey hissettirmeden http trafiklerini proxy’e yönlendirecek bir yapı kurmak en iyi yoldur. İşte bu yönlendirme işini IPFW kullanarak yapacağız.

Ben kuruluma sıfırdan bir IPFW kurulumu yaparak başladım ve squid’i de aynı sunucu üzerinde çalıştırdım.

Önce Squid’ten başlayalım.

KURULUM

FreeBSD üzerine squid kurulumu yapmak için en iyi yol, FreeBSD ports collection’u kullanmaktır. Eğer sisteminizde ports collection yüklü değil ya da update edilmemişse öncelikle kurmanız ya d update etmeniz gerekiyor. Bu işi portsnap kullanarak yapabilirsiniz: Sistemde ports yüklü ve update durumdaysa, squid’i /usr/ports/www/squid dizininden kurabilirsiniz. Aşağıdaki gibi dizine geçin ve kurulumu yapın.

# cd /usr/ports/www/squid/

# make install clean

make install komutunu verdiğiniz zaman karşınıza Squid’in destekleyeceği özellikleri belirleyeceğiniz klasik options ekranı gelecektir. Bu kısımla ilgili uzun uzadıya yapılandırma seçeneklerinden, bahsetmeyeceğim; direk ok diyerek default kurulum işimizi görecektir.

Squid sorunsuz olarak kurulduysa, ayarlar ile illgili bölüme geçebiliriz.

YAPILANDIRMA

Squid’e ait yapılandırma dosyaları, /usr/local/etc/squid dizini altına bulunmaktadır. Bu dizinin içerisinde ana yapılandırma dosyası olan squid.conf ‘un yanı sıra authentication ve cachemanager ile ilgili yapılandırma dosyaları bulunmaktadır. Ancak ben proxy’e erişim durumlarını IPFW üzerinden kontrol altına aldığım için authentication ile ilgili herhangi bir ayar yapmadım.

Şimdi, squid’i, conf dosyasını editleyerek temel konfigurasyonu oluşturalım.

/usr/local/etc/squid/ dizininin altına bulunan bu dosyayı editlediğiniz zaman comment out edilmiş bir çok açıklama ve yapılandırma satırı göreceksiniz. Temel bir kurulum yapacağımız için açıklama kısımlarına takılmadan yapılandırma dosyasında ön tanımlı olarak bulunan yapılandırma satırları açıklama satırlarından temizleyerek daha okunaklı bir hale getirelim. Aşağıdaki komut ile ilgili dosya içerisindeki comment out edilmemiş satırları bulup ekrana yazdırabilirsiniz.

# cat /usr/local/etc/squid/squid.conf-org | sed ‘/ *#/d; /^ *$/d’

Bu komutun çıktısı squid 2.7 STABLE kurulumunda aşağıdaki gibidir.

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

acl SSL_ports port 443

acl CONNECT method CONNECT

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/logs/access.log squid

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern -i (/cgi-bin/|?) 0 0% 0

refresh_pattern . 0 20% 4320

acl shoutcast rep_header X-HTTP09-First-Line ^ICYs[0-9]

upgrade_http0.9 deny shoutcast

acl apache rep_header Server ^Apache

broken_vary_encoding allow apache

coredump_dir /usr/local/squid/cache

Squid’in ön tanımlı olarak gelen ve ayarları bu şekildedir. Şimdi dosya içerisinde kendi networkümüze göre bir düzenleme yapalım. Ama önce orjinal dosyanın bir yedeğini alarak içerisini boşaltın:

# cd /usr/local/etc/squid

# cp squid.conf squid.conf-orj

# > squid.conf

Yukarıdaki adımları takip ederek squid.conf dosyasını squid.conf-orj olarak yedekledikten ve içeriğini boşalttıktan elinizdeki boş squid.conf dosyasına aşağıdaki satırları yapıştırın.

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl all src all

acl localnet src 192.168.25.0/24

acl yasakli_domainler dstdomain “/usr/local/etc/squid/yasakli_domainler.acl”

acl yasakli_dosyaturleri urlpath_regex -i “/usr/local/etc/squid/yasakli_dosyaturleri.acl”

acl reklam url_regex “/usr/local/etc/squid/reklamlar.acl”

acl yasakli_subnetler dst “/usr/local/etc/squid/yasakli_subnetler.acl”

acl CONNECT method CONNECT

http_access allow manager localhost

http_access deny manager

http_access deny yasakli_domainler

http_access deny yasakli_dosyaturleri

http_access deny yasakli_subnetler

http_access deny reklam

http_access allow localnet

icp_access deny all

http_port 3128 transparent

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/logs/access.log squid

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

icp_port 0

coredump_dir /usr/local/squid/cache

error_directory /usr/local/etc/squid/errors/Turkish

Gördüğünüz gibi default yapılandırmada sadece küçük değişiklikler yapmış olduk; halihazırda varolan ve sonradan izim eklediğimiz satırlarla ilgili açıklamalar şöyle;

acl localnet src 192.168.25.0/24 : Bu satırda local networkün subneti belirleniyor. Kendi ip networkünüzü buraya yazmalısınız.

icp_access deny all : ICP protokolu civardaki diğer squid’lerle cachelenmiş datalar için alışverişte bulunmak üzere kullanılıyor. Ancak bizim sadece bir proxy sunucumuz olduğundan ve başka proxy’lerle irtibat kurmayacağımız için ICP isteklerini deny ediyoruz.

http_port 3128 transparent : Bu kısımda da proxy’e tcp 3128. porttan şeffaf olarak çalışmasını söylemiş oluyoruz.

icp_port 0 : ICP istekleri kabul etmeyeceğimize göre herhangi bir port dinlemeye gerek yok.

error_directory /usr/local/etc/squid/errors/Turkish : Erişimi engellenmiş materyallere erişim olması durumunda hata mesajlarının Türkçe olarak döndürülmesi için bu Türkçe error sayfalarını barındıran dizini gösteriyoruz. (Squid 3′de bu özelliğin yerine kullanıcının dil ayarlarına göre otomatik olarak o dile ait hata bildirimleri gösteriliyormuş .)

Bu temel ayarlardan sonra conf dosyasını kaydedip kapatın. Şimdi yasaklamalarla ilgili yapılacak ayarlara değinelim.

DOMAIN ENGELLEME

squid.conf dosyasının içerisinde geçen acl yasakli_domainler dstdomain “/usr/local/etc/squid/yasakli_domainler.acl” satırında belirtilen dosyayı oluşturup içerisine erişimin engellenmesini istediğiniz domain adlarını yazın. Örnek olarak msn.com alan adına erişimi engellemiş olalım.

/usr/local/etc/squid dizininde olduğunuza emin olun ve aşağıdaki komutları verin.

# touch yasakli_domainler.acl

# echo .msn.com > yasakli_domainler.acl

Şimdi, yasakli_domainler.acl isimli bir access list dosyası oluşturduk ve içine .msn.com şeklinde msn.com ile ilgili alan adlarını belirtmiş olduk.

squid.conf dosyasında bulunan, acl yasakli_domainler dstdomain “/usr/local/etc/squid/yasakli_domainler.acl” satırı engellenecek domainlerini listesini oluşturduğumuz bu dosyadan okuyacak ve herhangi bir kullanıcının bu sitelere erişmesi durumunda gene conf dosyasında geçen http_access deny yasakli_domainler
satırından hareketle erişime izin vermeyecektir.

DOSYA TİPİ ENGELLEME

Alan adlarına uygulanan erişim yasağı gibi dosya tiplerine de erişim yasağı getirebilirsiniz. Örneğin .exe uzantılı çalıştırılabilir dosyalara koyabilirsiniz. Böylece uzantısı .exe olan hiç bir dosya internetten download edilemeyecektir. Yapılandırma mantığı gene aynı; dosyayı oluşturun ve örnek olarak .exe, .zip, ve .mp3 dosyalarına engel koyun.

# touch yasakli_dosyaturleri.acl

# echo ‘.(exe)$’ >> yasakli_dosyaturleri.acl

# echo ‘.(zip)$’ >> yasakli_dosyaturleri.acl

# echo ‘.(mp3)$’ >> yasakli_dosyaturleri.acl

Not: dosya türlerini belirtirken regex kullanıldığı için tırnakişretlerine vs. dikkat edilmesi gerekir.

Aynı mantıkla squid.conf dosyasında belirtilen acl ve http_access deny satırları bu dosyaların indirilmesine izin vermeyecektir.

REGEX İLE CONTENT ENGELLEME

Dosya tiplerinde de görüldüğü gibi kural squid regex patternlerini algılayabiliyor; dolayısı ile bir alan adı içerisinde geçen kelimeleri tespit edip engelleme koymak da mümkün. Bu örnekte, yararlandığım kaynakta da anlatıldığı şekilde reklam ile ilgili kelimelerin geçtiği domainlerden veri alışverişine engel koyalım.

# touch reklamlar.acl

# echo ‘/adv/.*.gif$’ > reklamlar.acl

# echo ‘/[Aa]ds/.*.gif$’ >> reklamlar.acl

# echo ‘/[Aa]d[Ss]erver’ >> reklamlar.acl

# echo ‘/[Aa][Dd]/.*.[GgJj][IiPp][FfGg]$’ >> reklamlar.acl

# echo ‘/[Bb]annerads/’ >> reklamlar.acl

Aynı mantıkla regex patternleri kullanılarak her konudaki erişim engellemesi için kullanılabilir. Bu örneklerden yola çıkarak ve aşağıda verilen kaynak linklerinden yararlanarak kendi regex kelimelerinizi oluşturabilirsiniz.

IP SUBNETLERINE ERİŞİM ENGELLEME

Gerçi ip bazlı engellemeler için IPFW kullanmak daha mantıklı olsa da Squid’in de bu işi yapabildiğinden dolayı bu konu ile ilgili de bir örnek vermek yerinde olur. Zira conf dosyasında da ilgili satırları girmiştik.

Aşağıdaki komutlar ile 65.54.152.0/24 ip netwörküne doğru yapılacak erişim istekleri engellenecektir.

# touch yasakli_subnetler.acl

# echo 65.54.152.0/24 >> yasakli_subnetler.acl

Squid’in yapılandırılması ile ilgili temel ayarlar bu kadardı. Bundan sonraki adım squid’in çalıştırılması ve test edilmesi ve genel geçer squid komutlarından ibaret. Sonrasında da temel bir ipfirewall kural seti ile yönlendirme işlerini yapacağız.

SQUID’in BAŞLATILMASI

Squid’i çalıştırmadan önce, web sayfalarının cache’leneceği dizinlerin oluşturulması için bir seferlik aşağıdaki komutu çalıştırmanız gerekmektedir.

# squid -z

Bu komut /usr/local/squid/cache dizini altında cache dizinlerini oluşturacak ve sisteminiz çalıştırılmaya hazır hale gelecektir.

Squid’in kurulum sırasında gelen rc.d tipi bir startup scripti bulunuyor. /usr/local/etc/rc.d dizini altında squid ismi ile bulunan bu dosya sistemin açılışı sırasında squid’in otomatik olarak başlatılmasını sağlıyor. Bu nedenle /etc/rc.conf dosyasında belirterek FreeBSD’nin açılışta bu scripti çalıştırılmasını söylemelisiniz:

# echo ‘squid_enable=”YES”‘ >> /etc/rc.conf

Böylece sistem açılışında squid otomatik olarak çalıştırılacaktır. Şimdi aynı scripti kullanarak squid’i manuel olarak çalıştırın.

# sh /usr/local/etc/rc.d/squid start

Bu komutu verdikten sonra herhangi bir hata ile karşılaşmadıysanız squid çalışıyor demektir. Kontrol etmek için ps ile sürecin durumuna bakın.

# ps -aux |grep squid

squid 2814 0.0 0.2 5396 2240 ?? Is 7:30PM 0:00.00 /usr/local/sbin/squid -D

squid 2816 0.0 0.6 11540 6128 ?? S 7:30PM 0:00.06 (squid) -D (squid)

squid 2817 0.0 0.1 1352 652 ?? Is 7:30PM 0:00.00 (unlinkd) (unlinkd)

Normal şartlarda komutun çıktısı yukarıdaki gibi olmalıdır.

Squid’in log dosyaları /usr/local/squid/logs dizini altında bulunmaktadır. Bu dizin içerisinde aşağıdaki dosyalar bulunmaktadır.

access.log – Erişim durumları ile ilgili bilgiler burada bulunur.

cache.log – Sunucunun genel durumu ile ilgili bilgiler tutulur.

squid.pid – Squid’in süreç numarası bu dosyada tutulur.

store.log– Cache’lenen data ile ilgili bilgi burada bulunur.

SQUID KOMUTLARI

squid -help komutu ile ulaşabileceğiniz komutlardan önemli bazıları şu şekilde:

squid -k
reconfigure
: Squid.conf dosyasında herhangi bir değişiklik yaptıktan sonra bu komut ile değişikliklerin aktif olmasını sağlayabiirsiniz.

squid -k
rotate
: Log dosyaları çok şişip de diskte yer işgal etmesin diye böyle güzel bir özellik mevcut. Bu komut logların backuplarını aldıktan sonra içeriğini boşaltmaktadır. Komutu aşağıdaki şekilde crona ekleyerek her gece 00:00′da çalıştırılmasını sağlayabilirsiniz.

0 0 * * * /usr/local/sbin/squid -k rotate

Diğer komutlar için bkz: squid -help

SQUID’in TEST EDİLMESİ

Yapılandırma ve genel geçer komutlar bu kadardı. Eğer squid’i sorunsuz bir şekilde çalıştırdıysanız manuel bir test yapmak yerinde olacaktır. Kullandığınız web taratıcısının proxy ayarlarına, squid’in ip’sini ve 3128 olan port numarasını girerek web sitelerinde gezinin. Aynı zaman da /usr/local/squid/logs dizini altında ki access.log’u takip edin. Yasaklı siteleri görüntülemeye çalışın. Herşey yolunda gittiyse yasakli sitelere giremeyecek aktivitelerle ilgili logları access.log dosyasında bulabileceksiniz.

Squid sorunsuz çalışıyorsa şimdiki adım IPFW kullanarak http isteklerini squid’e yönlendirerek transparan proxy uygulamasını devreye almak.

IPFIREWALL

Sisteminizde IPFW devrede değilse aktif hale getirmeniz gerekiyor.

Sisteminizde herhangi bir kural girilmemiş bir IPFW olduğunu düşünerek konuya devam edelim. Yazının başından beri bahsettiğim gibi transparan proxy uygulaması için yapmamaız gereken tek şey, lokal networkünüzden çıkan ve hedef portu 80 olan tüm istekleri squid’in dinlediği 3128 no’lu porta göndermektir.

İşte yönlendirme için gereken kural dizini şöyle bir şey; ayrıca ikinci satırda da düzgün test yapabilmek için şimdilik herşeye izin verelim.

ipfw -q add 00500 fwd 127.0.0.1,3128 tcp from any to any 80 in via fxp1 keep-state

ipfw -q add 00900 allow all from any to any

Bu örnek kural cümlesinde fxp1 olarak geçen ibare benim firewall’umun local networke bakan ethernetinin adı. Dolayısı ile bunu kendi ethernet adınızla değiştirmeniz gerekiyor. İkinci kural cümlesi de gördüğünüz üzere her tür erişim için izin veriyor. Bu durumda yaptığımız tek şey fxp1 isimli interface’e içeriden gelen ve hedef portu 80 olan tüm istekleri localhost’un 3128. satırına iletilmesini söylemek ve geri kalan herşeye izin vermek. Bu şekilde httpd trafiği squid’e yönlendirilmiş oluyor.

Şimdi, test yapabilmek için lokal networkteki client bilgisayarlardan birinin gateway’ini yeni kurduğunuz firewall olarak set edin ve daha önceden herhangi bir proxy ayarı yaptıysanız web tarayıcısından bu ayarı kaldırın ve biraz surf yapım. Herşey yolunda gittiyse proxy üzerinde uyguladığımız erişim engellemelerinin çalışması ve örneğin www.msn.com adresine girememeniz gerekir.

Bundan sonra firewall kurallarınızı kendinize göre düzenleyebilir. Default olarak herşeyi deny ettikten sonra açmak istediğiniz portlara ilişkin ipfw kural cümlelerini sisteminize girebilirsiniz. Bu konuda herhangi sorununuz varsa biraz önce verdiğim IPFW kurulum döküman linkine bakabilirsiniz.

Hepsi bu kadar.

Transparan proxy’niz hayırlı olsun.

 

Yazar: Osman BAGISLANAN
Http://www.mslinuxtr.com/yazarlar


(1072)

the author

Netaş Aş. de Sistem Yöneticisi olarak çalışmaktayım. 2001 den bu yana BT sektöründeyim. Bu zamanın büyük bir kısmında Sistem Entegratörlüğü yapan Bilişim firmalarında proje ve sistem kurulum departmanlarında çalıştım. Birçok firmada Microsoft ürünleriyle ilgili sistem kurulum projelerinde bulundum. 2012 den bu yana kendi bloğum olan MSLİNUXTR de deneyimlerimi sizinle paylaşıyorum. Ayrıca 2013 başlarından bu yana da MSHOWTO ailesinin bir üyesiyim.

1 Readers Commented

Join discussion
  1. Kasım on 24 Mart 2014

    Merhabalar Osman Bey,
    Squid konusunda yazdıklarınızı aklımın aldığı kadarıyla inceledim.
    Ancak yine de beceremedim.
    Satın aldığım bir vps de ubuntu işletim sistemi kurulu.
    Ben buna squid yükledim.
    Web proxy olarak kullanmak istiyordum
    Ama bi türlü istediğim ip lere paylaşım veremedim.
    Proxy paylaşmak istediğim bilgisayarlar farklı şehirlerde.
    Squid.conf u nasıl konfügüre etmeliyim ?
    Teşekkür ederim.

Bir Cevap Yazın