Reverse Proxy Nedir?

What is Reverse Proxy?

Reverse Proxy sunucusu, bilgisayar ağlarında bir veya daha fazla sunucudan istemci adına kaynakları alan bir vekil sunucu türüdür. Kaynakları daha sonra istemciye geri döndürür. İleri proxy, istemcilere yakın bir yerde çalışan Web sunucularla istemciler arasında aracı olan bir vekil sunucusudur. 

Proxy, genellikle yükü birkaç sunucu arasında dağıtmak, farklı web sitelerinden içeriği sorunsuz bir şekilde göstermek veya HTTP dışındaki protokoller üzerinden uygulama sunucularına işleme isteklerini iletmek için kullanılır.

NGINX bir isteği proxy'lediğinde, isteği belirtilen bir proxy sunucusuna gönderir, yanıtı alır ve istemciye geri gönderir. Belirli bir protokolü kullanarak bir HTTP sunucusuna (başka bir NGINX sunucusu veya başka bir sunucu) veya HTTP olmayan bir sunucuya (PHP veya Python gibi belirli bir çerçeve ile geliştirilmiş bir uygulamayı çalıştırabilen) istekleri proxy yapmak mümkündür. Desteklenen protokoller arasında FastCGI , uwsgi , SCGI ve memcached bulunur .

Reverse Proxy Kullanımı

  • Ters proxyler sunucularda varlığını ve özelliğini gizleyebilir.
  • Uygulama güvenlik duvarı özellikleri Web tabanlı saldırılara karşı koruyabilir.
  • Güvenli Web siteleri, SSL şifrelemesi Web sunucusu tarafından yürütülmez ters proxy sunucusuna devredilebilir.
  • Ters proxyler Web sunucuları üzerinden yükü azaltarak, Web isteklerine hızlı bir şekilde cevap verebilir.
  • Ters proxyler gelen trafiği yük dengeleme amaçlı Web uygulama sunucularına dağıtmak için de kullanılabilir.

Bu makalede, bir proxy sunucusunun temel yapılandırması anlatılmaktadır. Farklı protokoller üzerinden NGINX'ten proxy sunucularına bir isteği nasıl ileteceğinizi, proxy sunucusuna gönderilen istemci istek başlıklarını nasıl değiştireceğinizi ve proxy sunucularından gelen yanıtların arabelleğe alınmasını yapılandırmayı öğreneceksiniz. Bu makale nginx sunucusunun kurulu olduğunu varsaymaktadır.

Başlamadan önce nginx ile ilgili bir kaç kavramları bilmekte fayda var. 

  • Proxy_pass: Gelen isteği diğer bir sunucuya yönlendirmek ve oradan gelen isteği tekrar istemciye iletmek için kullanılır.
  • Proxy_redirect: İsteği olduğu gibi 3xx kodu ile diğer bir sunucunun sorumluluğuna yönlendirmek için kullanılır. Yönlendirme sonrasında proxy sunucusu aradan tamamen çekilir.
  • Upstream Kavramı: Nginx için bir veya daha fazla sunucuyu tanımlamak için kullanılan bloktur. Örneğin Nginx ile bir yük dengeleyici oluşturulmak istenildiğinde yönlendirme yapılacak sunucular upstream bloğu içinde tanımlanır.
  • Eğer aynı uygulamanızı lan ve wan üzerinde kullanacaksanız tek reverse proxy kullanabilirsiniz. Ancak wan üzerinde kullanmayacağınız uygulamayı dışarıdaki dns yerine içerideki dns adresine ekleyip kullanırsanız. Güvenlik açığı oluşacağınızı unutmayın. Bu yüzden iç ve dış kısımları ayırmak her zaman doğru olandır.
  • Load balancer kullanıp sanal ip adreslerini de nginx'e girebilirsiniz.
  • Lan ve Wan üzerinden kullanılan reverse proxy sunucuları farklı olması ve Wan tarafındaki reverse proxy sunucusunuz DMZ zone üzerinde olmasına dikkat ediniz.

Reverse Proxy DNS

Ters proxy ile yararlı bir şey yapmak için IP adreslerini kullanmayı bırakmanız ve DNS adlarını kullanmaya başlamanız gerekir. Bu, DNS adlarınızı bir yerde bildirmeniz gerektiği anlamına gelir. DNS sunucunuz da veya DNS hizmeti aldığınız yerde, bağlantı noktası yönlendirme ile genel IP adresinizi gösteriniz.

mehmet.com dış ip adresi
time.mehmet.com dış ip adresi
mail.mehmet.com dış ip adresi

DNS checker ile DNS yayılımını kontrol edebilir ve birçok ülkede bulunan DNS sunucularından herhangi bir etki alanının bilgilerini görmek için hızlı ve kolay bir şekilde bir DNS araması yapabilirsiniz. Alan adınızı ekledikten sonra, çözümleme işlemi biraz zaman alabilir.

https://dnschecker.org/

Eğer reverse proxy işlemini dış dünya değil iç ağ üzerinde kullanılacak ise bu durumda iç dns adresinize tüm alan adlarına nginx proxy server ip adresini vermeniz gerekmektedir. Nginx kendi içinde alan adlarına göre ayırıp sunuculara erişecektir.

mehmet.com 192.168.1.10
time.mehmet.com 192.168.1.10
mail.mehmet.com 192.168.1.10

Reverse Proxy http to http

Başlıkta http to http yazdım çünkü yapılan işlemler biraz farklı oluyor. Birazdan ne demek istediğimi anlayacaksanız. Şimdi işlemlere başlayalım.

Nginx’i yükledikten sonra, ilk olarak varsayılan sanal sunucu konfig dosyasını devre dışı bırakmak için aşağıdaki komutu kullanın.

sudo unlink /etc/nginx/sites-enabled/default 

Ters vekil sunucu oluşturmak ve bilgisini saklamak için /etc/nginx/sites-available dizini içinde .conf adında bir dosya oluşturmanız gerekiyor. En iyi kullandığınız editör ile bir dosya oluşturun.

sudo vi /etc/nginx/sites-available/reverse.conf 

Aşağıdaki görseldeki gibi bir uygulamanız olduğunu düşünün. Uygulamamızın çalıştığı gerçek ip ve port bilgilerini öğrenelim. 

NOT: Eğer uygulamalarınızı load balancer üzerinde tutuyorsanız, gerçek ip adresleri yerine virtual ip adreslerinide kullanabilirsiniz.

Aşağıdaki yapılandırma, bu konumda işlenen tüm isteklerin belirtilen adresteki proxy sunucusuna iletilmesiyle sonuçlanır. Bu adres, bir alan adı veya bir IP adresi olarak belirtilebilir. Adres ayrıca bir bağlantı noktası içerebilir. Örnekte, 80 numaralı bağlantı noktasında yapılan istekleri 5555 numaralı bağlantı noktasında dinleyen uygulamanıza yönlendirmek için Nginx'i ters ara sunucu olarak yapılandırmış olacaksınız.

server {
    listen 80;
    server_name draw.onkoloji.gov.tr;

location / {
    proxy_pass http://10.106.250.35:5555;

}

} 

Bu yapılandırma aşağıdakileri gösterir:

  • Nginx, tüm istekler için 80 numaralı bağlantı noktasını dinler.
  • proxy_pass yönergesi ile nginx istekleri http://10.106.250.35:5555; adresine yönlendirir.
  • server_name kısmı ise,  uygulamanız alan adı olacak şekilde yapılandırılmalıdır. Örneğin, draw.onkoloji.gov.tr 

Dosyayı kayıt edip çıkalım.

:wq!

Şimdi konfig dosyasını aktif etmek için aşağıdaki komutu kullanın.

sudo ln -s /etc/nginx/sites-available/proxy.conf /etc/nginx/sites-enabled/proxy.conf 

Değişiklikler şimdi kaydedilir ve bu değişikliklerin etkili olması için Nginx hizmetini yeniden başlatmanız gerekir. Hizmeti yeniden başlatmadan önce sudo nginx -t komutunu çalıştırarak yapılandırma dosyasını test edebilirsiniz. Bu komut çalıştırıldığında, Nginx yapılandırma dosyası söz dizimini denetler ve yapılandırma dosyasında başvurulan dosyaları açmaya çalışır.

sudo nginx -t 

Burada görebileceğiniz gibi, değiştirilen yapılandırma dosyası doğru görünüyor. Değişikliklerin etkili olması için Nginx'i yeniden başlatmamız gerekir:

sudo systemctl restart nginx 

Yeniden başlatmadan sonra, Nginx'in 80 numaralı bağlantı noktasına yapılan istekler için ters ara sunucu olarak çalışması gerektiğinden, gelen isteğinde bulunurken uygulamanızdan bir yanıt görmeyi beklersiniz.

Reverse Proxy http to https

Biraz önceki örnekte, arka tarafta çalışan uygulamamız http olarak çalışmaktaydı ve biz bunu yine http olarak yönlendirdik. Şimdi arka tarafta http çalışan uygulamamız https olarak yönlendirelim. Tüm işlemler en baştan gösterilecektir.

Bu uygulama bir SSL sertifikaya sahip olduğunuzu ve nginx sunucusuna attığınızı varsayar.

Nginx’i yükledikten sonra, ilk olarak varsayılan sanal sunucu konfig dosyasını devre dışı bırakmak için aşağıdaki komutu kullanın.

sudo unlink /etc/nginx/sites-enabled/default 

Ters vekil sunucu oluşturmak ve bilgisini saklamak için /etc/nginx/sites-available dizini içinde .conf adında bir dosya oluşturmanız gerekiyor. En iyi kullandığınız editör ile bir dosya oluşturun.

sudo vi /etc/nginx/sites-available/reverse.conf 

Aşağıdaki görseldeki gibi bir uygulamanız olduğunu düşünün. Uygulamamızın çalıştığı gerçek ip ve port bilgilerini öğrenelim. 

NOT: Eğer uygulamalarınızı load balancer üzerinde tutuyorsanız, gerçek ip adresleri yerine virtual ip adreslerini de kullanabilirsiniz.

Aşağıdaki yapılandırma, bu konumda işlenen tüm isteklerin belirtilen adresteki proxy sunucusuna iletilmesiyle sonuçlanır. Bu adres, bir alan adı veya bir IP adresi olarak belirtilebilir. Adres ayrıca bir bağlantı noktası içerebilir. Örnekte, 80 ve 443 numaralı bağlantı noktasında yapılan istekleri 5555 numaralı bağlantı noktasında dinleyen uygulamanıza yönlendirmek için Nginx'i ters ara sunucu olarak yapılandırmış olacaksınız.

NOT: ssl_certificate kısmındaki yollara kendi sertifikalarınızı ekleyiniz.

server {
    listen 80;
    server_name draw.onkoloji.gov.tr;
    return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name draw.onkoloji.gov.tr;


        ssl_certificate          /etc/pri/server.crt;
        ssl_certificate_key      /etc/pri/server.key;
       #ssl_trusted_certificate  /etc/pri/chain.pem;

       location / {
               proxy_set_header   X-Forwarded-For $remote_addr;
               proxy_set_header   Host $http_host;
               proxy_pass         http://10.106.250.35:5555;
       }

} 

Bu yapılandırma aşağıdakileri gösterir:

  • Nginx, tüm istekler için 80 numaralı bağlantı noktasını dinler.
  • proxy_pass yönergesi ile nginx istekleri http://10.106.250.35:5555; adresine yönlendirir.
  • server_name kısmı ise,  uygulamanız alan adı olacak şekilde yapılandırılmalıdır. Örneğin, draw.onkoloji.gov.tr 

Dosyayı kayıt edip çıkalım.

:wq!

Şimdi konfig dosyasını aktif etmek için aşağıdaki komutu kullanın.

sudo ln -s /etc/nginx/sites-available/proxy.conf /etc/nginx/sites-enabled/proxy.conf 

Değişiklikler şimdi kaydedilir ve bu değişikliklerin etkili olması için Nginx hizmetini yeniden başlatmanız gerekir. Hizmeti yeniden başlatmadan önce sudo nginx -t komutunu çalıştırarak yapılandırma dosyasını test edebilirsiniz. Bu komut çalıştırıldığında, Nginx yapılandırma dosyası söz dizimini denetler ve yapılandırma dosyasında başvurulan dosyaları açmaya çalışır.

sudo nginx -t 

Burada görebileceğiniz gibi, değiştirilen yapılandırma dosyası doğru görünüyor. Değişikliklerin etkili olması için Nginx'i yeniden başlatmamız gerekir:

sudo systemctl restart nginx 

Yeniden başlatmadan sonra, Nginx'in 80 ve 443 numaralı bağlantı noktasına yapılan istekler için ters ara sunucu olarak çalışması gerektiğinden, gelen isteğinde bulunurken uygulamanızdan bir yanıt görmeyi beklersiniz.

Reverse Proxy https to https

Başlıkta http to http yazdım çünkü yapılan işlemler biraz farklı oluyor. Birazdan ne demek istediğimi anlayacaksanız. Şimdi işlemlere başlayalım.

Nginx’i yükledikten sonra, ilk olarak varsayılan sanal sunucu konfig dosyasını devre dışı bırakmak için aşağıdaki komutu kullanın.

sudo unlink /etc/nginx/sites-enabled/default 

Ters vekil sunucu oluşturmak ve bilgisini saklamak için /etc/nginx/sites-available dizini içinde .conf adında bir dosya oluşturmanız gerekiyor. En iyi kullandığınız editör ile bir dosya oluşturun.

sudo vi /etc/nginx/sites-available/reverse.conf 

Aşağıdaki görseldeki gibi bir uygulamanız olduğunu düşünün. Uygulamamızın çalıştığı gerçek ip ve port bilgilerini öğrenelim. 

NOT: Eğer uygulamalarınızı load balancer üzerinde tutuyorsanız, gerçek ip adresleri yerine virtual ip adreslerinide kullanabilirsiniz.

Aşağıdaki yapılandırma, bu konumda işlenen tüm isteklerin belirtilen adresteki proxy sunucusuna iletilmesiyle sonuçlanır. Bu adres, bir alan adı veya bir IP adresi olarak belirtilebilir. Adres ayrıca bir bağlantı noktası içerebilir. Örnekte, 80 numaralı bağlantı noktasında yapılan istekleri 5555 numaralı bağlantı noktasında dinleyen uygulamanıza yönlendirmek için Nginx'i ters ara sunucu olarak yapılandırmış olacaksınız.

server {
    listen 80;
    server_name draw.onkoloji.gov.tr;

location / {
    proxy_pass http://10.106.250.35:5555;

}

} 

Bu yapılandırma aşağıdakileri gösterir:

  • Nginx, tüm istekler için 80 numaralı bağlantı noktasını dinler.
  • proxy_pass yönergesi ile nginx istekleri http://10.106.250.35:5555; adresine yönlendirir.
  • server_name kısmı ise,  uygulamanız alan adı olacak şekilde yapılandırılmalıdır. Örneğin, draw.onkoloji.gov.tr 

Dosyayı kayıt edip çıkalım.

:wq!

Şimdi konfig dosyasını aktif etmek için aşağıdaki komutu kullanın.

sudo ln -s /etc/nginx/sites-available/proxy.conf /etc/nginx/sites-enabled/proxy.conf 

Değişiklikler şimdi kaydedilir ve bu değişikliklerin etkili olması için Nginx hizmetini yeniden başlatmanız gerekir. Hizmeti yeniden başlatmadan önce sudo nginx -t komutunu çalıştırarak yapılandırma dosyasını test edebilirsiniz. Bu komut çalıştırıldığında, Nginx yapılandırma dosyası söz dizimini denetler ve yapılandırma dosyasında başvurulan dosyaları açmaya çalışır.

sudo nginx -t 

Burada görebileceğiniz gibi, değiştirilen yapılandırma dosyası doğru görünüyor. Değişikliklerin etkili olması için Nginx'i yeniden başlatmamız gerekir:

sudo systemctl restart nginx 

Yeniden başlatmadan sonra, Nginx'in 80 numaralı bağlantı noktasına yapılan istekler için ters ara sunucu olarak çalışması gerektiğinden, gelen isteğinde bulunurken uygulamanızdan bir yanıt görmeyi beklersiniz.

Reverse Proxy http to https

Biraz önceki örnekte, arka tarafta çalışan uygulamamız http olarak çalışmaktaydı ve biz bunu https olarak yönlendirdik. Şimdi arka tarafta https olarak çalışan uygulamamızı yine  https olarak yönlendirelim. Tüm işlemler en baştan gösterilecektir.

Bu uygulama bir SSL sertifikaya sahip olduğunuzu ve nginx sunucusuna attığınızı varsayar.

Nginx’i yükledikten sonra, ilk olarak varsayılan sanal sunucu konfig dosyasını devre dışı bırakmak için aşağıdaki komutu kullanın.

sudo unlink /etc/nginx/sites-enabled/default 

Ters vekil sunucu oluşturmak ve bilgisini saklamak için /etc/nginx/sites-available dizini içinde .conf adında bir dosya oluşturmanız gerekiyor. En iyi kullandığınız editör ile bir dosya oluşturun.

sudo vi /etc/nginx/sites-available/reverse.conf 

Aşağıdaki görseldeki gibi bir https çalışan uygulamamızın olduğunu düşünelim. Uygulamamızın çalıştığı gerçek ip ve port bilgilerini öğrenelim. 

NOT: Eğer uygulamalarınızı load balancer üzerinde tutuyorsanız, gerçek ip adresleri yerine virtual ip adreslerini de kullanabilirsiniz.

Aşağıdaki yapılandırma, bu konumda işlenen tüm isteklerin belirtilen adresteki proxy sunucusuna iletilmesiyle sonuçlanır. Bu adres, bir alan adı veya bir IP adresi olarak belirtilebilir. Adres ayrıca bir bağlantı noktası içerebilir. Örnekte, 80 ve 443 numaralı bağlantı noktasında yapılan istekleri 443 numaralı bağlantı noktasında dinleyen uygulamanıza yönlendirmek için Nginx'i ters ara sunucu olarak yapılandırmış olacaksınız.

NOT: ssl_certificate kısmındaki yollara kendi sertifikalarınızı ekleyiniz.

server {
    listen 80;
    server_name draw.onkoloji.gov.tr;
    return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name draw.onkoloji.gov.tr;


        ssl_certificate          /etc/pri/server.crt;
        ssl_certificate_key      /etc/pri/server.key;
       #ssl_trusted_certificate  /etc/pri/chain.pem;

       location / {
               proxy_set_header   X-Forwarded-For $remote_addr;
               proxy_set_header   Host $http_host;
               proxy_pass         https://10.106.250.187;
       }

} 

Bu yapılandırma aşağıdakileri gösterir:

  • Nginx, tüm istekler için 80 numaralı bağlantı noktasını dinler.
  • proxy_pass yönergesi ile nginx istekleri https://10.106.250.187 adresine yönlendirir.
  • server_name kısmı ise,  uygulamanız alan adı olacak şekilde yapılandırılmalıdır. Örneğin, draw.onkoloji.gov.tr 

Dosyayı kayıt edip çıkalım.

:wq!

Şimdi konfig dosyasını aktif etmek için aşağıdaki komutu kullanın.

sudo ln -s /etc/nginx/sites-available/proxy.conf /etc/nginx/sites-enabled/proxy.conf 

Değişiklikler şimdi kaydedilir ve bu değişikliklerin etkili olması için Nginx hizmetini yeniden başlatmanız gerekir. Hizmeti yeniden başlatmadan önce sudo nginx -t komutunu çalıştırarak yapılandırma dosyasını test edebilirsiniz. Bu komut çalıştırıldığında, Nginx yapılandırma dosyası söz dizimini denetler ve yapılandırma dosyasında başvurulan dosyaları açmaya çalışır.

sudo nginx -t 

Burada görebileceğiniz gibi, değiştirilen yapılandırma dosyası doğru görünüyor. Değişikliklerin etkili olması için Nginx'i yeniden başlatmamız gerekir:

sudo systemctl restart nginx 

Yeniden başlatmadan sonra, Nginx'in 80 ve 443 numaralı bağlantı noktasına yapılan istekler için ters ara sunucu olarak çalışması gerektiğinden, gelen isteğinde bulunurken uygulamanızdan bir yanıt görmeyi beklersiniz.

Specific

Uygulamalara göre bazen reverse proxy işlemi yaptıktan sonra sorun vermektedir. Yukarıdaki örneklerden reverse proxy mantığını anladıktan sonra, bu tür durumlarda aşağıdaki konfig'leri kullanabilirsiniz.

 server {
    listen 80;
    server_name draw.onkoloji.gov.tr;
    return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name draw.onkoloji.gov.tr;


        ssl_certificate          /etc/pri/server.crt;
        ssl_certificate_key      /etc/pri/server.key;
       #ssl_trusted_certificate  /etc/pri/chain.pem;

       location / {
        proxy_pass https://10.106.250.187/;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
       }
      
}
Blog'a Dön