NodeJS ile İleri Vekil Sunucusu Oluşturma

Mücahid KINCIR
Huawei Developers - Türkiye
3 min readJun 30, 2022

Giriş

Herkese Merhaba,

Bu yazımda vekil sunucu türlerinden ve NodeJS ile nasıl ileri vekil sunucu kodlayabileceğimizden bahsedeceğim.

Proxy (Vekil Sunucu), sizinle internetteki hedeflediğiniz ana bilgisayar arasındaki basit bir sunucudur. Temel olarak Forward Proxy (İleri Vekil Sunucu) ve Reverse Proxy (Ters Vekil Sunucu) olmak üzere iki tür vekil sunucu vardır.

Forward Proxy (İleri Vekil Sunucu)

Çoğunlukla, basit vekil sunucu terimi, İleri Vekil Sunucu’yu ifade eder. Sadece bir istemci ve bir sunucu arasında durur ve bir geçiş aracısı olarak görev yapar. Genellikle istemciler veya dahili ağ tarafından yerleştirilirler. İstekleri, yanıtları takip etmek, bazı etki alanlarına erişimi reddetmek, başlıkları değiştirmek, konumu değiştirmek vb. gibi çeşitli kullanım durumları olabilir.

İleri Vekil Sunucu

Reverse Proxy (Ters Vekil Sunucu)

Bu tür vekil sunucu, sunucular tarafından çoğunlukla güvenlik ve yük dengeleme amacıyla kullanılır. İstemciler, gerçek sunucular yerine bu ters vekil sunucularına gelir, ardından bu vekil sunucu, isteği gerçek sunucuya aktarır. Bir web sunucusu için, bu tür mimariyle ilişkili çeşitli faydalar vardır. Kötü niyetli kullanıcıları dışarıda tutabilir, sunucular arasındaki yük dengesini sağlayabilir ve statik içeriği önbelleğe alarak kaynak sunucularındaki yükü azaltabilir.

Ters Vekil Sunucu

Hadi Başlayalım

Bu kadar teori yeter, şimdi Node.js’de bir HTTP/HTTPS ileri vekil sunucusu yapalım.

Node.js’de net modülünü kullanacağız. NodeJS ve net modülü hakkında temel bilgilere sahip olduğunuzu varsayıyorum. Referanslar için resmi belgelere bakabilirsiniz:

https://nodejs.org/api/net.html

İlk önce 5858 portunu dinleyen basit bir net sunucusu oluşturuyoruz, bu sunucu istemcilerin bağlanması için bir vekil sunucu görevi görecek.

Sunucumuza bir istemci bağlandığında, istemci ile sunucu arasında bir soket alırız.

HTTP/HTTPS Ayrıştırma

HTTP ve HTTPS farklı protokollerdir, bu nedenle durumları ayrı ayrı ele alacağız. Bağlantıdan sonra, ana bilgisayar ayrıntılarını almak için yalnızca ilk paket verisine ihtiyacımız olacak. Bu nedenle, ilk paket verisini almak için once callback fonksiyonunu kullanacağız.

HTTP durumunda, istek bir host parametresi içerir ve HTTP için bağlantı noktası 80'dir. Bununla ilgili daha fazla bilgiyi https://hpbn.co/brief-history-of-http/#http11-internet-standard adresinden okuyabilirsiniz.

HTTPS durumunda, SSL şifrelemesi nedeniyle paketi okuyamıyoruz, bu nedenle ana bilgisayarı paketlerden okumak imkansızdır. Ancak asıl istekten önce, ana bilgisayarı içeren bir CONNECT isteği vardır ve bağlantı noktası 443 olacaktır. Daha fazla bilgi için RFC’ye göz atabilirsiniz https://tools.ietf.org/html/rfc7231#section-4.3.6

Sunucu Bağlantısı

Ana bilgisayar adını aldıktan sonra net.createConnection() kullanarak sunucuya bağlanıyoruz. Bağlantıdan sonra, clientToProxySocket’ı proxyToServerSocket’a yönlendiririz. Soketler, pipelanabilmeleri için akışlardan türetilir. Akışlar ve pipelar hakkında daha fazla bilgi için buraya bakabilirsiniz.

TL;DR pipe örneği aşağıdaki gibidir;

okunabilirKaynak.pipe(yazilabilirHedef)

Bağlantı sonrası kodumuzun son hali aşağıdaki gibidir.

Vekil Sunucu Testi

Vekil sunucu, normal bir nodejs sunucusu olarak başlatılır. node proxy.js

Artık sistemimizi veya tarayıcı vekil sunucumuzu 127.0.0.1 (yerel ana bilgisayar) ve 5858 numaralı bağlantı noktasına ayarlayabiliriz.
Firefox’ta Ağ ayarında vekil sunucumuzu ayarlayabiliriz, Chrome olması durumunda sistem genelinde vekil sunucumuzu ayarlamamız gerekir. Vekil sunucu kurulumundan sonra, tarayıcınızda bir site açmayı denerseniz, loglarda ana bilgisayarı ve diğer logları görebileceksiniz.

Firefox Vekil Sunucu Yapılandırması

--

--