Şunu hayal edin: terminali açıyorsunuz, bir paket kurulum komutu giriyorsunuz ve karşılık olarak sessizlik ya da bağlantı hatası. Genellikle sorun, ağa erişimin yalnızca bir proxy sunucusu üzerinden yapılabilmesi ve sistemin bundan haberdar olmamasıdır. Bu kılavuz size Linux ve CI'da ihtiyaç duyduğunuz her yerde proxy ayarlamayı öğretecek.

Giriş: Bu kılavuzdan ne elde edeceksiniz ve kimler için?

Bu rehberin sonunda, Linux terminalinde ve sürekli entegrasyon sistemlerinde proxy ayarlarını güvenle yapabileceksiniz. Ortam değişkenlerinin nasıl çalıştığını, proxy URL'sini nasıl doğru şekilde oluşturacağınızı ve tüm temel geliştirici araçlarını proxy üzerinden nasıl çalıştıracağınızı anlayacaksınız.

Tam olarak neler öğreneceksiniz:

  • Geçerli terminal oturumunda çalışan bir proxy ayarı.
  • Yeniden başlatmaya dayanıklı kalıcı ayar.
  • apt, dnf, git, npm, pip, curl, wget, Docker için doğru yapılandırma.
  • GitHub Actions ve GitLab Runner'da çalışan CI pipeline'ları.
  • Trafiğin gerçekten proxy üzerinden gidip gitmediğini nasıl kontrol edeceğiniz.
  • Proxy şifresini güvenli bir şekilde saklama becerileri.

Bu kılavuz kimler için: Kurumsal proxy ortamında çalışan yeni başlayan sistem yöneticileri, geliştiriciler ve DevOps mühendisleri için. İleri düzey kullanıcılar için de incelikler var: systemd incelikleri, SSH için ProxyCommand ve CI'da sırları maskeleme.

Önceden bilinmesi gerekenler: Terminali açabilmeli, komut girebilmeli ve dosya ile klasörün ne olduğunu anlayabiliyor olmalısınız. Diğer her şey yolunda basit bir dille açıklanmıştır.

Ne kadar sürecek: Temel ayar yaklaşık 15 dakika sürecek. Tüm araçları ve CI'yi yapılandırarak kılavuzun tamamını tamamlamak yaklaşık 60-90 dakika sürer. Acele etmeyin, düşünerek yapmak daha iyidir.

Öneri: Bu kılavuzu ayrı bir pencerede açık tutun ve komutları sırayla uygulayın. Böylece önemli bir adımı kaçırmazsınız.

Ön Hazırlık: Adres, Port, Kullanıcı Adı ve Doğru Proxy URL'si

Bir şey ayarlamadan önce, proxy sunucunuz hakkında verileri toplamanız gerekir. Bunlar olmadan ilerlemek imkansızdır.

Proxy verilerini nereden alabilirsiniz

Genellikle proxy aşağıdaki taraflardan biri tarafından sağlanır:

  • Şirketin sistem yöneticisi — kurumsal bir ağda çalışıyorsanız. Adres, port ve yetkilendirme bilgilerini ondan isteyin.
  • Proxy kiralama hizmeti — kişisel hesabınızda genellikle erişim ayarlarının bulunduğu bir bölüm vardır.
  • Kendi sunucunuz — proxy'yi kendiniz kurduysanız, verileri siz bilirsiniz.

Dört öğeye ihtiyacınız var: adres (host), port (port), kullanıcı adı (username) ve şifre (password). Bazen kullanıcı adı ve şifre gerekmez — o zaman proxy yetkilendirmesizdir.

Proxy URL'sini nasıl oluşturursunuz

Proxy tek bir dize olarak belirtilir — URL. Genel biçim şöyledir:

şema://kullanıcı:şifre@adres:port

Bir örnekle açıklayalım. Proxy adresi proxy.example.com, port 3128, kullanıcı adı ivan, şifre secret123 olsun. Bu durumda URL şöyle görünür:

http://ivan:secret123@proxy.example.com:3128

Yetkilendirme gerekmiyorsa URL daha basittir:

http://proxy.example.com:3128

Şema hakkında: Çoğunlukla HTTPS sitelerine erişmek için bile http şeması kullanılır. Bu normaldir — buradaki şema, hedef siteyle değil, proxy'nin kendisiyle iletişim protokolünü ifade eder. Bazen https veya socks5 şemasına sahip proxyler de bulunur.

Şifredeki özel karakterler neden kodlanmalıdır?

Bu, gizemli hataların en yaygın nedenlerinden biridir. Şifrede @, :, /, #, ? gibi özel karakterler varsa URL'nin ayrıştırılmasını bozarlar. Örneğin, @ karakteri yetkilendirme bilgilerini adresten ayırır. Şifrenin içinde yer alırsa, sistem kafası karışır ve şifrenin nerede bittiğini, adresin nerede başladığını anlayamaz.

Çözüm — percent-encoding (yüzde kodlaması). Sorunlu her karakter, yüzde işareti ve onaltılık sistemdeki koduyla değiştirilir.

Temel değişimler:

  • @ karakteri %40 olur
  • : karakteri %3A olur
  • / karakteri %2F olur
  • # karakteri %23 olur
  • ? karakteri %3F olur
  • Boşluk karakteri %20 olur
  • % karakteri %25 olur

Örnek: Şifre p@ss:word ise, URL'de p%40ss%3Aword şeklinde görünmelidir. O zaman tam URL:

http://ivan:p%40ss%3Aword@proxy.example.com:3128

Öneri: Şifreyi hızlıca kodlamak için şu komutu kullanın: python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=''))" 'şifreniz'. Bu, URL'ye eklemek için hazır bir dize verecektir.

⚠️ Dikkat: Gerçek şifrenizi asla ortak bir bilgisayarda komut satırına açıkça girmeyin — geçmişe kaydedilir. Güvenli giriş hakkında kılavuzun sonunda ayrıca konuşacağız.

✅ Kontrol: Elinizde, şifredeki tüm özel karakterlerin kodlandığı, oluşturulmuş bir veya daha fazla proxy URL'si olmalı. Bunları güvenli bir yere, tercihen bir şifre yöneticisine kaydedin.

Temel Kavramlar: Ortam Değişkenleri, Büyük-Küçük Harf Duyarlılığı ve NO_PROXY Biçimi

Ayarların sihir olmaması için üç temel kavramı inceleyelim. Bu beş dakikanızı alacak ancak saatlerce hata ayıklamaktan kurtaracak.

Ortam değişkenleri nedir?

Ortam değişkeni, işletim sisteminin bellekte tuttuğu ve çalıştırılan programlara aktardığı adlandırılmış bir değerdir. Bunu, sistemin her yeni programa gösterdiği bir not olarak düşünün: işte proxy adresi, bunu kullan.

Linux'taki birçok ağ yardımcı programı, başlatıldığında özel değişkenleri okur ve bulursa trafiği otomatik olarak proxy üzerinden yönlendirir. Bunlardan en önemlileri:

  • HTTP_PROXY — şifrelenmemiş HTTP istekleri için proxy.
  • HTTPS_PROXY — şifrelenmiş HTTPS istekleri için proxy.
  • NO_PROXY — proxy'yi atlayarak doğrudan erişilmesi gereken adreslerin listesi.
  • FTP_PROXY — FTP protokolü için proxy, günümüzde nadiren kullanılır.
  • ALL_PROXY — tüm protokoller için aynı anda proxy, genellikle socks için kullanılır.

http_proxy ve HTTP_PROXY arasındaki büyük-küçük harf farkı

Bu ince ama önemli bir noktadır. Linux büyük-küçük harf ayrımı yapar, bu nedenle http_proxy ve HTTP_PROXY biçimsel olarak iki farklı değişkendir. Farklı programlar farklı varyantları okur.

Tarihsel olarak durum şöyledir:

  • curl yardımcı programı hem küçük hem de büyük harf varyantlarını okur, ancak küçük harfli http_proxy'nin bir güvenlik özelliği vardır — HTTP_PROXY (büyük harfli) curl tarafından CGI ortamında yok sayılır, böylece saldırılar önlenir.
  • wget yardımcı programı geleneksel olarak küçük harfli adları tercih eder.
  • Farklı dillerdeki birçok program büyük harfli varyantları okur.

Pratik çıkarım: Tahmin etmemek için her iki sürümü de ayarlayın — hem küçük hem de büyük harf. Bu, kullanacağımız en güvenilir stratejidir.

NO_PROXY biçimi ve neden CIDR'ı anlamadığı

NO_PROXY değişkeni, virgülle ayrılmış, doğrudan erişilmesi gereken adreslerin listesini içerir. Bu, dahili kaynaklar için kritiktir: veritabanları, yerel hizmetler, bulut meta verileri.

Doğru bir değer örneği:

localhost,127.0.0.1,.example.com,.internal,169.254.169.254

example.com'un önündeki noktaya dikkat edin. Nokta, kuralın tüm alt alan adlarını kapsadığı anlamına gelir: api.example.com, git.example.com vb.

⚠️ Dikkat: NO_PROXY genellikle CIDR gösterimini ve alt ağ maskelerini anlamaz. 10.0.0.0/8 şeklindeki bir giriş çoğu araçta çalışmaz. Bazı modern kütüphane sürümleri bunu desteklese de buna güvenilmemelidir. Belirli adresleri ve alan adı soneklerini açıkça listeleyin.

Ayrıca NO_PROXY genellikle joker karakterleri evrensel bir şablon olarak desteklemez. *.example.com yazmayın — başında nokta kullanın: .example.com.

Öneri: NO_PROXY'ye her zaman localhost ve 127.0.0.1 adresini ekleyin. Aksi takdirde yerel istekler proxy üzerinden gider ve büyük olasılıkla çalışmaz.

✅ Kontrol: HTTP_PROXY, HTTPS_PROXY ve NO_PROXY'nin ne işe yaradığını, büyük-küçük harf farkını ve NO_PROXY'nin CIDR'ı sevmediğini biliyorsunuz. Artık pratiğe geçebiliriz.

Adım 1: Geçerli Oturumda Proxy'yi Etkinleştirme ve curl ile Kontrol Etme

Adımın amacı: Açık terminalde proxy'yi hızlıca etkinleştirmeyi ve çalıştığından emin olmayı öğrenmek. Bu ayarlar yalnızca terminal penceresi kapanana kadar yaşar — test için idealdir.

export ile değişkenleri ayarlama

export komutu, geçerli oturumda bir ortam değişkeni oluşturur. Kendi proxy URL'nizi kullanarak aşağıdaki komutları çalıştırın.

  1. Terminali açın.
  2. HTTP için komutu girin: export http_proxy="http://ivan:secret123@proxy.example.com:3128"
  3. HTTPS için komutu girin: export https_proxy="http://ivan:secret123@proxy.example.com:3128"
  4. Büyük harfle tekrarlayın: export HTTP_PROXY="$http_proxy"
  5. Bir kez daha: export HTTPS_PROXY="$https_proxy"
  6. İstisnaları ayarlayın: export no_proxy="localhost,127.0.0.1,.example.com"
  7. Tekrarlayın: export NO_PROXY="$no_proxy"

"$http_proxy" yapısı, URL'yi yeniden yazmamak için önceden tanımlanmış küçük harfli değişkenin değerini kullanır.

Öneri: URL'nin tamamının çift tırnak içinde olduğuna dikkat edin. Bu, bash kabuğunuzun özel karakterleri yanlış yorumlamasını önler.

curl ile kontrol etme

Şimdi değişkenlerin okunduğunu kontrol edelim. curl yardımcı programı bunun için mükemmeldir.

  1. Değişkenin ayarlandığını kontrol edin: echo $http_proxy — URL'nizi görmelisiniz.
  2. Ayrıntılı çıktı ile istek yapın: curl -v http://example.com
  3. Çıktıda Connected to proxy.example.com yazan satırı arayın — bu, curl'un proxy üzerinden gittiği anlamına gelir.

Yetkilendirme doğruysa ve proxy'ye erişilebilirse, yanıt olarak bir HTML sayfası alırsınız. 407 hatası görürseniz, sorun kullanıcı adı veya şifrededir — şifre kodlama bölümüne geri dönün.

Öneri: -v (verbose) bayrağı bağlantı ayrıntılarını gösterir. Bu, proxy hata ayıklama için ana aracınızdır. Onsuz, isteğin tam olarak nereye gittiğini göremezsiniz.

Geçerli oturumda proxy'yi devre dışı bırakmak için unset komutunu kullanın: unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY. Tüm değişkenler kaybolur.

✅ Kontrol: curl -v http://example.com komutu, proxy sunucunuz üzerinden bağlantıyı gösteriyor ve sayfanın içeriğini döndürüyorsa ilk adım başarıyla tamamlanmıştır.

Adım 2: Ayarı Kalıcı Hale Getirme

Adımın amacı: Proxy'nin sisteme her girişte otomatik olarak etkinleşmesini ve yeniden başlatmalara dayanmasını sağlamak. Burada birkaç seviye var, size uygun olanı seçin.

Seçenek A: Yalnızca kullanıcınız için ~/.bashrc aracılığıyla

~/.bashrc dosyası, sizin kullanıcınız altında etkileşimli bir terminal her açıldığında çalıştırılır. Bu en güvenli seçenektir — sistemdeki diğer kullanıcıları etkilemezsiniz.

  1. Dosyayı bir düzenleyiciyle açın: nano ~/.bashrc
  2. Dosyanın en sonuna gidin.
  3. Adım 1'deki export satırlarının aynısını ekleyin.
  4. Dosyayı kaydedin: Ctrl+O'ya basın, ardından Enter, sonra çıkmak için Ctrl+X.
  5. Yeniden başlatmadan değişiklikleri uygulayın: source ~/.bashrc
  6. Öneri: Düzenlemeden önce cp ~/.bashrc ~/.bashrc.backup komutuyla yedek alın. Bir şeyler ters giderse orijinali kolayca geri yükleyebilirsiniz.

    Seçenek B: Tüm sistem için /etc/environment aracılığıyla

    /etc/environment dosyası, tüm kullanıcılar için değişkenleri ayarlar ve bash dışında bile çalışır. Buradaki biçim özeldir: export sözcüğü olmadan, sadece İSİM=değer.

    1. Dosyayı yönetici haklarıyla açın: sudo nano /etc/environment
    2. export olmadan satırları ekleyin, örneğin: http_proxy="http://ivan:secret123@proxy.example.com:3128"
    3. Benzer şekilde https_proxy, HTTP_PROXY, HTTPS_PROXY, no_proxy, NO_PROXY ekleyin.
    4. Kaydedin ve çıkın.
    5. Uygulamak için sistemden çıkıp tekrar girin veya yeniden başlatın.

    Seçenek C: /etc/profile.d aracılığıyla

    Daha esnek bir sistem yöntemi, /etc/profile.d klasöründe ayrı bir betik oluşturmaktır. Buradaki tüm .sh dosyaları girişte çalıştırılır.

    1. Dosyayı oluşturun: sudo nano /etc/profile.d/proxy.sh
    2. İçinde, Adım 1'deki gibi normal export komutlarını kullanın.
    3. Dosyayı kaydedin.
    4. Çalıştırılabilir yapın: sudo chmod +x /etc/profile.d/proxy.sh

    Bu yöntem, tam kabuk sözdizimini desteklediği için /etc/environment'dan daha kullanışlıdır.

    Seçenek D: Sistem hizmetleri için systemd drop-in aracılığıyla

    Dikkat, bu önemli bir ayrıntıdır. systemd tarafından yönetilen arka plan hizmetleri, sizin ~/.bashrc dosyanızı okumaz ve genellikle /etc/environment'ı yok sayar. Onlar için ayrı bir yaklaşım gereklidir — drop-in dosyası.

    Diyelim ki belirli bir hizmetin (örneğin some-service) proxy üzerinden çalışması gerekiyor.

    1. Drop-in kataloğunu ve dosyasını şu komutla oluşturun: sudo systemctl edit some-service
    2. Bir düzenleyici açılacaktır. Ayarlar bloğunu girin.
    3. [Service] bölümüne şu şekilde satırlar ekleyin: Environment="HTTP_PROXY=http://ivan:secret123@proxy.example.com:3128"
    4. HTTPS_PROXY ve NO_PROXY için benzer Environment satırları ekleyin.
    5. Dosyayı kaydedin.
    6. Yapılandırmayı yeniden yükleyin: sudo systemctl daemon-reload
    7. Hizmeti yeniden başlatın: sudo systemctl restart some-service

    Environment yönergesi, değişkeni yalnızca bu hizmet için ayarlar. Bu, systemd hizmetleri için tek doğru yoldur.

    ⚠️ Dikkat: RHEL, CentOS, Fedora ve AlmaLinux'da yollar ve araçlar aynıdır — systemd aynı şekilde çalışır. Farklılıklar daha sonra, paket yöneticileri bölümünde ortaya çıkacaktır.

    ✅ Kontrol: Yeni bir terminal açın (elle export yaptığınız değil) ve echo $http_proxy komutunu çalıştırın. URL'nizi görüyorsanız, kalıcı ayar çalışıyor demektir.

    Adım 3: Paket Yöneticilerini ve Yardımcı Programları Ayrı Ayrı Yapılandırma

    Adımın amacı: Birçok araç ortam değişkenlerini okumaz veya kendi yapılandırma dosyalarına sahiptir. Hiçbir şeyin çalışmaması için her birini ayrı ayrı yapılandıralım.

    Ubuntu ve Debian'da apt

    apt paket yöneticisi genellikle sudo ile çalıştırılır ve değişkenlerinizi görmeyebilir. Kendi yapılandırma dosyasında proxy ayarlamak daha güvenilirdir.

    1. Dosyayı oluşturun: sudo nano /etc/apt/apt.conf.d/95proxies
    2. Satırı ekleyin: Acquire::http::Proxy "http://ivan:secret123@proxy.example.com:3128";
    3. HTTPS için satırı ekleyin: Acquire::https::Proxy "http://ivan:secret123@proxy.example.com:3128";
    4. Dosyayı kaydedin.
    5. Kontrol edin: sudo apt update

    Her satırın sonundaki noktalı virgüle dikkat edin — bu apt sözdiziminin zorunlu bir öğesidir.

    RHEL, Fedora, AlmaLinux'da dnf ve yum

    RHEL ailesi sistemlerinde apt yerine dnf ve yum kullanılır. Proxy ana yapılandırma dosyasında belirtilir.

    1. Dosyayı açın: sudo nano /etc/dnf/dnf.conf (eski sistemler için /etc/yum.conf)
    2. [main] bölümüne satırı ekleyin: proxy=http://proxy.example.com:3128
    3. Yetkilendirme gerekiyorsa, ayrı ayrı ekleyin: proxy_username=ivan ve proxy_password=secret123
    4. Dosyayı kaydedin.
    5. Kontrol edin: sudo dnf makecache

    dnf'de kullanıcı adı ve şifreyi URL içinde değil, ayrı yönergelerle belirtmek daha kolaydır.

    .npmrc aracılığıyla npm

    1. Proxy'yi komutla ayarlayın: npm config set proxy "http://ivan:secret123@proxy.example.com:3128"
    2. HTTPS için ayarlayın: npm config set https-proxy "http://ivan:secret123@proxy.example.com:3128"
    3. Ayarlar otomatik olarak ~/.npmrc dosyasına yazılacaktır.
    4. Kontrol edin: npm config get proxy

    pip.conf aracılığıyla pip

    1. Dizini oluşturun: mkdir -p ~/.config/pip
    2. Dosyayı açın: nano ~/.config/pip/pip.conf
    3. [global] bölümü ve proxy satırını ekleyin: proxy = http://ivan:secret123@proxy.example.com:3128
    4. Dosyayı kaydedin.
    5. Herhangi bir paketi kurarak kontrol edin: pip install requests

    Alternatif olarak proxy'yi doğrudan komutta da belirtebilirsiniz: pip install requests --proxy http://proxy.example.com:3128

    http.proxy aracılığıyla git

    1. Genel olarak ayarlayın: git config --global http.proxy "http://ivan:secret123@proxy.example.com:3128"
    2. Gerekirse HTTPS için ayrı ayrı: git config --global https.proxy "http://ivan:secret123@proxy.example.com:3128"
    3. Kontrol edin: git config --global --get http.proxy

    Ayarı kaldırmak için: git config --global --unset http.proxy

    SSH üzerinden ProxyCommand ile git

    Depoları SSH üzerinden klonluyorsanız (git@github.com şeklinde adres), http.proxy ayarı işe yaramaz — SSH farklı bir protokoldür. Burada ProxyCommand gerekir.

    1. Dosyayı açın: nano ~/.ssh/config
    2. İlgili ana bilgisayar için bir blok ekleyin: Host github.com satırı, ardından girintili olarak ProxyCommand nc -X connect -x proxy.example.com:3128 %h %p satırı
    3. Dosyayı kaydedin.
    4. netcat yardımcı programını yükleyin, yoksa: Ubuntu'da sudo apt install netcat-openbsd, RHEL'de sudo dnf install nmap-ncat.
    5. Burada %h ve %p, hedef ana bilgisayar ve port ile otomatik olarak değiştirilir. -X connect bayrağı, netcat'e HTTP proxy kullanmasını söyler.

      .curlrc aracılığıyla curl

      1. Dosyayı açın: nano ~/.curlrc
      2. Satırı ekleyin: proxy = "http://ivan:secret123@proxy.example.com:3128"
      3. Dosyayı kaydedin.

      Artık curl, ortam değişkenleri olmasa bile her zaman proxy kullanacaktır.

      .wgetrc aracılığıyla wget

      1. Dosyayı açın: nano ~/.wgetrc
      2. Satırları ekleyin: http_proxy = http://proxy.example.com:3128 ve https_proxy = http://proxy.example.com:3128
      3. use_proxy = on ekleyin
      4. Dosyayı kaydedin.

      PHP için composer

      Composer, HTTP_PROXY ortam değişkenini okur, bu nedenle genellikle ayrı bir ayar gerekmez. Açıkça belirtmek isterseniz, çalıştırma anında değişkeni kullanın: HTTP_PROXY=http://proxy.example.com:3128 composer install

      Go ve GOPROXY: Önemli Uyarı

      ⚠️ Dikkat: GOPROXY değişkeni, bizim anladığımız anlamda BİR proxy sunucusu DEĞİLDİR. Bunları karıştırmamak gerekir. GOPROXY, Go modüllerinin bir aynasını belirtir — kitaplıkların indirildiği bir hizmettir. Bu bir depo adresidir, ağ proxy'si değil.

      Go'nun internet'e normal proxy'niz üzerinden erişmesi için standart HTTP_PROXY ve HTTPS_PROXY değişkenlerini kullanın. Modül aynasını değiştirmek gibi ayrı bir göreviniz yoksa GOPROXY'yi varsayılan değerinde bırakın.

      Öneri: Şu kuralı hatırlayın — değişken adında PROXY sözcüğü varsa, bu mutlaka ağ proxy'nizle ilgili olduğu anlamına gelmez. GOPROXY, npm registry ve benzerleri — paket kaynaklarıyla ilgilidir.

      ✅ Kontrol: Yapılandırdığınız her araçla bir test işlemi gerçekleştirin: sudo apt update, npm install, git ls-remote vb. Hepsi ağa başarıyla erişmelidir.

      Adım 4: Docker ve Kubernetes'i Yapılandırma

      Adımın amacı: Docker özel bir durumdur. Proxy ayarlamak için üç farklı yeri vardır ve bunları karıştırmak tipik bir hatadır. Her birini inceleyelim.

      Yer 1: systemd drop-in aracılığıyla Docker arka plan programı

      Bu ayar, Docker'ın görüntüleri kayıt defterinden indirebilmesi için gereklidir. Docker arka plan programı systemd tarafından yönetilir, bu nedenle zaten bildiğimiz drop-in mekanizmasını kullanırız.

      1. Dizini oluşturun: sudo mkdir -p /etc/systemd/system/docker.service.d
      2. Dosyayı oluşturun: sudo nano /etc/systemd/system/docker.service.d/proxy.conf
      3. [Service] bölümünü ekleyin.
      4. Environment="HTTP_PROXY=http://proxy.example.com:3128" satırını ekleyin
      5. HTTPS_PROXY ve NO_PROXY için benzer satırları ekleyin.
      6. Yapılandırmayı yeniden yükleyin: sudo systemctl daemon-reload
      7. Docker'ı yeniden başlatın: sudo systemctl restart docker

      Kontrol etmek için: sudo systemctl show --property=Environment docker

      Yer 2: build-arg aracılığıyla görüntü oluşturma

      Bir görüntü oluştururken, Dockerfile içindeki komutlar (örneğin apt install) izole bir ortamda yürütülür ve ana bilgisayarın proxy'sini görmez. Proxy'nin açıkça iletilmesi gerekir.

      1. Dockerfile'da, ARG http_proxy ve ARG https_proxy talimatlarını RUN komutlarından önce ekleyin.
      2. Görüntüyü argümanları ileterek oluşturun: docker build --build-arg http_proxy=http://proxy.example.com:3128 --build-arg https_proxy=http://proxy.example.com:3128 -t myimage .

      ⚠️ Dikkat: Proxy şifresini doğrudan Dockerfile içine ENV talimatıyla yazmayın. Görüntü katmanlarında kalır ve görüntüye erişen herkes şifreyi görür. Tam olarak build-arg kullanın veya daha iyisi, oluşturma için şifresiz bir proxy kullanın.

      Yer 3: ~/.docker/config.json aracılığıyla konteynerleri başlatırken

      Çalıştırılan konteynerlerin otomatik olarak proxy değişkenlerini alması için Docker istemci yapılandırmasını ayarlayın.

      1. Dosyayı açın: nano ~/.docker/config.json
      2. default bölümüyle proxies bloğunu ekleyin.
      3. İçinde httpProxy, httpsProxy ve noProxy'yi kendi değerlerinizle belirtin.
      4. Dosyayı kaydedin.

      Artık her docker run komutunda değişkenler otomatik olarak konteynere iletilecektir.

      Kubernetes manifestinde değişkenler

      Kubernetes'te proxy, konteyner tanımında ortam değişkenleri aracılığıyla ayarlanır. Pod veya Deployment manifestinin env bölümüne, name HTTP_PROXY, HTTPS_PROXY, NO_PROXY ve karşılık gelen value ile öğeler ekleyin.

      Öneri: Kubernetes'teki gizli değerleri Secret nesnesinde saklayın ve valueFrom aracılığıyla bağlayın, şifreyi doğrudan manifeste yazmayın. Böylece şifre sürüm kontrol sistemine düşmez.

      ✅ Kontrol: docker pull hello-world komutunu çalıştırın — görüntü indirilmelidir. Ardından docker run --rm alpine env | grep -i proxy — konteyner içine iletilen değişkenleri göreceksiniz.

      Adım 5: CI'da Proxy Ayarlama — GitHub Actions ve GitLab Runner

      Adımın amacı: CI pipeline'larının proxy üzerinden çalışmasını, erişimi güvenli bir şekilde saklayarak ve şifreyi günlüklerde açığa çıkarmayarak sağlamak.

      Erişimi sırlarda saklama

      CI'nın ana kuralı: Proxy şifresini asla doğrudan YAML pipeline dosyasına yazmayın. Dosya depoda bulunur ve şifreyi herkes görebilir. Sır mekanizmasını kullanın.

      GitHub Actions'da sırlar, depo ayarlarından, Settings, ardından Secrets and variables, ardından Actions bölümüne eklenir. PROXY_URL adında bir sır oluşturun ve tam proxy URL'sini yapıştırın.

      GitLab'da sırlara CI/CD variables denir. Settings, ardından CI/CD, ardından Variables bölümüne eklenir. Hassas değerler için Masked ve Protected onay kutularını işaretleyin.

      GitHub Actions'ı yapılandırma

      1. Pipeline dosyasında (.github/workflows), job seviyesinde bir env bloğu ekleyin.
      2. HTTP_PROXY'yi, çift küme parantezi secrets.PROXY_URL sözdizimi ile sırdan gelen değere ayarlayın.
      3. Benzer şekilde HTTPS_PROXY ve NO_PROXY'yi ayarlayın.
      4. Bu değişkenler job'ın tüm adımlarında kullanılabilir olacaktır.

      GitLab Runner'ı yapılandırma

      GitLab'da iki seviye vardır. Değişkenler doğrudan .gitlab-ci.yml dosyasında variables bloğu aracılığıyla veya runner seviyesinde config.toml yapılandırmasında environment bölümü aracılığıyla ayarlanabilir.

      1. Proje için: .gitlab-ci.yml dosyasına, korumalı değişkenlere referans veren bir variables bloğu ekleyin.
      2. Runner'ın tüm projeleri için: Runner'ın config.toml dosyasını açın ve [[runners]] bölümüne, gerekli değişkenlerin listesiyle birlikte environment parametresini ekleyin.

      Günlüklerde şifreyi maskeleme

      Sırlar olsa bile, bir komut şifreyi yazdırırsa şifre yanlışlıkla günlüğe düşebilir. GitHub Actions, sırların değerlerini otomatik olarak yıldızlarla maskeler. GitLab'da bunu Masked onay kutusu sağlar — ancak bu yalnızca değer belirli gereksinimleri karşılıyorsa (bazı özel karakterler olmadan ve yeterli uzunlukta) çalışır.

      ⚠️ Dikkat: Tam proxy URL'sini günlüğe yazdıran -v bayrağı veya echo gibi komutlardan kaçının. Maskeleme olsa bile risk almamak daha iyidir. Hata ayıklama için yalnızca adres ve portu, kullanıcı adı ve şifre olmadan yazdırın.

      Öneri: Proxy URL'sini gömülü şifre olmadan saklayın, kullanıcı adı ve şifreyi ayrı sırlar olarak saklayın. Bu şekilde maskeleme ve döndürme daha kolaydır.

      ✅ Kontrol: Pipeline'ı manuel olarak çalıştırın. Bir ağ isteği gerçekleştiren adım (örneğin bağımlılık yükleme) başarıyla tamamlanmalıdır. Günlüklerde şifre görünmemelidir.

      Sonucu Kontrol Etme: Trafiğin Gerçekten Proxy Üzerinden Gittiğinden Emin Olma

      Ayarlamak yetmez — trafiğin gerçekten proxy üzerinden geçtiğini, doğrudan gitmediğini kanıtlamanız gerekir. İşte bir kontrol listesi.

      Ne çalışmalı kontrol listesi

      • Yeni bir terminalde echo $http_proxy komutu URL'nizi gösteriyor.
      • curl -v http://example.com, Connected to proxy satırını gösteriyor.
      • sudo apt update paket listelerini başarıyla güncelliyor.
      • git ls-remote uzak depoya erişiyor.
      • docker pull bir görüntü indiriyor.
      • CI pipeline'ı yeşil renkte tamamlanıyor.

      Güvenilir bir şekilde nasıl test edilir

      En dürüst yöntem, hedef sunucunun hangi harici IP adresini gördüğünü öğrenmektir. IP'nizi gösteren bir hizmete istek yapın. Proxy üzerinden gidiyorsa, kendi IP'niz yerine proxy sunucusunun IP adresini görürsünüz.

      1. Proxy olmadan istek yapın: env -u http_proxy -u https_proxy curl -s http://ifconfig.me — gerçek IP'nizi göreceksiniz.
      2. Proxy ile istek yapın: curl -s http://ifconfig.me — proxy'nin IP'sini göreceksiniz.
      3. İki adres farklıysa proxy çalışıyor demektir.

      Başka bir yöntem de, erişiminiz varsa proxy sunucusunun günlüklerine bakmaktır. İstekleriniz orada görünmelidir.

      Öneri: env -u komutu, değişkeni yalnızca tek bir komut için geçici olarak kaldırır, oturumu etkilemez. Proxy'li ve proxysiz davranışı karşılaştırmak için kullanışlıdır.

      ✅ Kontrol: Proxy ile IP adresi, doğrudan olandan farklıdır. Bu, trafiğin proxy üzerinden gittiğinin yüzde yüz kanıtıdır.

      Sık Karşılaşılan Hatalar ve Çözümleri

      Sık karşılaşılan sorunları inceleyelim. Biçim basit: sorun, neden, çözüm.

      Sorun 1: sudo değişkenleri devralmaz

      Neden: sudo varsayılan olarak güvenlik nedeniyle ortamı temizler. export komutlarınız sudo altındaki komuta ulaşmaz.

      Çözüm: Ortamı korumak için -E bayrağını kullanın: sudo -E apt update. Veya sudoers dosyası aracılığıyla kalıcı olarak kaydetmeyi ayarlayın. sudo visudo çalıştırın ve satırı ekleyin: Defaults env_keep += "http_proxy https_proxy HTTP_PROXY HTTPS_PROXY no_proxy NO_PROXY". Bundan sonra sudo bu değişkenleri her zaman iletecektir.

      Sorun 2: Sertifika hataları

      Neden: Bazı kurumsal proxyler HTTPS'yi yakalar ve sertifikaları kendi kök sertifikalarıyla değiştirir. Sistem bunu bilmez ve güvenilmeyen bağlantı hatası verir.

      Çözüm: Yöneticiden proxy'nin kök sertifikasını alın. Ubuntu ve Debian'da /usr/local/share/ca-certificates klasörüne .crt uzantılı olarak kopyalayın ve sudo update-ca-certificates çalıştırın. RHEL'de /etc/pki/ca-trust/source/anchors klasörüne koyun ve sudo update-ca-trust çalıştırın. Bundan sonra tüm araçlar proxy'ye güvenmeye başlayacaktır.

      Sorun 3: curl çalışır, apt çalışmaz

      Neden: curl ortam değişkenlerini okur, ancak sudo altındaki apt onları görmez ve kendi proxy yapılandırmasına sahip değildir.

      Çözüm: Adım 3'te açıklandığı gibi /etc/apt/apt.conf.d dosyasında proxy'yi yapılandırın. Bu, ortam değişkenlerinden ayrı bir ayardır ve apt'nin ihtiyacı olan tam olarak budur.

      Sorun 4: Özel karakterler içeren şifre

      Neden: Kodlanmamış şifredeki @, :, / karakterleri URL'nin ayrıştırılmasını bozar.

      Çözüm: Hazırlık bölümündeki percent-encoding yöntemini uygulayın. @'yi %40, :'yi %3A ile değiştirin vb.

      Sorun 5: Hata 407 Proxy Authentication Required

      Neden: Yanlış kullanıcı adı veya şifre ya da proxy yetkilendirme gerektiriyor ancak siz belirtmediniz.

      Çözüm: Kullanıcı adı ve şifreyi yeniden kontrol edin. URL'de yetkilendirme bilgilerinin olduğundan emin olun. Özel karakterlerin kodlamasını kontrol edin.

      Sorun 6: Dahili kaynaklara erişilemiyor

      Neden: Yerel ve dahili adreslere yapılan istekler, onları bilmeyen proxy üzerinden gidiyor.

      Çözüm: Bu adresleri NO_PROXY'ye ekleyin. localhost, 127.0.0.1 ve başında nokta olan dahili alan adlarını unutmayın.

      Sorun 7: Docker arka plan programı proxy'yi görmüyor

      Neden: Değişkenleri bashrc'de ayarladınız, ancak Docker arka plan programı systemd tarafından yönetiliyor ve onları okumuyor.

      Çözüm: Adım 4'teki systemd drop-in yöntemini kullanın, daemon-reload ve restart docker komutlarını unutmayın.

      Sorun 8: Ayarlar uygulanmadı

      Neden: Bashrc'yi düzenlediniz ancak terminali yeniden başlatmadınız.

      Çözüm: source ~/.bashrc komutunu çalıştırın veya yeni bir terminal penceresi açın.

      Ek Özellikler ve Gelişmiş Ayarlar

      Temel ayar çalıştığında, rahatlık ve esneklik artırılabilir.

      Proxy anahtarlama işlevleri

      ~/.bashrc dosyasına iki işlev eklemek kullanışlıdır: etkinleştirmek için proxy_on ve devre dışı bırakmak için proxy_off. proxy_on içine export komutlarını, proxy_off içine unset komutlarını koyun. Böylece geçiş tek bir komutla yapılır.

      Farklı görevler için farklı proxyler

      Ortamı tamamen değiştirmeden yalnızca bir komut için proxy ayarlayabilirsiniz. Örnek: https_proxy=http://other:3128 curl https://example.com. Değişken yalnızca bu komut için geçerlidir.

      SOCKS proxy

      SOCKS5 tipi bir proxy'niz varsa, URL'de socks5 şemasını ve ALL_PROXY değişkenini kullanın. curl için --socks5 bayrağı vardır. Tüm yardımcı programların SOCKS ile çalışamayacağını unutmayın.

      Öneri: Proxy'yi hiç desteklemeyen araçlar için proxychains gibi sarmalayıcılar vardır. Ancak bunları bilinçli kullanın, programın ağ çağrılarının davranışını değiştirirler.

      Özet yapılandırma tablosu

      Bu özeti el altında bulundurun. Biçim: araç — yapılandırma dosyası — değişken veya yönerge.

      • Shell oturumu — geçici olarak bellekte — export http_proxy ve HTTP_PROXY.
      • Kullanıcı — ~/.bashrc — değişkenlerin export edilmesi.
      • Tüm sistem — /etc/environment — export olmadan http_proxy.
      • Tüm sistem — /etc/profile.d/proxy.sh — değişkenlerin export edilmesi.
      • systemd hizmeti — systemctl edit ile drop-in — Environment yönergesi.
      • apt (Ubuntu, Debian) — /etc/apt/apt.conf.d/95proxies — Acquire::http::Proxy.
      • dnf, yum (RHEL) — /etc/dnf/dnf.conf — proxy, proxy_username, proxy_password.
      • npm — ~/.npmrc — proxy ve https-proxy.
      • pip — ~/.config/pip/pip.conf — global bölümünde proxy.
      • HTTPS üzerinden git — git global yapılandırması — http.proxy.
      • SSH üzerinden git — ~/.ssh/config — ProxyCommand.
      • curl — ~/.curlrc — proxy.
      • wget — ~/.wgetrc — http_proxy, https_proxy, use_proxy.
      • composer — ortam — HTTP_PROXY.
      • Docker arka plan programı — /etc/systemd/system/docker.service.d/proxy.conf — Environment.
      • Docker oluşturma — build komutu — build-arg http_proxy.
      • Docker konteynerleri — ~/.docker/config.json — proxies bloğu.
      • Kubernetes — Pod manifesti — HTTP_PROXY ile env.
      • GitHub Actions — workflow dosyası — secrets ile env bloğu.
      • GitLab — .gitlab-ci.yml veya config.toml — variables veya environment.

      SSS: Proxy Ayarları Hakkında Sık Sorulan Sorular

      Hem küçük hem de büyük harfli değişkenleri ayarlamak gerekli mi?

      Evet, bu en güvenilir stratejidir. Farklı programlar farklı büyüklükleri okur, bu nedenle her iki sürümü de ayarlamak sürprizleri ortadan kaldırır.

      curl proxy'yi görüyor da apt neden görmüyor?

      Çünkü sudo altındaki apt, ortam değişkenlerini devralmaz ve kendi yapılandırmasına sahiptir. Apt'yi /etc/apt/apt.conf.d içindeki bir dosya aracılığıyla ayrı ayrı yapılandırın.

      Bir komut için proxy'yi geçici olarak nasıl devre dışı bırakabilirim?

      Komuttan önce env -u http_proxy -u https_proxy kullanın. Bu, değişkenleri yalnızca bu çalıştırma için kaldırır.

      NO_PROXY'de bir alt ağ belirtebilir miyim?

      Genellikle hayır. NO_PROXY, CIDR gösterimini güvenilir bir şekilde anlamaz. Belirli adresleri ve başında nokta olan alan adı soneklerini listeleyin.

      GOPROXY benim proxy sunucum mu?

      Hayır. GOPROXY, Go modüllerinin bir aynasını belirtir, ağ proxy'sini değil. Go'da ağ proxy'si için HTTP_PROXY ve HTTPS_PROXY kullanın.

      Proxy şifresini nasıl güvenli bir şekilde saklayabilirim?

      CI'da sırları kullanın. Yerel olarak, 600 izinli .netrc dosyası veya bir şifre yöneticisi kullanın. Şifrenin komut geçmişine düşmesinden kaçının.

      SSH üzerinden git neden http.proxy üzerinden gitmiyor?

      Çünkü SSH ayrı bir protokoldür. İlgili ana bilgisayar için ~/.ssh/config dosyasında ProxyCommand ayarlayın.

      Proxy üzerinden sertifika hatası alıyorum, ne yapmalıyım?

      Proxy'nin kök sertifikasını sistem deposuna yükleyin ve Debian'da update-ca-certificates, RHEL'de update-ca-trust komutuyla güveni güncelleyin.

      Bashrc'deki ayarlar yeni oturumda çalışmıyor, neden?

      Muhtemelen yanlış dosyayı düzenlediniz, değişiklikleri kaydetmediniz veya yeni bir terminal açmadınız. echo ve source ile kontrol edin.

      Trafiğin gerçekten proxy üzerinden gittiğini nasıl kontrol ederim?

      Proxy'li ve proxysiz IP tespit hizmetine curl ile yapılan isteklerin dış IP'sini karşılaştırın. Farklı adresler proxy'nin çalıştığını doğrular.

      Sonuç: Ne Öğrendiniz ve Sonraki Adımlar

      Tebrikler, uzun bir yol katettiniz. Şimdi neler bildiğinizi özetleyelim.

      Doğru bir proxy URL'si oluşturmayı ve şifredeki özel karakterleri kodlamayı öğrendiniz. HTTP_PROXY, HTTPS_PROXY ve NO_PROXY değişkenlerini, büyük-küçük harf incelikleri ve istisna biçimi dahil olmak üzere anladınız. Bir oturumda proxy'yi etkinleştirmeyi ve kalıcı ayar yapmayı, systemd drop-in dahil olmak üzere birkaç yöntemle biliyorsunuz.

      Tüm anahtar araçlar için proxy yapılandırdınız: apt ve dnf, npm ve pip, HTTPS ve SSH üzerinden git, curl ve wget, composer ve ayrıca GOPROXY'nin önemli farkını anladınız. Docker'ın üç ayar yerini ve Kubernetes'teki değişkenleri öğrendiniz. Son olarak, GitHub Actions ve GitLab'da proxy'yi güvenli sır saklama ve şifre maskeleme ile yapılandırdınız.

      Sonraki adımlar: Bilginizi pratikle pekiştirin. Kılavuzu takip ederek bir test makinesinde sıfırdan proxy kurun. Kolaylık için anahtarlama işlevleri oluşturun. Proxy sunucunuzun günlüklerini inceleyerek trafiği kendi gözlerinizle görün.

      Gelişme yönü: Bir sonraki adım, Ansible gibi yapılandırma yönetim araçlarıyla ayarları otomatikleştirmek ve tek bir komutla onlarca makineye proxy dağıtmaktır. Ayrıca sertifikalar ve farklı proxy türleriyle çalışmayı daha derinlemesine öğrenmek faydalı olacaktır.

      Öneri: Bu kılavuzdaki özet tabloyu bir kopya kağıdı olarak saklayın. Belirli bir araç için proxy'nin nerede yapılandırıldığını hızlıca hatırlamanız gerektiğinde size çok zaman kazandıracaktır.

      Harika iş çıkardınız. Artık Linux terminalinde ve CI'da proxy sizin için bir gizem değil. Başarılı ayarlar ve istikrarlı bağlantılar dileriz.

      Yazar Hakkında

      Roman Melnikov

      Roman Melnikov

      Technical Writer and System Administrator

      İş Deneyimi: Technical writer and DevOps engineer with 9 years of experience. Created over 50 detailed guides on system configuration and administration. His instructions helped thousands of professionals successfully solve technical tasks. Popular author on Habr and YouTube.
      Eğitim: Bauman Moscow State Technical University. Information Systems and Technologies
      Uzmanlık:
      Technical Documentation DevOps System Administration Linux Docker and Kubernetes CI/CD Infrastructure Automation Cloud Technologies System Monitoring Bash and Python Scripting

      Makaleyi paylaşın: