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.