İçeriğe geç
NetDevOps
13 dk okuma Ağ Yönetimi

Squid Proxy Kurulumu

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, bu ihtiyacı karşılayan en olgun ve yaygın açık kaynak çözümlerden biridir. Bu yazıda Squid'in temel kurulumundan ileri yapılandırmasına, kullanıcı kimlik doğrulamasından HTTPS trafiğinin filtrelenmesine kadar tüm detayları ele alacağız.

Squid Proxy Nedir ve Neden Kullanılır

Squid, HTTP, HTTPS ve FTP protokolleri için yazılmış yüksek performanslı bir caching proxy sunucusudur. Temel olarak üç senaryoda kullanılır. Birincisi, forward proxy olarak çalışır ve iç ağdaki istemcilerin internet erişimini kontrol eder. İstemciler doğrudan internete değil, Squid'e bağlanır ve Squid istekleri internet'e iletir. İkincisi, reverse proxy olarak çalışarak gelen internet trafiğini arka plandaki web sunucularına yönlendirir ve önbellekleme ile performans artırır. Üçüncüsü, transparent proxy olarak ağ geçidi seviyesinde tüm trafiği yakalayarak istemci tarafında herhangi bir ayar gerektirmeden filtreleme sağlar.

Proxy kullanmanın pratik faydaları oldukça fazladır. Bandwidth tasarrufu sağlar çünkü sık erişilen içerikler yerel olarak önbelleklenir ve aynı içerik için internet bağlantısı kullanılmaz. İnternet erişimini loglayarak hangi kullanıcının hangi siteye ne zaman eriştiğini takip edebilirsiniz. İçerik filtreleme ile belirli domain'lerin engellenmesi veya sadece belirli sitelere izin verilmesi mümkün olur. Kimlik doğrulama ile her kullanıcının proxy kullanımı kayıt altına alınabilir. Ayrıca web sayfalarının daha hızlı yüklenmesi kullanıcı deneyimini iyileştirir.

Kurulum ve Temel Yapılandırma

Squid, hemen hemen tüm Linux dağıtımlarının varsayılan paket yöneticisiyle kurulabilir. Ubuntu ve Debian tabanlı sistemlerde apt, CentOS ve Rocky Linux gibi RPM tabanlı sistemlerde dnf veya yum kullanılır:

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

apache2-utils paketi, kullanıcı kimlik doğrulaması için gerekli htpasswd aracını içerir. Kurulum tamamlandıktan sonra temel konfigürasyon /etc/squid/squid.conf dosyasında yer alır. Bu dosyayı düzenlemeden önce yedeğini almanız şiddetle tavsiye edilir:

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

Squid'in varsayılan yapılandırması oldukça güvenli gelir ve sadece localhost'tan erişime izin verir. İlk yapılacak şey, erişim kontrol listelerini (ACL) tanımlamaktır. Squid kuralları yukarıdan aşağıya doğru işlenir ve ilk eşleşen kural uygulanır. Bu nedenle http_access deny all direktifi her zaman en sona konmalıdır. Temel bir yerel ağ yapılandırması şu şekilde görünür:

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 iki ACL tanımlanmıştır: local_net adlı ACL, 10.10.10.0/24 ve 192.168.1.0/24 ağlarından gelen bağlantılara izin verir. Erişim kontrolüne yeni kurallar eklemek de oldukça kolaydır. Sadece ACL'yi tanımlayın ve ardından erişim iznini veya reddini belirtin.

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

Ağdaki her kullanıcının proxy kullanımını izlemek ve kontrol etmek için kimlik doğrulama gereklidir. Squid, birçok kimlik doğrulama yöntemini destekler, ancak en yaygın ve pratik olanı Basic Authentication'dır. Bu yöntem, kullanıcı adı ve şifre ile proxy erişimini kontrol eder.

Öncelikle kullanıcı veritabanını oluşturun. Bu veritabanı, Apache'nin htpasswd formatını kullanır:

sudo htpasswd -c /etc/squid/passwords kullanici1

-c parametresi dosyayı oluşturur ve sadece ilk kullanıcı için kullanılır. Yeni kullanıcı eklerken bu parametre kullanılmaz, aksi halde mevcut kullanıcılar silinir:

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

Şimdi squid.conf dosyasına kimlik doğrulama parametrelerini 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

Bu yapılandırmada auth_param direktifleri kimlik doğrulama mekanizmasını tanımlar. basic_ncsa_auth, NCSA uyumlu şifre dosyasını okur. credentialsttl, kimlik bilgilerinin ne kadar süreyle geçerli kalacağını belirler. acl authenticated proxy_auth REQUIRED ifadesi, kimlik doğrulaması başarılı olan kullanıcıları tanımlar. Artık proxy kullanmak isteyen kullanıcılar tarayıcılarında kullanıcı adı ve şifre girmesi gerekecektir.

İçerik Filtreleme: Blacklist ve Whitelist

Squid'in en güçlü özelliklerinden biri içerik filtreleme yetenekleridir. İki temel yaklaşım vardır: blacklist (kara liste) ve whitelist (beyaz liste). Blacklist, erişimi engellemek istediğiniz domain'leri listeler ve geri kalan her şeye izin verir. Whitelist ise tam tersidir ve sadece belirli domain'lere izin verirken diğer her şeyi engeller.

Blacklist oluşturmak için bir metin dosyası hazırlayın ve her satıra bir domain yazın. Domain'in başına nokta koymak, o domain'in tüm alt alan adlarını da kapsar:

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

Bu dosyayı /etc/squid/blocked_sites.txt olarak kaydedin ve squid.conf'a ekleyin:

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

Whitelist yaklaşımı ise ofis veya laboratuvar ortamlarında sıkı kontrol sağlamak için idealdir. Sadece belirli sitelere izin verilir ve diğer her şey engellenir:

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

Whitelist dosyası şu şekilde görünebilir:

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

Bazı durumlarda URL bazlı filtreleme de gerekebilir. Belirli kelimeleri içeren URL'leri engellemek için regex tabanlı ACL'ler 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 engellemek istediğiniz kelime veya kalıpları yazın, örneğin download veya torrent.

Önbellekleme (Caching) Yapılandırması

Squid'in temel işlevlerinden biri olan önbellekleme, sık erişilen içeriklerin yerel diskte saklanmasını ve aynı içerik için tekrarlanan isteklerin internet yerine doğrudan Squid üzerinden sunulmasını sağlar. Bu, hem bandwidth tasarrufu sağlar hem de kullanıcı deneyimini iyileştirir.

Önbellek davranışını kontrol eden temel parametreler şunlardır:

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 direktifi, önbellek depolama alanını yapılandırır. ufs depolama tipi, Squid'in varsayılan ve en kararlı dosya sistemi türüdür. /var/spool/squid önbellek dizinini, 2000 MB (2 GB) toplam boyutu, 16 birinci seviye alt dizin ve 256 ikinci seviye alt dizin olarak ayarlar. Dizin yapısı, önbellek büyüdükçe performansı korumak için önemlidir. maximum_object_size, önbelleğe alınabilecek en büyük nesne boyutunu belirler. 100 MB varsayılan değerdir ve büyük dosyalar için artırılabilir. cache_mem, Squid'in RAM'de tuttuğu hot object'ler için ayrılan bellek miktarını belirler. cache_swap_low ve cache_swap_high ise önbellek doluluk eşiklerini kontrol eder ve eski nesnelerin temizlenmesini tetikler.

Önbellek dizinini ilk kurulumda veya yeniden boyutlandırdıktan sonra oluşturmanız gerekir:

sudo squid -z

Bu komut, önbellek dizin yapısını oluşturur ve Squid'in düzgün çalışması için gereklidir.

Şeffaf Proxy (Transparent Proxy) Kurulumu

Şeffaf proxy, istemci tarafında herhangi bir yapılandırma gerektirmeden tüm HTTP trafiğini Squid üzerinden geçirmeyi sağlar. Bu, özellikle kullanıcı sayısının çok olduğu ve her cihazı tek tek yapılandırmanın zor olduğu ortamlarda kullanışlıdır.

Squid tarafında transparent proxy'yi aktif etmek için http_port satırını değiştirin:

http_port 3128 intercept

intercept parametresi, Squid'in NAT yönlendirmesiyle gelen trafiği dinlemesini sağlar.

Ardından, ağ geçidinde iptables kurallarıyla 80 portuna gelen trafiği Squid'e yönlendirin. Bu genellikle bir Linux router üzerinde uygulanır:

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

Burada eth0, LAN arabirimidir. Bu kural, eth0 üzerinden gelen tüm 80 portuna TCP trafiğini Squid'in 3128 portuna yönlendirir. Bu kurulumın yalnızca HTTP (80 port) trafiği için çalıştığını unutmayın. HTTPS trafiği şeffaf proxy ile yakalanamaz, bunun için SSL bumping gereklidir.

Transparent proxy kullanımında dikkat edilmesi gereken bir nokta vardır: kimlik doğrulaması doğrudan çalışmaz. Tüm istemciler ağ geçidi IP'sinden geliyormuş gibi görünür. Bu nedenle kullanıcı takibi için IP bazlı ACL'ler veya ek loglama mekanizmaları düşünülmelidir.

SSL Bumping ile HTTPS Filtreleme

HTTPS trafiğini Squid üzerinden filtrelemek, şeffaf proxy'de olduğu gibi basit değildir. HTTPS şifreli olduğu için Squid, trafiğin içeriğini göremez ve dolayısıyla filtreleme uygulayamaz. SSL bumping, Squid'in araya girerek HTTPS trafiğini çözmesini ve filtrelemesini sağlar. Bu, man-in-the-middle (MITM) tekniğiyle çalışır ve kurumsal ortamlarda dikkatli kullanılmalıdır.

SSL bumping için öncelikle Squid'in kendi CA sertifikasını oluşturmanız gerekir. Bu sertifika, client'lar tarafından güvenilir kök sertifika olarak yüklenmelidir:

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 squid.conf'da SSL bumping'i yapılandırın:

http_port 3128 intercept
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 step1 ifadesi, Squid'in SSL handshake'inin ilk aşamalarını izlemesini sağlar. Bu aşamada SNI (Server Name Indication) bilgisi okunur ve filtreleme kararları verilebilir. ssl_bump bump all ise tüm trafiği MITM işleminden geçirir.

Belirli domain'lerde SSL bumping'i devre dışı bırakmak isteyebilirsiniz. Örneğin bankacılık sitelerinde MITM yapılmaması kullanıcı güvenini artırır:

acl no_bump_sites dstdomain "/etc/squid/no_bump_sites.txt"
ssl_bump peek no_bump_sites
ssl_bump terminate no_bump_sites
ssl_bump bump all

SSL certificate hatalarını yönetmek için de ayarlar ekleyebilirsiniz. Örneğin kendinden imzalı sertifikalara sahip iç siteleri için hataları yoksaymak:

acl bad_cert ssl_error SslCertDateNotInFuture
acl bad_cert ssl_error SslCertNotYetValid
acl internal_sites dstdomain "/etc/squid/internal_sites.txt"
sslproxy_cert_error allow internal_sites bad_cert
sslproxy_cert_error deny all

Loglama ve İzleme

Squid, erişim ve hata loglarını ayrıntılı olarak tutar. Bu loglar, güvenlik analizi, performans izleme ve uyumluluk gereksinimleri için kritiktir. İki ana log dosyası bulunur: access.log tüm proxy isteklerini, cache.log ise Squid'in kendi durumu ve hatalarını kaydeder.

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

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

Log formatını anlamak önemlidir. Her satır, Space-separated değerlerden oluşur: timestamp, duration, client IP, HTTP kodu, boyut, request method, URL ve diğer meta veriler.

En çok erişilen siteleri analiz etmek için:

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

Bu komut, access log'undan URL'leri çıkarır, domain'leri ayıklar, sayar ve en çok erişilen 20 siteyi listeler.

Belirli bir kullanıcının trafiğini izlemek için IP bazlı filtreleme yapılabilir:

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

Squid log rotasyonu, disk alanının kontrol altında tutulması için önemlidir. /etc/logrotate.d/squid dosyası genellikle otomatik olarak kurulur ve günlük, haftalık veya aylık olarak logları döndürür.

Performans İyileştirme

Yüksek trafikli ortamlarda Squid performansı kritik önem taşır. Birkaç temel ayarla performans önemli ölçüde iyileştirilebilir.

DNS caching, Squid'in her istek için harici DNS sorgusu yapmasını önler. Harici DNS sunucuları yerel ağda veya public DNS (1.1.1.1, 8.8.8.8) üzerinde tanımlanabilir:

dns_defnames on
dns_nameservers 1.1.1.1 8.8.8.8

Quick abort ayarı, Squid'in bir nesneyi alma işlemini ne zaman iptal edeceğini kontrol eder. İstemci bağlantısı kesildiğinde Squid'in devam eden indirmeyi durdurması bandwidth tasarrufu sağlar:

quick_abort_min 0 KB
quick_abort_max 0 KB
quick_abort_pct 95

Memory caching, disk önbelleğe kıyasla çok daha hızlıdır. Sık erişilen küçük nesneleri RAM'de tutmak performansı artırır:

maximum_object_size_in_memory 512 KB

Negative caching, başarısız isteklerin (404, vb.) sonuçlarını belirli bir süre önbellekler ve aynı hatalı isteklerin tekrarlanmasını engeller:

negative_ttl 2 minutes

Squid vs Diğer Çözümler

Proxy seçiminde karşılaştırma kaçınılmazdır. Squid, Linux tabanlı, açık kaynak ve son derece yapılandırılabilir bir çözümdür. Ancak bazı senaryolarda alternatifler daha uygun olabilir.

VPN (WireGuard, OpenVPN) tüm protokolleri şifreli tünelden geçirir ve tam ağ trafiği kontrolü sağlar. Ancak kurulumu daha karmaşıktır ve web dışı trafiği de yönetir. Squid ise sadece HTTP/HTTPS/FTP için optimize edilmiştir ve web filtreleme konusunda daha zengin özelliklere sahiptir.

Mikrotik ve benzeri ağ cihazlarının built-in proxy özellikleri, basit senaryolarda yeterli olabilir. Ancak ileri yapılandırma ve ölçekleme gerektiğinde Squid'in esnekliği öne çıkar.

Sonuç

Squid Proxy, kurumsal internet erişim yönetiminin temel taşlarından biridir. Doğru yapılandırıldığında bandwidth tasarrufu, güvenlik kontrolü, kullanıcı izleme ve içerik filtreleme gibi kritik işlevleri sorunsuz şekilde yerine getirir. Authentication, ACL, caching ve SSL bumping gibi özellikler, küçük ofis ağlarından büyük kurumsal ortamlara kadar geniş bir yelpazede kullanılabilmesini sağlar.

Kurulum ve yapılandırma sürecinde dikkatli olunması gereken en önemli nokta, varsayılan reddetme (deny by default) ilkesidir. Her zaman whitelist yaklaşımını tercih edin ve gereksiz erişimlere izin vermekten kaçının. Logları düzenli olarak gözden geçirin ve false positive'leri azaltmak için ACL'leri sürekli iyileştirin.