İçeriğe geç

Squid Proxy Kurulumu Ve Yapılandırma

14 dk okuma

Bir ağ ortamında kullanıcıların internet erişimini kontrol etmek, loglamak ve optimize etmek, modern sistem yönetiminin temel gereksinimlerinden biridir. Squid Proxy, özellikle HTTP tabanlı web trafiğinin yönetimi, erişim kontrolü, loglama ve önbellekleme ihtiyaçları için kullanılan olgun ve açık kaynak bir proxy sunucusudur.

Bu rehberde Squid Proxy kurulumu ve temel yapılandırmasından, kullanıcı kimlik doğrulamasına, ACL ve içerik filtrelemeden önbellekleme, transparent proxy ve HTTPS trafiğinin SSL Bump ile incelenmesine kadar birçok konuyu adım adım ele alacağız.

Squid Proxy Nedir ve Neden Kullanılır?

Squid, temel olarak HTTP tabanlı web trafiği için kullanılan yüksek performanslı bir proxy ve caching sunucusudur. Modern Squid sürümleri HTTPS bağlantılarının proxy üzerinden geçirilmesini, erişim kontrolünü, loglamayı ve uygun koşullarda önbellekleme işlemlerini destekler.

Squid özellikle forward proxy olarak kurumsal ve yerel ağlarda istemcilerin internet erişimini kontrol etmek için kullanılır. İstemciler doğrudan internete çıkmak yerine Squid sunucusuna bağlanır ve web istekleri Squid üzerinden dış ağa iletilir.

Squid'in yaygın kullanım alanları şunlardır:

  • İnternet erişim kontrolü

  • Web trafiğinin loglanması

  • Domain ve URL tabanlı erişim kontrolü

  • Proxy üzerinden kullanıcı kimlik doğrulaması

  • Uygun içeriklerin önbelleğe alınması

  • Bant genişliği kullanımının optimize edilmesi

  • Kurumsal ağlarda web erişim politikalarının uygulanması

Squid ayrıca reverse proxy senaryolarında da kullanılabilir. Ancak modern web uygulamalarında reverse proxy ve load balancing amacıyla Nginx, HAProxy veya benzeri çözümler daha yaygın tercih edilmektedir.

Kurulum ve Temel Yapılandırma

Squid, birçok Linux dağıtımının paket yöneticisi üzerinden kurulabilir. Ubuntu ve Debian tabanlı sistemlerde apt kullanabilirsiniz:

sudo apt update
sudo apt install squid apache2-utils -y

apache2-utils paketi, Basic Authentication için kullanabileceğimiz htpasswd aracını sağlar.

Kurulum tamamlandıktan sonra Squid yapılandırma dosyası genellikle /etc/squid/squid.conf konumunda bulunur. Değişiklik yapmadan önce mevcut dosyanın yedeğini almak iyi bir uygulamadır:

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.backup
sudo nano /etc/squid/squid.conf

Squid yapılandırmasında en önemli konulardan biri ACL (Access Control List) kurallarıdır. ACL'ler istemci IP'si, hedef domain, URL ve kimlik doğrulama gibi çeşitli kriterlere göre erişim kontrolü yapılmasını sağlar.

Squid'in erişim kuralları sıralı olarak değerlendirilir. Bu nedenle genel bir http_access deny all kuralı genellikle erişim izinlerinden sonra, yapılandırmanın sonunda bulunmalıdır.

Örneğin yalnızca belirli yerel ağların proxy kullanmasına izin vermek için:

http_port 3128

acl local_net src 10.10.10.0/24
acl local_net src 192.168.1.0/24

http_access allow local_net
http_access deny all

Burada local_net adlı ACL ile iki farklı özel ağ tanımlanmıştır. Bu ağlardan gelen istemcilere proxy erişimi verilirken diğer istemciler reddedilir.

Güvenlik açısından, internete açık bir Squid proxy sunucusunda herkese erişim izni vermekten kaçınmalısınız. Aksi halde sunucunuz açık proxy olarak kullanılabilir ve kötüye kullanılabilir.

Kullanıcı Kimlik Doğrulaması (Authentication)

Proxy kullanımını kullanıcı bazında kontrol etmek ve loglarda istemcileri daha anlamlı şekilde takip etmek için kimlik doğrulaması kullanılabilir. Squid farklı authentication yöntemlerini destekler. Basit kurulumlarda Basic Authentication yöntemlerinden biri olarak NCSA parola dosyası kullanılabilir.

Öncelikle kullanıcı parola dosyasını oluşturun:

sudo htpasswd -c /etc/squid/passwords kullanici1

-c parametresi yeni bir parola dosyası oluşturur. Bu nedenle yalnızca ilk kullanıcı eklenirken kullanılmalıdır. Diğer kullanıcıları eklerken -c parametresini kullanmayın:

sudo htpasswd /etc/squid/passwords kullanici2
sudo htpasswd /etc/squid/passwords kullanici3

Daha sonra squid.conf dosyasına authentication ayarlarını ekleyin:

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm "Kurumsal Proxy - Giris Yapin"
auth_param basic credentialsttl 2 hours

acl authenticated proxy_auth REQUIRED

http_access allow authenticated local_net
http_access deny all

basic_ncsa_auth, NCSA formatındaki kullanıcı parola dosyasını kullanarak kimlik doğrulaması yapar. credentialsttl ise başarılı kimlik bilgilerinin yeniden doğrulama gerektirmeden kullanılabileceği süreyi belirler.

proxy_auth REQUIRED ACL'si, kimlik doğrulaması başarılı olan kullanıcıları eşleştirir.

Not: Basic Authentication kullanıcı adı ve parolayı HTTP seviyesinde iletir. Bu nedenle güvenli bir ağ tasarımında proxy ile istemci arasındaki bağlantının ve ağ ortamının güvenliği ayrıca değerlendirilmelidir. HTTPS proxy bağlantılarında kullanılan yöntem ile SSL Bump yapılandırması birbirinden farklı konulardır.

İçerik Filtreleme: Blacklist ve Whitelist

Squid'in ACL sistemi sayesinde belirli domain'leri engellemek veya yalnızca belirli domain'lere erişime izin vermek mümkündür.

Blacklist yaklaşımında belirli siteler engellenirken diğer sitelere erişime izin verilir.

Örneğin /etc/squid/blocked_sites.txt dosyasına:

.facebook.com
.instagram.com
.twitter.com
.tiktok.com
.netflix.com
.youtube.com

Daha sonra bu dosyayı Squid yapılandırmasına ekleyebilirsiniz:

acl blocked_sites dstdomain "/etc/squid/blocked_sites.txt"
http_access deny blocked_sites

Domain başındaki nokta, ilgili domain ve alt domainleri eşleştirmek için kullanılabilir.

Whitelist Kullanımı

Whitelist yaklaşımında ise yalnızca izin verilen domainlere erişim sağlanır ve diğer erişimler engellenir. Bu yöntem kontrollü ofis, laboratuvar veya kiosk ortamlarında kullanışlı olabilir.

acl allowed_sites dstdomain "/etc/squid/allowed_sites.txt"
acl local_net src 10.10.10.0/24

http_access allow local_net allowed_sites
http_access deny all

Örneğin whitelist dosyası:

.google.com
.microsoft.com
.github.com
.stackoverflow.com
.kde.org

Bu yapılandırmada yerel ağdaki istemcilerin yalnızca listede bulunan domainlere erişmesine izin verilir.

URL Regex ile Filtreleme

Bazı senaryolarda URL içerisinde belirli ifadelerin aranması gerekebilir. Bunun için regex tabanlı ACL kullanılabilir:

acl bad_words url_regex -i "/etc/squid/bad_words.txt"
http_access deny bad_words

/etc/squid/bad_words.txt dosyasına engellenmesini istediğiniz kelime veya regex ifadelerini ekleyebilirsiniz:

download
torrent

HTTPS trafiğinin içeriği normal proxy modunda şifreli olduğundan, URL'nin tamamına yönelik filtreleme HTTPS bağlantılarında her zaman mümkün değildir. HTTPS içeriğini incelemek için SSL Bump gibi ek mekanizmalar gerekir.

Önbellekleme (Caching) Yapılandırması

Squid'in önemli özelliklerinden biri caching yani önbelleklemedir. Önbellekleme uygun HTTP içeriklerinin yerel diskte saklanmasını ve tekrar istenmesi durumunda doğrudan cache üzerinden sunulabilmesini sağlar.

Ancak modern HTTPS trafiğinin büyük bölümü şifreli olduğu için Squid'in önbellekleme avantajı içerik türüne, HTTP cache kurallarına ve uygulamanın cache-control politikalarına bağlıdır. Her HTTPS içeriği otomatik olarak önbelleğe alınmaz.

Önbellek için kullanılabilecek bazı temel ayarlar:

cache_dir ufs /var/spool/squid 2000 16 256
maximum_object_size 100 MB
cache_mem 512 MB
cache_swap_low 90
cache_swap_high 95

cache_dir, disk tabanlı cache alanını yapılandırır. ufs kullanılan depolama yöntemini belirtir. /var/spool/squid cache dizinidir.

2000 değeri cache için ayrılan disk alanını MB cinsinden belirtir. 16 ve 256 ise cache dizin yapısındaki birinci ve ikinci seviye dizin sayılarını belirtir.

maximum_object_size, cache'e alınabilecek nesnelerin maksimum boyutunu belirler.

cache_mem, Squid'in bellek kullanımını kontrol eden önemli parametrelerden biridir; ancak bu değer doğrudan "yalnızca cache nesneleri için ayrılmış RAM" olarak düşünülmemelidir. Squid'in toplam bellek ihtiyacı yapılandırmaya ve trafik miktarına göre değişebilir.

cache_swap_low ve cache_swap_high ise disk cache kullanım seviyesine göre cache temizleme davranışının kontrol edilmesine yardımcı olur.

Cache dizinini ilk kez oluşturduktan veya cache yapısını değiştirdikten sonra aşağıdaki komut kullanılabilir:

sudo squid -z

Ardından Squid servisini yeniden başlatmadan önce yapılandırmayı kontrol edin:

sudo squid -k parse

Şeffaf Proxy (Transparent Proxy) Kurulumu

Transparent Proxy, istemcilerin tarayıcılarında manuel proxy ayarı yapmasına gerek kalmadan belirli trafiğin ağ geçidi üzerinden Squid'e yönlendirilmesini sağlar.

HTTP trafiğini intercept modunda almak için örneğin:

http_port 3128 intercept

Ardından ağ geçidinde veya Linux router üzerinde HTTP trafiğini Squid'e yönlendiren bir NAT kuralı oluşturulabilir:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Buradaki eth0, istemci trafiğinin geldiği LAN arayüzünü temsil eder. Gerçek arayüz adını sisteminizin ağ yapılandırmasına göre değiştirmelisiniz.

Bu örnek yalnızca HTTP (TCP/80) trafiği için geçerlidir. HTTPS trafiğinin içeriği şifreli olduğundan normal intercept proxy ile doğrudan okunamaz veya URL içeriğine göre filtrelenemez.

HTTPS trafiğinin içeriğini incelemek için SSL Bump gibi TLS interception yöntemleri gerekir.

Transparent proxy kullanımında ayrıca istemci bazlı kimlik doğrulama, istemci trafiğinin ağ geçidinden geçiş şekli ve gerçek istemci IP bilgilerinin korunması dikkatle planlanmalıdır.

SSL Bump ile HTTPS Trafiği İnceleme

HTTPS trafiği TLS ile şifrelendiği için standart proxy modunda Squid, HTTP içeriğinin tamamını göremez. SSL Bump, Squid'in istemci ile hedef sunucu arasına TLS interception proxy olarak girmesine olanak sağlar.

Bu yöntem teknik olarak bir MITM (Man-in-the-Middle) mekanizmasıdır. Bu nedenle yalnızca yönetilen ve kullanıcıların bilgilendirildiği sistemlerde, gerekli yasal ve kurumsal gereksinimler dikkate alınarak kullanılmalıdır.

SSL Bump kullanılacak istemcilerin Squid tarafından oluşturulan CA sertifikasına güvenmesi gerekir. Öncelikle bir özel CA oluşturabilirsiniz:

sudo openssl req -new -newkey rsa:2048 -sha256 -days 3650 -nodes \
  -x509 \
  -keyout /etc/squid/squid-ca-key.pem \
  -out /etc/squid/squid-ca-cert.pem \
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Kurum/CN=Proxy CA"

Ardından ilgili Squid sürümünün SSL Bump gereksinimlerine uygun şekilde squid.conf yapılandırılmalıdır.

https_port 3129 intercept ssl-bump \
  cert=/etc/squid/squid-ca-cert.pem \
  key=/etc/squid/squid-ca-key.pem

acl step1 at_step SslBump1

ssl_bump peek step1
ssl_bump bump all

ssl_bump peek, TLS bağlantısının ilk aşamasında gerekli bilgilerin incelenmesini sağlar. ssl_bump bump all ise bağlantıların interception işlemine tabi tutulmasını sağlar.

Ancak gerçek bir üretim ortamında tüm HTTPS trafiğini otomatik olarak bump etmek önerilmez. Bankacılık, sağlık, kişisel veri ve benzeri hassas servisler için uygun bypass politikaları oluşturulmalıdır.

SSL Bump İstisnaları

Belirli domainleri SSL interception dışında bırakmak için ACL kullanılabilir. Örneğin:

acl no_bump_sites dstdomain "/etc/squid/no_bump_sites.txt"

ssl_bump peek step1
ssl_bump splice no_bump_sites
ssl_bump bump all

Buradaki splice, Squid'in ilgili TLS bağlantısını içerik interception yapmadan geçirmesine olanak sağlar.

Önemli: SSL Bump yapılandırması Squid sürümüne, kullanılan OpenSSL sürümüne ve Squid'in derleme seçeneklerine bağlı olarak farklılık gösterebilir. Üretim ortamına uygulanmadan önce kullanılan Squid sürümünün resmi dokümantasyonu kontrol edilmelidir.

Loglama ve İzleme

Squid ayrıntılı erişim ve hata logları oluşturur. Bu loglar güvenlik analizi, sorun giderme, trafik analizi ve kurumsal politika takibi açısından önemlidir.

En önemli log dosyalarından ikisi:

  • access.log — Proxy üzerinden geçen isteklerin kayıtlarını içerir.

  • cache.log — Squid servisinin durumu, uyarıları ve hata mesajlarını içerir.

Access log'u canlı olarak izlemek için:

sudo tail -f /var/log/squid/access.log

Squid access log kayıtlarında zaman damgası, istek süresi, istemci IP'si, HTTP durum kodu, istek boyutu, HTTP metodu ve URL gibi bilgiler bulunabilir. Kesin alanlar kullanılan Squid sürümü ve log formatına göre değişebilir.

En çok erişilen domainleri analiz etmek için örnek olarak:

sudo awk '{print $7}' /var/log/squid/access.log | \
awk -F/ '{print $3}' | \
sort | uniq -c | sort -rn | head -20

Belirli bir istemcinin kayıtlarını filtrelemek için:

sudo grep "10.10.10.50" /var/log/squid/access.log | tail -100

Log dosyalarının zamanla büyüyerek disk alanını tüketmesini önlemek için log rotation yapılandırması da düzenli olarak kontrol edilmelidir.

Performans İyileştirme

Yüksek trafikli ortamlarda Squid performansını artırmak için sunucu kaynakları, DNS çözümleme süresi, disk performansı, cache boyutu ve istemci sayısı gibi faktörler birlikte değerlendirilmelidir.

DNS Yapılandırması

Squid'in DNS çözümleme davranışı uygun şekilde yapılandırılabilir. Örneğin belirli DNS sunucuları kullanılabilir:

dns_nameservers 1.1.1.1 8.8.8.8

dns_defnames ise domain arama davranışıyla ilgilidir ve her kurulumda gerekli değildir. Bu nedenle yalnızca ihtiyaç duyulan ortamlarda kullanılmalıdır.

Quick Abort

quick_abort_* ayarları, istemci bağlantısı kesildiğinde Squid'in devam eden bir nesne indirmesini ne zaman durduracağını kontrol eder.

quick_abort_min 0 KB
quick_abort_max 0 KB
quick_abort_pct 95

Bu değerler Squid'in davranışını etkileyebileceği için üretim ortamında doğrudan kopyalanmak yerine gerçek trafik ve bant genişliği kullanımına göre test edilmelidir.

Memory Cache

Küçük ve sık kullanılan nesnelerin bellekte tutulması, disk erişimine kıyasla daha hızlı yanıt alınmasına yardımcı olabilir:

maximum_object_size_in_memory 512 KB

Buradaki değer uygulamanın trafik yapısına ve sunucunun kullanılabilir RAM miktarına göre ayarlanmalıdır.

Negative Caching

Negatif cache, başarısız isteklerin belirli koşullarda kısa süreli olarak önbelleğe alınmasına olanak sağlar. Örneğin:

negative_ttl 2 minutes

Böylece aynı hatalı isteğin kısa süre içerisinde tekrar tekrar dış sunucuya gönderilmesinin önüne geçilebilir.

Squid ve Diğer Çözümler

Proxy çözümü seçilirken kullanım amacı ve ağ mimarisi dikkate alınmalıdır. Squid, özellikle web proxy, erişim kontrolü, loglama ve cache gereksinimleri bulunan Linux tabanlı sistemlerde güçlü bir seçenektir.

VPN çözümleri ise farklı bir kullanım amacına sahiptir. WireGuard veya OpenVPN gibi VPN teknolojileri istemci ile ağ arasında şifreli bir tünel oluşturabilir. Bu nedenle yalnızca web trafiğini yönetmekten ziyade farklı protokollerin güvenli şekilde taşınması gereken senaryolarda tercih edilir.

Nginx ve HAProxy gibi çözümler ise reverse proxy, load balancing ve uygulama trafiğinin dağıtılması gibi kullanım alanlarında daha yaygındır.

MikroTik gibi ağ cihazlarının proxy özellikleri basit senaryolarda yeterli olabilir. Ancak gelişmiş ACL, authentication, loglama ve cache ihtiyaçlarında Squid'in esnek yapılandırma seçenekleri avantaj sağlayabilir.

Sonuç

Squid Proxy, ağlarda internet erişim kontrolü, kullanıcı kimlik doğrulaması, loglama, ACL tabanlı filtreleme ve uygun koşullarda caching gibi önemli işlevler sağlayan güçlü bir açık kaynak çözümüdür.

Bu rehberde Squid Proxy kurulumu, temel ACL yapılandırması, kullanıcı authentication, blacklist ve whitelist, cache ayarları, transparent proxy, SSL Bump, loglama ve performans optimizasyonu gibi temel konuları ele aldık.

Squid yapılandırmasında en önemli güvenlik prensiplerinden biri deny by default yaklaşımıdır. Yalnızca ihtiyaç duyulan ağlara ve kullanıcılara erişim izni verilmelidir. Proxy sunucusunun internete açık bir open proxy haline gelmemesi için ACL kuralları dikkatli hazırlanmalı ve loglar düzenli olarak incelenmelidir.

SSL Bump gibi gelişmiş özellikler ise yalnızca gerekli olduğu durumlarda, kullanıcı gizliliği, sertifika yönetimi, güvenlik politikaları ve ilgili yasal gereksinimler dikkate alınarak uygulanmalıdır.