Proxy Server Nedir ve Docker Container İçerisinde Proxy Server Nasıl Yapılandırılır?
Proxy Server Nedir?
Proxy server(Vekil sunucu), makinemiz ile internet arasında bir ara katman olarak görev yapan sunuculardır. Cihazımız ile internete erişirken, doğrudan değil de kendi üzerinden erişmemizi sağlarlar. Örneğin biz pumburo.github.io adresine gitmek istediğimiz zaman, cihazımız doğrudan adrese istek atmak yerine bu isteği vekil sunucuya yönlendirir ve gidilmek istenilen adrese vekil sunucu istek atar. İstek sonucu dönen cevap da önce vekil sunucuya gider ve oradan cihazımıza gelir.

Docker Container İçerisinde Proxy Server Nasıl Yapılandırılır?
Docker container içerisine proxy server yapılandırması yaparken debian imajını kullanacağım ve yapı içerisinde squid servisi çalışacak. Squid servisi, yapılandırma aşamasında belirlediğimiz portu dinleyerek, o porta gelen istekleri yakalayacak. Dockerfile oluşturarak başlayalım.
Öncelikle bir dizin oluşturuyoruz ve oluşturduğumuz dizinde Dockerfile isimli bir dosya oluşturuyoruz. Bu dosyanın uzantısız olmasına dikkat edilmelidir.
FROM debian:latest
MAINTAINER Mahmut Gur <a.mahmutgur@gmail.com>
RUN apt-get update \
&& apt-get install -y squid
RUN sed -i "s/http_access deny all/http_access allow all/g" /etc/squid/squid.conf
EXPOSE 3128/tcp
CMD service squid start && /bin/bash
Yukarıda yazdığım dockerfile içeriğini satır satır açıklamak istiyorum. Dockerfile içine yazılan satırlar, yazılan sıra ile çalışırlar.
1-) FROM debian:latest
Bu kısımda base imaj olarak debian imajını kullanacağımızı ve versiyon olarak son sürümü kullanacağımızı belirttik. Bu koşulda sistemimiz build ederken localde debian imajını arayacak, var ise o imaj üzerine build edecek, yok ise imajı çekip ardından build işlemini başlatacak.
2-) MAINTAINER Mahmut Gur <a.mahmutgur@gmail.com>
Bu kısım metadatadır. Author bilgisini içerir.
3-) RUN apt-get update && apt-get install -y squid
RUN’dan sonra yazdıklarımız, yeni imaj build ederken çalıştırılacak komutlardır. Bu örnekte paketleri güncelledik ve ardından squid paketini sisteme yükledik.
4-) RUN sed -i “s/http_access deny all/http_access allow all/g” /etc/squid/squid.conf
Bu kısımda da imaj build ederken komut çalıştırdık. Yaptığımız işlem squidin conf dosyası içerisinde düzenleme yapmak. Default olarak squid, dışarıdan gelen istekleri kabul etmez. Bu komut ile kabul etmesi yönünde değişiklik yaptık.
5-) EXPOSE 3128/tcp
Bu kısım da metadatadır. Buradaki amaç bizden sonra bu yapı üzerinde çalışacak kişiye kullandığımız portu belirtmektir.
6-) CMD service squid start && /bin/bash
Bu kısım build sonrası container run edilirken çalıştırılacak komutu içerir. Bu örnekte containerı run ederken servisi başlattık ve servis başladıktan sonra container kapanmasın diye bash kabuğunu başlattık.
Dockerfile hazırlandıktan sonra yapılması gereken işlem yeni imajı build etmek. Bunun için gereken komut docker build /Dockerfileın/olduğu/dosya/yolu şeklindedir.
Hazırladığım Dockerfileın olduğu dizine gidiyorum ve docker build . komutunu giriyorum.
Step 4/6 : RUN sed -i "s/http_access deny all/http_access allow all/g" /etc/squid/squid.conf
---> Running in e3a1a7252286
Removing intermediate container e3a1a7252286
---> 4c63150e8cbe
Step 5/6 : EXPOSE 3128/tcp
---> Running in 76fec7d09a56
Removing intermediate container 76fec7d09a56
---> 2905eff094ac
Step 6/6 : CMD service squid start && /bin/bash
---> Running in 5d819c0b68e6
Removing intermediate container 5d819c0b68e6
---> 900c7694094e
Successfully built 900c7694094e
Eğer her şeyi doğru yaptıysak, işlemimiz yukarıdaki şekilde bitmeli.
İmajlarımızı listelemek için docker image ls yada docker images komutlarından birini kullanabiliriz.
root@haylo:~/squid# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 900c7694094e 2 minutes ago 324MB
Yukarıda görebileceğimiz üzere imajımız kullanıma hazır bir şekilde oluşturulmuş. Şimdi hazırladığımız imajın isim ve versiyon bilgisini girelim.
root@haylo:~/squid# docker tag 900c7694094e pumburo/squid:1.0
root@haylo:~/squid# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
pumburo/squid 1.0 900c7694094e 5 minutes ago 324MB
Şimdi yaptığımız işlemlerin doğruluğunu test etmek için containerımızı run edelim. Öncelikle çalışacağımız porta firewall tarafında izin vermemiz gerekiyor. Benim çalıştığım sunucu debian olduğundan ufw allow 3129 komutu ile gerekli izni veriyorum.
root@haylo:~# ufw allow 3129
Rule updated
Rule updated (v6)
Benim üzerinde çalıştığım sunucuda 3128 portu dolu olduğundan containerın 3129 portunu dinlemesini istiyorum. Bunun için docker run -itd — name=proxy -p 3129:3128 pumburo/squid:1.0 komutunu kullanacağım. Bu komut sonrasında container 3129 portunu dinleyecek ve oraya gelen istekleri içerideki 3128 portuna yönlendirecek.
root@haylo:~# docker run -itd --name=proxy -p 3129:3128 pumburo/squid:1.0
42a878e80b1382bfe7e8ef9a065502c04ac3605bc8bfb83b72d40a070476baf7
root@haylo:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42a878e80b13 pumburo/squid:1.0 "/bin/sh -c 'service…" 4 seconds ago Up 3 seconds 0.0.0.0:3129->3128/tcp, :::3129->3128/tcp proxy
Görüldüğü üzere containerımız başarılı bir şeklide çalışmakta. Şimdi firefox üzerinde proxy ayarlarını yaparak ip sorgulaması yapalım.


Yukarıda görebileceğimiz üzere proxy ayarı yapılıyken ve değilken ip adreslerimiz farklı görünmekte.
Yaptığımız işlemleri bir de container içerisindeki loglardan doğrulamak için https://pumburo.github.io/ adresine proxy üzerinden gidiyorum ve /var/log/squid/access.log dosyasını kontrol ediyorum.
root@haylo:~# docker exec -it 42a878e80b13 bash
root@42a878e80b13:/# cat /var/log/squid/access.log | grep pumburo
1621946379.983 92 94.0.0.0 TCP_MISS/301 800 GET http://pumburo.github.io/ - HIER_DIRECT/185.199.108.153 text/html
Yukarıda görebileceğimiz üzre squid loglarına da gittiğim adres düşmüş.
docker push pumburo/squid:1.0 komutu ile oluşturduğum imajı dockerhuba pushluyorum. Bu işlem için dockerhub hesabınızın olması ve sisteminizde login olmuş olmanız gerekmektedir.
root@haylo:~# docker push pumburo/squid:1.0
The push refers to repository [docker.io/pumburo/squid]
6b291efbe86a: Pushed
e144c2e9ce99: Pushed
e2c6ff462357: Mounted from library/debian
1.0: digest: sha256:178bb1b09db1964db908f598865ab5b9ba32fce8685a233a71d414770422a5ca size: 950
Görüldüğü üzre oluşturduğum imaj dockerhuba pushlandı. Kendiniz build etmeden kullanmak isterseniz docker pull pumburo/squid:1.0 komutunu kullanarak oluşturduğum imajı kendi makinenize çekerek kullanabilirsiniz.
Okuduğunuz için teşekkür ederim.
Yazılarımın tamamı için https://pumburo.github.io/adresindeki blog ve projeler kısımlarını inceleyebilirsiniz.