Squid Proxy Nedir? Ubuntu'da Kurulum ve squid.conf Ayarları

Yayın tarihi:

13 dk okuma

Acar Diveroli
Yazar: Acar Diveroli
İzometrik önbellek küplerinden kule, ortasında mavi HIT küpü; yörüngelerde ACL, AUTH, PARENT PEER etiketleri ve 3128 portu

Beş kişilik bir veri ekibi, test sunucularının paketleri tek bir yerden indirmesini ve bir tedarikçinin API'sine her seferinde aynı IP adresinden bağlanmasını istiyor. Ekipten biri küçük bir VPS'e (kiralık sanal sunucu) on dakikada Squid kuruyor. Bir hafta sonra access.log kimsenin tanımadığı adreslerle dolmuş: yapılandırma, http_access allow all satırıyla biten bir forum mesajından alınmış ve artık yabancılar kendi trafiklerini ekibin IP'si üzerinden dışarı çıkarıyor.

Bu rehberde Squid'i Ubuntu 24.04'e bu hataya düşmeden kuruyoruz. Önce Squid'in ne olduğunu, bir isteği hangi sırayla denetlediğini ve tek bir sunucunun size neyi verip neyi veremeyeceğini anlatıyoruz. Ardından IP whitelist, kullanıcı girişi, disk önbelleği ve başlık ayarlarını içeren eksiksiz bir yapılandırma dosyası, cache_peer ile bağlanan bir üst proxy ve kurulumu test eden komutlar geliyor.

Squid proxy nedir?

Squid, açık kaynaklı ve önbellekli bir proxy sunucusudur. Proxy sunucu, istekleri sizin adınıza gönderir ve yanıtları size geri iletir (Proxy Sunucu Nedir ve Nasıl Çalışır?). Squid genellikle bir web sitesinin önünde duran reverse proxy olarak değil, bir ağdaki istemciler adına çalışan bir forward proxy olarak kullanılır (Forward Proxy ve Reverse Proxy Arasındaki Fark). HTTP'yi, CONNECT tünelleri üzerinden HTTPS'i ve FTP'yi taşır; erişim kuralları, giriş yardımcıları (helper), bir önbellek ve bir istek logu sunar.

Squid projesinin güncel kararlı sürümü, 24 Ağustos 2026'da yayımlanan 7.7'dir ve geliştiriciler yalnız son kararlı sürümü destekler. Ubuntu 24.04 ise Squid 6.14 ile gelir: noble-updates deposundaki paket 6.14-0ubuntu0.24.04.4 sürümüdür ve güvenlik düzeltmeleri normal Ubuntu güncellemeleriyle gelir. Bu rehber o paketi kullanıyor.

Squid bir isteği nasıl işler?

Yapılandırma hatalarının çoğu, bu adımların sırasından kaynaklanır.

  1. İstemci, http_port satırındaki porta bağlanır. Ubuntu'nun yapılandırmasında bu port 3128'dir.
  2. Squid, http_access satırlarını yukarıdan aşağıya okur. Koşullarının hepsi eşleşen ilk satır kararı verir. http_access belgesi, hiçbir satır eşleşmezse Squid'in son satırın tersini yaptığını da belirtir; bu yüzden her liste http_access deny all ile bitmelidir.
  3. Kural giriş gerektiriyorsa Squid kullanıcı adı ve şifre ister. Squid, geçerli kimlik bilgisi olmadan bir proxy_auth koşuluna geldiğinde 407 Proxy Authentication Required yanıtı verir (Proxy Kimlik Doğrulama: User:Pass ve IP Whitelist).
  4. Düz HTTP isteği önbellekte aranır. Saklanmış taze bir kopya varsa istek önbellekten karşılanır (hit) ve sunucudan dışarı hiç çıkmaz; yoksa (miss) sayfa siteden getirilir.
  5. HTTPS bir tünele dönüşür. CONNECT example.com:443 başarılı olduktan sonra Squid yalnız şifreli baytları aktarır. RFC 9110 buna "verinin kör iletimi" (blind forwarding) der; bu yüzden Squid tünelin içindeki sayfayı ne önbelleğe alabilir ne de ona başlık ekleyebilir.
  6. cache_peer ve never_direct ile bir üst proxy tanımladıysanız istek ona devredilir.
  7. Squid, access.log dosyasına tek bir satır yazar. Satırda istemci, sonuç kodu, boyut, URL ve kullanıcı adı bulunur.

Kendi Squid sunucunuz size ne sağlar, ne sağlamaz?

SoruKendi Squid'iniz (tek VPS)Ticari datacenter proxyResidential ya da rotating havuz
Çıkış IP'siVPS'in tek veri merkezi IP'siSağlayıcının veri merkezi IP'leri, gerekirse birkaç taneEv bağlantısı IP'leri, istek ya da oturum başına
KonumSunucunun çalıştığı şehirSağlayıcının ülkeleri arasından seçimBir ülke, bazen bir şehir
BakımSiz: güncellemeler, kurallar, şifreler, loglarSağlayıcı; siz kimlik bilgilerini yönetirsinizSağlayıcı; siz kimlik bilgilerini yönetirsiniz
Önbellek ve erişim denetimiHTTP önbelleği, kurallar, tek merkezi logÖnbellek yok; kullanıcılar paneldeÖnbellek yok; kullanıcılar panelde

Squid, kimin bağlanacağı, neyin önbelleğe alınacağı ve neyin loglanacağı üzerinde denetimi size bırakır. Size ikinci bir adres veremez: o tek veri merkezi IP'sinden dakikada yüzlerce istek gören bir site bu IP'yi yavaşlatır ya da engeller (Residential ve Datacenter Proxy Farkları Nedir?).

Ubuntu 24.04'e Squid nasıl kurulur?

apache2-utils paketi, şifre dosyası için htpasswd aracını ekler. Özgün yapılandırmanın salt okunur bir kopyasını saklama adımı resmî Ubuntu Server rehberinden geliyor.

bash
sudo apt update
sudo apt install squid apache2-utils
squid -v | head -n 1                       # kurulu sürüm
systemctl status squid --no-pager          # "active (running)" yazmalı

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.original
sudo chmod a-w /etc/squid/squid.conf.original

# kendi kurallarınız nerede okunacak?
grep -n "include /etc/squid/conf.d" /etc/squid/squid.conf
grep -n "^http_access deny all" /etc/squid/squid.conf

Ayarlarınızı /etc/squid/conf.d/ altında ayrı bir dosyaya yazın; böylece paket güncellemeleri onlara dokunmaz. Ubuntu'nun temel aldığı Debian paketi, include /etc/squid/conf.d/*.conf satırını INSERT YOUR OWN RULE(S) HERE yorumunun altına koyar: güvensiz portları engelleyen kurallardan sonra, http_access allow localhost ve http_access deny all satırlarından önce. grep çıktısındaki include satır numarası, deny all satırınınkinden küçük olmalıdır; değilse kendi satırlarınızı squid.conf içinde o yorumun altına yazın. Klasördeki debian.conf dosyası logfile_rotate 0 ayarını içerir, çünkü logları logrotate döndürür.

Dışa kapalı bir proxy için eksiksiz team.conf

Aşağıdaki içeriği /etc/squid/conf.d/team.conf olarak kaydedin. Belgelerde örnek olarak ayrılmış 203.0.113.0/24 ağını kendi ofis ağınızla ya da ekibinizin sabit IP'leriyle değiştirin.

text
# /etc/squid/conf.d/team.conf
# squid.conf'taki http_access listesinin içinde, "http_access deny all" satırının üstünde okunur.
# Asla "http_access allow all" eklemeyin: bu, sunucuyu açık proxy'ye çevirir.

# 1. Hangi ağlar bağlanabilir
acl team_net src 203.0.113.0/24

# 2. /etc/squid/passwords dosyasından kullanıcı adı ve şifre.
#    auth_param satırlarını proxy_auth ACL'sinin üstünde tutun.
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic children 5 startup=5 idle=1
auth_param basic realm Team proxy
auth_param basic credentialsttl 2 hours
acl team_users proxy_auth REQUIRED

# 3. Yalnız İKİSİ birden eşleşirse izin ver: doğru ağ VE geçerli giriş.
#    Geri kalan her şey "http_access deny all" satırına düşer.
http_access allow team_net team_users

# 4. Düz HTTP isteklerinde istemci adreslerini iletme
forwarded_for delete
via off

# 5. Önbellek: bellek, saklanacak en büyük nesne, ardından disk önbelleği
cache_mem 512 MB
maximum_object_size 512 MB
cache_dir ufs /var/spool/squid 10000 16 256

Ardından kullanıcıları ekleyin, sözdizimini denetleyin, servisi bir kez yeniden başlatın ve portu yalnız bilinen adreslere açın:

bash
sudo htpasswd -c /etc/squid/passwords team1   # -c dosyayı oluşturur: yalnız ilk kullanıcıda
sudo htpasswd /etc/squid/passwords team2      # sonraki kullanıcılar: -c olmadan
sudo chown root:proxy /etc/squid/passwords
sudo chmod 640 /etc/squid/passwords

sudo squid -k parse                           # varsa hataları ve uyarıları yazar
sudo systemctl restart squid                  # yeni cache_dir için bir kez
sudo tail -n 20 /var/log/squid/cache.log      # açılış iletileri

sudo ufw allow OpenSSH                        # SSH oturumunuz kopmasın
sudo ufw allow from 203.0.113.0/24 to any port 3128 proto tcp
sudo ufw enable

acl ve http_access kuralları nasıl yazılır?

Bir acl satırı bir koşula ad verir (ACL, access control list, yani erişim denetim listesi); bir http_access satırı bu adları birleştirip karar verir. Aynı satırdaki koşulların hepsi eşleşmelidir, yani allow team_net team_users "bizim ağımızdan geliyor ve giriş yapmış" anlamına gelir. Ayrı satırlar ise birbirinin alternatifidir: ikinci bir ofis için acl office2 src 198.51.100.0/24 ve http_access allow office2 team_users satırlarını ekleyin.

Satırın yeri de içeriği kadar önemlidir. http_access deny all satırının altındaki bir allow satırına hiç sıra gelmez ve her istemci 403 alır. Include satırının üstündeki kurallara dokunmayın: deny CONNECT !SSL_ports, tünellerin yalnız 443 portuna gitmesine izin verir. RFC 9110, CONNECT isteklerinin bilinen portlarla sınırlanmasını önerir, çünkü her porta tünel açan bir proxy 25 numaralı porta spam aktarmak için kullanılabilir.

Portu değiştirmek için ikinci bir satır eklemek yerine squid.conf içindeki mevcut http_port 3128 satırını düzenleyin ve güvenlik duvarını da güncelleyin. Yeni bir port hiçbir şeyi korumaz; korumayı ACL ve güvenlik duvarı sağlar. Port numaralarının ne anlama geldiğini 8080 ve 3128 portları yazımızda anlattık.

Kullanıcı adı ve şifre nasıl eklenir?

htpasswd, her kullanıcı için şifresi hash'lenmiş tek bir satır saklar. Varsayılan hash yöntemi MD5'tir ve Squid'in basic_ncsa_auth yardımcısı bu biçimi okur; Ubuntu'da yardımcı /usr/lib/squid/basic_ncsa_auth yolundadır. Yardımcı proxy kullanıcısıyla çalıştığı için dosya proxy grubuna verilir. auth_param satırları en fazla beş yardımcı başlatır, giriş penceresinde görünen metni belirler ve Squid'in doğru bir girişe, dosyayı yeniden denetlemeden iki saat güvenmesini sağlar.

Squid'in auth_param belgesine göre Squid, kimlik bilgisini ancak bir http_access kuralı bir proxy_auth ACL'sine geldiğinde ister. auth_param ayarlarını yapıp team_users adını http_access içinde kullanmazsanız Squid hiçbir zaman şifre sormaz.

Basic kimlik doğrulamada şifre, istemci ile Squid arasındaki her Proxy-Authorization başlığında Base64 ile kodlanmış olarak gider. Bu bir kodlamadır, şifreleme değildir: o yolu izleyen herkes şifreyi okuyabilir. IP whitelist bu yüzden şifreyle birlikte kalır. 407 yanıtının nasıl okunacağını Proxy Kimlik Doğrulama: User:Pass ve IP Whitelist yazısında anlattık.

Önbellek nasıl ayarlanır, loglar nasıl okunur?

cache_mem, sık istenen nesneler için ayrılan belleği belirler (varsayılan 256 MB). cache_dir ufs /var/spool/squid 10000 16 256 satırı, 16 birinci düzey ve 256 ikinci düzey klasöre dağılan en fazla 10.000 MB disk önbelleği ekler; Squid belgesi buraya diskin tamamının boyutunu yazmamanızı söyler. maximum_object_size varsayılan olarak 4 MB'dir ve daha büyük paket dosyalarını önbelleğin dışında bırakır, bu yüzden değeri yükseltin. Bu ayar her cache_dir için varsayılan boyut sınırını da belirlediğinden, yukarıdaki dosyada cache_dir satırından önce yazıldı.

squid -z önbellek klasörlerini oluşturur. Ubuntu'nun servis dosyası her başlatmadan önce squid --foreground -z komutunu çalıştırdığı için yeniden başlatma bu klasörleri de kurar. Sonraki kural ya da kullanıcı değişiklikleri için sudo systemctl reload squid yeterlidir; bu komut squid -k reconfigure ile aynı sinyali gönderir.

Önbellek yalnız düz HTTP'de işe yarar. Ubuntu'nun ayna sunucuları (mirror) genellikle http:// adresleri kullanır ve apt paket imzalarını kendisi denetler. Bu yüzden apt'yi Squid'e yönlendiren CI (otomatik derleme ve test) makineleri her paketi yalnız bir kez indirir (Linux Proxy Ayarları: Terminal, apt, Docker ve Git). HTTPS hiçbir zaman önbellekten karşılanmaz. HTTPS trafiğini önbellek için açmak (SSL bump) her istemcide Squid'in sertifikasını ve ayrı squid-openssl paketini gerektirir; bu rehberin kapsamı dışındadır.

/var/log/squid/access.log her istek için bir satır tutar, cache.log ise açılış iletilerini ve hataları içerir. İkisini de logrotate her gün döndürür ve iki eski kopya saklar. Ne olduğunu sonuç kodundan anlarsınız:

Sonuç koduAnlamı
TCP_MISS/200Siteden getirildi
TCP_HIT/200, TCP_MEM_HIT/200Disk ya da bellek önbelleğinden verildi
TCP_TUNNEL/200HTTPS tüneli; Squid yalnız sunucu adını ve portu gördü
TCP_DENIED/407Giriş yok ya da hatalı
TCP_DENIED/403http_access reddetti: yanlış ağ ya da yanlış kural sırası

Via ve X-Forwarded-For başlıkları nasıl kaldırılır?

Squid varsayılan olarak istemcinin IP'sini X-Forwarded-For başlığına (header) ekler (forwarded_for on) ve bir Via başlığı koyar (via on). forwarded_for delete başlığı tamamen kaldırır, off adres yerine unknown yazar, via off ise Via başlığını düşürür. İkisi de yalnız düz HTTP'de çalışır; tünelin içine Squid zaten bir şey eklemez. Sonucu bir yankı isteğiyle denetlemek için Şeffaf, Anonim ve Elite Proxy Farkları Nedir? yazısına bakın.

Ekip için tek çıkış: üst proxy ile cache_peer

Ticari bir proxy kullanan ekip, o proxy'nin şifresinin her dizüstü bilgisayarda ve her CI işinde durmasını istemeyebilir. Squid araya girebilir: ekip üyeleri Squid'e kendi hesaplarıyla giriş yapar, ticari hesabın kimlik bilgilerini yalnız sunucu bilir. team.conf dosyasına şunu ekleyin:

text
# Her isteği üst proxy üzerinden gönder. İstemciler onun şifresini hiç görmez.
cache_peer pr.proxynet.io parent 8000 0 no-query default login=user:pass
never_direct allow all

cache_peer belgesine göre alanlar sırasıyla şunlardır: sunucu adı, parent türü, proxy portu 8000 ve eş ICP (önbellekler arası sorgu protokolü) sorgularını yanıtlamadığı için ICP portu 0. no-query bu sorguları kapatır, default bu eşi son çare olarak kullanılacak üst proxy yapar, login= ise üst proxy'nin kimlik bilgilerini gönderir; şifrede % karakteri varsa onu %% olarak yazın.

never_direct allow all olmadan Squid bazı istekleri doğrudan VPS'in kendi IP'sinden çekebilir. HTTPS'te Squid, CONNECT isteğini üst proxy'ye iletir. Bu durumda access.log içindeki hiyerarşi alanı, HIER_DIRECT yerine DEFAULT_PARENT gibi bir kodla üst proxy'yi gösterir.

Artık şifreyi değiştirmek için tek satırı düzenleyip reload etmek yeterlidir, her istek ekip üyesinin kullanıcı adıyla loglanır ve düz HTTP yine önbelleğe alınır. Üst proxy olarak bir Rotating Proxy kullanırsanız çıkış IP'sini sağlayıcı değiştirir, istemciler ise tek bir Squid adresiyle çalışmaya devam eder (IP Rotasyonu Nedir ve Nasıl Çalışır?). Bu zincir kimlik bilgilerini yönetir, kim olduğunuzu gizlemez; sağlayıcının şartları ve her sitenin kuralları yine geçerlidir.

İstemci nasıl bağlanır ve nasıl test edilir?

Aşağıdaki komutları izin verilen ağdaki bir makineden çalıştırın; 198.51.100.20 sizin sunucunuzun yerini tutuyor.

bash
# 1. Girişsiz: Squid giriş ister
curl -x http://198.51.100.20:3128 https://httpbin.org/ip
# curl: (7) CONNECT tunnel failed, response 407

# 2. Girişle: yanıtta sizin değil, sunucunun IP'si görünür
curl -x http://team1:pass@198.51.100.20:3128 --retry 3 https://httpbin.org/ip

# 3. Sunucuda: son üç istek
sudo tail -n 3 /var/log/squid/access.log

Bu curl komutlarını curl 8.21 ve giriş isteyen yerel bir test proxy'siyle denedik: ilk komut yukarıdaki satırı yazdı, ikincisi proxy'nin çıkış adresini döndürdü. --retry 3, zaman aşımından ya da 429, 503 gibi geçici bir HTTP kodundan sonra isteği yineler; 407 aldığında asla yinelemez. Ayrıntılar cURL ile Proxy Nasıl Kullanılır? ve Proxy Çalışıyor mu? Proxy Nasıl Test Edilir? yazılarında.

Kendi proxy sunucunuzu ne için kullanabilirsiniz?

Sık yapılan hatalar

  • http_access allow all. Açık bir proxy demektir ve IP'si kısa sürede kara listelere girer (IP Kara Liste Nedir?).
  • http_access içinde proxy_auth kullanmadan auth_param yazmak. Hiçbir zaman şifre sorulmaz.
  • deny all satırının altına allow yazmak. O satıra hiç sıra gelmez; herkes 403 alır.
  • 3128'i internete açık bırakmak. Yalnız şifreyle korunan bir port, şifre tahmin denemelerine açıktır; basic auth da şifreyi korumasız, okunabilir biçimde gönderir.
  • HTTPS sayfalarının önbellekten gelmesini beklemek. Tüneller hiçbir zaman önbelleğe alınmaz.
  • squid -k parse adımını atlamak. Bir yazım hatası servisi durdurur; nedenini journalctl -u squid gösterir.
  • Paket önbelleğinde maximum_object_size değerini 4 MB'de bırakmak ya da diskteki boş alandan büyük bir cache_dir tanımlamak.
  • VPS'in IP'sinden yoğun scraping yapmak. Siteler önce 429 döner, sonra engeller (Scraping'de HTTP Hata Kodları).

Karar rehberi

İhtiyaçÖneri
Ekip bir API'ye tek IP'den erişmeliSabit IP'li bir VPS'te IP whitelist ve girişle çalışan Squid ya da bir Statik Proxy
CI makineleri aynı paketleri tekrar tekrar indiriyorcache_dir ve daha büyük bir maximum_object_size ile Squid; kazanç HTTP aynalarından gelir
Ofis, ziyaret edilen siteleri görmek ve sınırlamak istiyordstdomain ACL'leri ve access.log; önce çalışanları bilgilendirin
Ticari proxy şifresi tek sunucuda kalmalıİstemciler için Squid, sağlayıcıya cache_peer, never_direct allow all
Başka ülkelerde IP'ler ya da çok sayıda IP gerekiyorKendi Squid'iniz değil: bir datacenter proxy ya da residential ve rotating havuz
HTTPS sayfalarının önbelleğe alınmasını istiyorsunuzVarsayılan paketle olmaz; yalnız düz HTTP kaynaklarını önbelleğe alın

Sıkça sorulan sorular

Squid hangi portu kullanır?

Ubuntu'nun yapılandırması http_port 3128 satırını içerir, bu yüzden Squid kurulumdan sonra 3128'i dinler. Bu satırı ve güvenlik duvarı kuralını birlikte değiştirebilirsiniz, ama farklı bir port koruma sağlamaz; korumayı ağ ACL'si, giriş ve güvenlik duvarı sağlar. Yaygın proxy port numaralarının ne anlama geldiğini 8080 portu rehberimizde anlattık.

Squid HTTPS siteleri önbelleğe alabilir mi?

Varsayılan kurulumda alamaz. HTTPS isteği bir CONNECT tüneli olarak gelir ve Squid şifreli baytları sayfayı görmeden aktarır, yani saklanacak bir şey yoktur. Trafiği açan SSL bump, her istemci cihazında bir Squid sertifikası ve squid-openssl paketi gerektirir; bu rehberin kapsamı dışındadır.

squid.conf değişiklikleri servisi durdurmadan nasıl uygulanır?

Önce sudo squid -k parse çalıştırın, böylece bir yazım hatası proxy'yi durduramaz. Ardından sudo systemctl reload squid çalıştırın; bu komut squid -k reconfigure ile aynı sinyali gönderir ve servis çalışmaya devam eder. Bir cache_dir ekledikten ya da taşıdıktan sonra ise servisin önbellek klasörlerini oluşturması için bir kez yeniden başlatın.

Squid logları nerede tutulur ve nasıl okunur?

Ubuntu'da /var/log/squid/ klasöründedir: access.log her istek için bir satır, cache.log ise açılış iletilerini ve hataları tutar. access.log içinde sonuç koduna bakın: TCP_HIT önbellekten, TCP_MISS siteden gelmiştir, TCP_TUNNEL HTTPS demektir; 407 ya da 403 ile birlikte görülen TCP_DENIED ise isteğin reddedildiğini gösterir.

Squid ile Tinyproxy arasındaki fark nedir?

Tinyproxy kendi tanımında, tam bir proxy'nin ağır geleceği küçük sistemler için hafif bir HTTP ve HTTPS proxy servisidir; yapılandırma kılavuzunda önbellek ayarı yer almaz. Squid buna bellek ve disk önbelleği, ayrıntılı ACL'ler, birkaç giriş yardımcısı ve üst proxy zincirleri ekler. Küçük bir cihazda yalnız iletme gerekiyorsa Tinyproxy yeterli olabilir.

Kendi Squid sunucum kimliğimi gizler mi?

Kısmen. Siteler ev bağlantınızın IP'si yerine VPS'in IP'sini görür, forwarded_for delete ile via off da düz HTTP'deki proxy başlıklarını kaldırır. Ama o IP bir veri merkezine aittir, sizin adınıza kiralanmıştır ve her zaman aynı yerden gelir. Squid bir anonimlik aracı değildir; erişim denetimi ve ortak bir çıkış noktası için kullanılır.

Özet

Squid size kendi forward proxy'nizi verir: erişim denetimi, düz HTTP için bir önbellek ve her isteği kaydeden tek bir log. Güvenli bir kurulum üç şeyi doğru sırada tutar: bir ağ ACL'si, http_access içinde kullanılan bir proxy_auth girişi ve en sonda http_access deny all. Güvenlik duvarı da yalnız bilinen adreslere açık kalır. Sınır adres sayısındadır: tek sunucu, tek yerde tek bir veri merkezi IP'si demektir. Bir iş daha fazla adres ya da başka ülkeler gerektirdiğinde bu boşluğu bir Datacenter Proxy ya da Residential Proxy doldurur; seçenekleri proxy hizmetlerimiz sayfasında karşılaştırabilirsiniz.

ChatGPT'ye sorClaude'a sor