Birden fazla web sitesi aynı IP’den nasıl sunulur?
--
Bu flood’da aynı sunucu üzerinde birden fazla web sitesinin sunulmasını sağlayan Virtual Hosting
ve SNI - Server Name Indication
kavramlarını anlatacağım.
Virtual Hosting
web sunucular (Apache, Nginx, vb) tarafından sağlanan ve web sayfası sunumunda daha az sunucu kaynağı (işlemci, hafıza, IP, vb) ile daha fazla web sitesi sunmak üzere başvurulan bir yöntemdir. Web siteleri tek sunucuda toplanıp bakım maliyeti düşürülmüş olur.
Virtual Hosting
yöntemi sayesinde bir tek IP ile birçok web sitesi aynı sunucu üzerinde hizmet verebilir. Web sunucular aynı IP ve porta (80) gelen istekleri birbirinden ayrıştırabilmek için HTTP
paketindeki aşağıda da gösterilen Host
başlık parametresine bakarlar.
Bir sunucuda barındırılan bütün web siteleri için DNS
'ten aynı IP'ye yönlendirme yapılır. Böylece istemciler FQDN - Fully Qualified Domain Name
'leri kullanarak DNS
'ten IP'leri çözerek web sunucuya ulaşırlar. Web sunucu da Host
başlığından isteği ilgili sunucuya iletir.
Burada aslında sürekli web sunucu olarak belirtmiş olsak da pratikte ve büyük ölçekte istekleri yük dağıtıcılar (Load Balancer
) karşılar ve yük dağıtıcılar yine Host
başlığına bakarak isteğin hangi IP veya IP'lere dağıtılması gerektiğine karar verirler.
Aşağıda görüldüğü gibi web sitelerinin yüksek erişilebilirliğini sağlamak üzere genel olarak web istekleri bir yük dağıtıcıda karşılanır ve yük dağıtıcıdan sıralı olarak birkaç web sunucuya yönlendirilir. Bu web sunucular da Virtual Hosting
ile birkaç web sitesini sunarlar.
Herhangi bir neden dolayı FQDN yerine IP üzerinden bir web sitesine ulaşmamız gerektiğinde Virtual Host
'un çözülebilmesi için Host
başlığının manuel olarak eklenmesi gerekir. Aşağıdaki ekran çıktısında curl
'de bu kullanım örneklenmiştir.
HTTP
olarak sunulan sitelerde Host
başlığına bakarak istekleri birbirinden ayırmak mümkün olsa da HTTPS
'te paketlerin şifrelenmesi için gerekli olan SSL/TLS Handshake
'ten dolayı durum biraz daha karmaşıktır. HTTPS
sitelerde SNI - Server Name Indication
adlı eklentiyle istemci, web sunucu veya yük dağıtıcıya hangi web sitesine (example.com
) istek atacağını SSL/TLS Handshake
'in başında söyler. Bu sayede sunucu istemciye doğru web sitesinin (example.com
) sertifikasını gönderir, SSL/TLS Handshake
alınan bu sertifika ile devam ettirilir.
Aşağıdaki ekran görüntüsünde SSL/TLS Handshake
'in ilk adımı olan Client Hello
mesajında https
olarak ulaşılmaya çalışılan sitenin sunucu isminin gönderildiği görülmektedir.
SSL/TLS Handshake
'in detayları için önceki flood'a göz atılabilir https://medium.com/@gokhansengun/20e27c9f9668
SNI
aynı IP'de aynı domain altında olma zorunluluğu olmadan birçok web sitesinin sunulmasını sağlasa da önemli bir dezavantaj getirmektedir. Ağı dinleyen bir kişi ya da servis sağlayıcı, trafik HTTPS de olsa istemcinin hangi siteye erişim sağladığını görebilir.
Yukarıdaki dezavantaja rağmen SNI
IPv4 adreslerin sınırlı olması yani her web sitesine ayrı bir IP vermenin imkansız olması sebebiyle önemli bir problemi çözmektedir. Son dönemde ortaya atılan ve SNI
'ın dezavantajını adresleyen ESNI
'ı ilerleyen flood'larda ele alacağız.
Son olarak HTTPS
ile sunulan bir web sitesine IP ile ulaşmaya çalışılırken istemcinin muhakkak SNI
bilgisini sağlaması gereklidir. Tarayıcı ve komut satırı istemcilerinde (curl
, http
) otomatik sağlanan SNI
, openssl
istemcisine manuel olarak verilmelidir.