Site icon Baki ÇUBUK

Microsoft Exchange Server SE DAG Serisi – Bölüm 5: İstemci Erişimi, Namespace ve Load Balancing

Merhaba

Serinin dördüncü bölümünün sonunda, veritabanı kopyalarını ekleyerek verinin yüksek erişilebilirliğini (High Availability) tamamlamıştık. Artık verimiz iki sunucuda kopyalı, sağlıklı ve yüksek erişilebilir (High Availability). Peki kullanıcılar ve yöneticiler bu yapıya nasıl bağlanacak? Bir DAG kurmuş olmak, tek başına kesintisiz istemci erişimi anlamına gelmez; bu, ayrı bir katmandır. Serinin bu son bölümünde işin ikinci yarısını, yani istemci erişimini ele alıyoruz: Sunucularınızın adına tek tek değil, ortak bir isim (namespace) üzerinden, bir sunucu düşse bile kesintiye uğramayacak şekilde nasıl bağlanılacağını göreceğiz. EAC (Exchange admin center)/ECP (Exchange Control Panel) paneline DAG ortamında nasıl bağlanılacağını da bu bölümde netleştireceğiz.

Burada dikkat çeken nokta şu: DAG, veritabanı katmanının yüksek erişilebilirliğini sağlar. İstemci erişiminin yüksek erişilebilirliği ise ayrı bir katmandır ve namespace + load balancing ile kurulur. İkisi birbirini tamamlar ama biri diğerinin yerine geçmez.

Serinin Yol Haritası İçinde Bu Bölüm

İlk dört bölüm çekirdek DAG kurulumunu ve yönetimini kapsıyordu. Bu beşinci bölüm, tabloyu tamamlayan istemci erişimi katmanını ekliyor:

Bölüm Konu
Bölüm 1 DAG nedir, mimarisi ve temel kavramlar
Bölüm 2 Önkoşullar ve ortam hazırlığı
Bölüm 3 DAG oluşturma ve node ekleme
Bölüm 4 Veritabanı kopyaları, switchover ve yönetim
Bölüm 5 İstemci erişimi, namespace, sertifika ve load balancing

Exchange SE’de Client Access Nerede?

Öncelikle bir yanlış anlamayı düzeltelim: Exchange 2016 ve sonrasında (dolayısıyla Exchange SE’de) Client Access ayrı bir rol değildir. İstemci bağlantılarını karşılayan Client Access hizmetleri, doğrudan Mailbox rolünün bir parçasıdır. Yani senaryomuzdaki W25EXCNOD1 ve W25EXCNOD2‘nin her biri; OWA (Outlook Web Access), ECP (Exchange Admin Center), ActiveSync, EWS (Exchange Web Services), MAPI/HTTP, Outlook Anywhere ve Autodiscover isteklerini karşılar ve gerektiğinde aktif kopyanın bulunduğu sunucuya yönlendirir (proxy).

Bu şu anlama gelir: İstemci erişimini yüksek erişilebilir yapmak için ek bir sunucu kurmanıza gerek yok; elimizdeki iki Mailbox sunucusu zaten bu işi yapıyor. Bizim yapmamız gereken, kullanıcıları tek bir sunucu adına değil, her iki sunucuyu da temsil eden ortak bir isme yönlendirmek.

Namespace (İsim Alanı) Tasarımı

Namespace, kullanıcıların Exchange’e eriştiği DNS adıdır.

İki tür ad kullanacağız:

Modern ve önerilen yaklaşım, tek bir birleşik namespace (single unified namespace) kullanmaktır. Yani hem iç ağdan hem dış ağdan aynı mail.bakicubuk.com adına bağlanılır. Bu, hem yapılandırmayı hem de sertifika yönetimini basitleştirir.

Ad Kullanım Örnek
Birincil namespace OWA, ECP, EWS, ActiveSync, MAPI/HTTP mail.bakicubuk.com
Autodiscover Outlook otomatik yapılandırma autodiscover.bakicubuk.com
Burada dikkat çeken nokta şu: Aşağıdaki Exchange komutlarının tamamı, Organization Management rol grubuna üye bir hesapla ve Exchange Management Shell (EMS) Run as administrator (Yönetici olarak çalıştır) seçeneğiyle açılarak çalıştırılmalıdır.

Adım 1: Sanal Dizin (Virtual Directory) URL’lerini Ayarlama

Her iki sunucuda da tüm istemci protokollerinin sanal dizin URL’lerini aynı namespace’e yönlendirmemiz gerekir. Aşağıdaki scripti her iki sunucu için (W25EXCNOD1 ve W25EXCNOD2) sırayla çalıştırabilir ya da -Server parametresini değiştirerek uygulayabilirsiniz.

W25EXCNOD1 üzerindeki komut çıktısı.

$namespace = "mail.bakicubuk.com"

# OWA
Set-OwaVirtualDirectory -Identity "W25EXCNOD1\owa (Default Web Site)" `
  -InternalUrl "https://$namespace/owa" -ExternalUrl "https://$namespace/owa"

# ECP (EAC)
Set-EcpVirtualDirectory -Identity "W25EXCNOD1\ecp (Default Web Site)" `
  -InternalUrl "https://$namespace/ecp" -ExternalUrl "https://$namespace/ecp"

# EWS (Exchange Web Services)
Set-WebServicesVirtualDirectory -Identity "W25EXCNOD1\EWS (Default Web Site)" `
  -InternalUrl "https://$namespace/EWS/Exchange.asmx" -ExternalUrl "https://$namespace/EWS/Exchange.asmx"

# OAB (Offline Address Book)
Set-OabVirtualDirectory -Identity "W25EXCNOD1\OAB (Default Web Site)" `
  -InternalUrl "https://$namespace/OAB" -ExternalUrl "https://$namespace/OAB"

# ActiveSync
Set-ActiveSyncVirtualDirectory -Identity "W25EXCNOD1\Microsoft-Server-ActiveSync (Default Web Site)" `
  -InternalUrl "https://$namespace/Microsoft-Server-ActiveSync" -ExternalUrl "https://$namespace/Microsoft-Server-ActiveSync"

# MAPI/HTTP
Set-MapiVirtualDirectory -Identity "W25EXCNOD1\mapi (Default Web Site)" `
  -InternalUrl "https://$namespace/mapi" -ExternalUrl "https://$namespace/mapi"

# Outlook Anywhere (RPC/HTTP)
Set-OutlookAnywhere -Identity "W25EXCNOD1\Rpc (Default Web Site)" `
  -InternalHostname $namespace -ExternalHostname $namespace `
  -InternalClientsRequireSsl $true -ExternalClientsRequireSsl $true `
  -ExternalClientAuthenticationMethod Ntlm
Önemli: Yukarıdaki komutları ikinci sunucu için de (Identity’yi W25EXCNOD2\... yaparak) tekrarlayın. Amacımız, hangi sunucuya düşerse düşsün istemcinin hep aynı mail.bakicubuk.com adını görmesidir.
Dikkat (Outlook Anywhere): -ExternalHostname belirttiğinizde Exchange, bir dış kimlik doğrulama yöntemini de zorunlu tutar; bu yüzden komuta -ExternalClientAuthenticationMethod Ntlm parametresini ekledik. Aksi halde you must also specify the DefaultAuthenticationMethod or ExternalClientAuthenticationMethod parameter hatası alırsınız. Ortamınıza göre Ntlm yerine Negotiate de kullanabilirsiniz.

W25EXCNOD2 üzerindeki komut çıktısı.

$namespace = "mail.bakicubuk.com"

# OWA
Set-OwaVirtualDirectory -Identity "W25EXCNOD2\owa (Default Web Site)" `
  -InternalUrl "https://$namespace/owa" -ExternalUrl "https://$namespace/owa"

# ECP (EAC)
Set-EcpVirtualDirectory -Identity "W25EXCNOD2\ecp (Default Web Site)" `
  -InternalUrl "https://$namespace/ecp" -ExternalUrl "https://$namespace/ecp"

# EWS (Exchange Web Services)
Set-WebServicesVirtualDirectory -Identity "W25EXCNOD2\EWS (Default Web Site)" `
  -InternalUrl "https://$namespace/EWS/Exchange.asmx" -ExternalUrl "https://$namespace/EWS/Exchange.asmx"

# OAB (Offline Address Book)
Set-OabVirtualDirectory -Identity "W25EXCNOD2\OAB (Default Web Site)" `
  -InternalUrl "https://$namespace/OAB" -ExternalUrl "https://$namespace/OAB"

# ActiveSync
Set-ActiveSyncVirtualDirectory -Identity "W25EXCNOD2\Microsoft-Server-ActiveSync (Default Web Site)" `
  -InternalUrl "https://$namespace/Microsoft-Server-ActiveSync" -ExternalUrl "https://$namespace/Microsoft-Server-ActiveSync"

# MAPI/HTTP
Set-MapiVirtualDirectory -Identity "W25EXCNOD2\mapi (Default Web Site)" `
  -InternalUrl "https://$namespace/mapi" -ExternalUrl "https://$namespace/mapi"

# Outlook Anywhere (RPC/HTTP)
Set-OutlookAnywhere -Identity "W25EXCNOD2\Rpc (Default Web Site)" `
  -InternalHostname $namespace -ExternalHostname $namespace `
  -InternalClientsRequireSsl $true -ExternalClientsRequireSsl $true `
  -ExternalClientAuthenticationMethod Ntlm

Adım 2: Autodiscover’ı Yapılandırma

Outlook istemcileri, sunucu ayarlarını Autodiscover üzerinden otomatik bulur. İç ağdaki Autodiscover, Active Directory’deki Service Connection Point (SCP) kaydından okunur. Her iki sunucuda da bunu ortak adrese ayarlayalım:

Set-ClientAccessService -Identity "W25EXCNOD1" `
  -AutoDiscoverServiceInternalUri "https://autodiscover.bakicubuk.com/Autodiscover/Autodiscover.xml"

Set-ClientAccessService -Identity "W25EXCNOD2" `
  -AutoDiscoverServiceInternalUri "https://autodiscover.bakicubuk.com/Autodiscover/Autodiscover.xml"

Adım 3: Sertifika

Namespace’i tarayıcı ve istemciler açısından güvenilir kılmak için, hem mail.bakicubuk.com hem de autodiscover.bakicubuk.com adlarını kapsayan bir SSL sertifikası (SAN sertifikası) gerekir. Bu sertifika her iki sunucuya da kurulmalı ve aynı olmalıdır.

1.Sertifika istegi (CSR) oluştur ve dosyaya kaydet:

$req = New-ExchangeCertificate -GenerateRequest `
  -SubjectName "CN=mail.bakicubuk.com" `
  -DomainName mail.bakicubuk.com, autodiscover.bakicubuk.com `
  -PrivateKeyExportable $true
Set-Content -Path "C:\mail_csr.req" -Value $req


2. C:\mail_csr.req dosyasını CA’ya (ic AD CS ya da public CA) gönderip imzali .cer alın.

3. İmzalı sertifikayı içe aktar (thumbprint burada oluşur)

Import-ExchangeCertificate -FileData ([System.IO.File]::ReadAllBytes("C:\mail_cert.cer"))


4. Thumbprint’i bul ve hizmetlere ata

Get-ExchangeCertificate | Format-List Subject,Thumbprint,Services
Enable-ExchangeCertificate -Thumbprint "BURAYA_GERCEK_THUMBPRINT" -Services IIS,SMTP
İpucu: Aynı sertifikayı ikinci sunucuya da aktarın (Export-ExchangeCertificate / Import-ExchangeCertificate) ve orada da IIS hizmetine atayın. İki sunucunun aynı sertifikayı sunması, load balancer arkasında sorunsuz bir deneyim sağlar.
Sık yapılan hata: -GenerateRequest yalnızca bir istek (CSR) üretir; ortada henüz kurulu bir sertifika ve thumbprint yoktur. Bu yüzden isteği CA’ya imzalatıp Import-ExchangeCertificate ile içe aktarmadan Enable-ExchangeCertificate -Thumbprint ... çalıştırırsanız Missing an argument for parameter ‘Thumbprint’ hatası alırsınız. Yalnızca test amaçlı, tek adımda kurulu bir self-signed sertifika isterseniz -GenerateRequest parametresini kaldırın; bu durumda $cert.Thumbprint doğrudan kullanılabilir (ancak self-signed sertifikaya istemciler güvenmez).


Thumbprint’i Nerede Bulacağız?

Enable-ExchangeCertificate komutunda kullanacağınız thumbprint, Get-ExchangeCertificate ile listelenir. En pratik yol, yalnızca kendi namespace’inize ait sertifikayı süzmektir:

Get-ExchangeCertificate | Where-Object { $_.Subject -like "*mail.bakicubuk.com*" } |
  Format-List FriendlyName, Subject, Thumbprint, NotAfter, Services

Çıktıdaki 40 karakterlik hex değeri (Thumbprint) aradığınız değerdir; onu kopyalayıp komuta yapıştırabilirsiniz. Birden fazla sertifika varsa doğru olanı Subject (CN=mail.bakicubuk.com) ve NotAfter (son kullanma tarihi) sütunlarına bakarak ayırt edin.

Hiç kopyalamadan, doğrudan değişken üzerinden de geçebilirsiniz:

$cert = Get-ExchangeCertificate | Where-Object { $_.Subject -like "*mail.bakicubuk.com*" }
Enable-ExchangeCertificate -Thumbprint $cert.Thumbprint -Services IIS,SMTP
İpucu: Grafik arayüz tercih ederseniz thumbprint’i EAC > servers > certificates altında sertifikanın özelliklerinde ya da sunucuda certlm.msc (Local Computer > Personal > Certificates) üzerinden de görebilirsiniz. Enable-ExchangeCertificate çalıştığında varsayılan SMTP sertifikasının üzerine yazmak isteyip istemediğinizi sorabilir; onaylayabilirsiniz.

Sertifikayı İkinci Sunucuya Taşıma (PFX ile)

Sertifikayı W25EXCNOD1 üzerinde oluşturduk; aynı sertifikanın W25EXCNOD2‘de de bulunması gerekir. Burada kritik bir ayrıntı var: bir .cer dosyası özel anahtarı (private key) içermez. CSR’ı W25EXCNOD1‘de ürettiğimiz için özel anahtar oradadır. Bu yüzden ikinci sunucuya sertifikayı düz .cer olarak değil, özel anahtar dahil pfx. olarak taşımalıyız; aksi halde W25EXCNOD2’deki sertifika SSL için kullanılamaz.

1. W25EXCNOD1’de PFX olarak dışa aktarın:

$pfxPwd = ConvertTo-SecureString -String "GucluBirParola" -AsPlainText -Force
$pfx = Export-ExchangeCertificate -Thumbprint "W25EXCNOD1_THUMBPRINT" -BinaryEncoded -Password $pfxPwd
Set-Content -Path "C:\mail.pfx" -Value $pfx.FileData -Encoding Byte

2) C:\mail.pfx dosyasını W25EXCNOD2’ye kopyalayın.

3) W25EXCNOD2’de içe aktarın (parola ile):

$pfxPwd = ConvertTo-SecureString -String "GucluBirParola" -AsPlainText -Force
Import-ExchangeCertificate -FileData ([System.IO.File]::ReadAllBytes("C:\mail.pfx")) -Password $pfxPwd -PrivateKeyExportable $true

4) W25EXCNOD2’de hizmetlere atayın:

Enable-ExchangeCertificate -Thumbprint "AYNI_THUMBPRINT" -Services IIS,SMTP

Not: Bu aynı sertifika olduğu için thumbprint iki sunucuda da aynıdır. W25EXCNOD1’de bulduğunuz thumbprint, PFX içe aktarma sonrası W25EXCNOD2’de de geçerlidir; yine Get-ExchangeCertificate ile teyit edebilirsiniz. Kısacası akış: W25EXCNOD1‘de Export (.pfx) -> kopyala -> W25EXCNOD2‘de Import (.pfx) -> Enable.

Adım 4: Load Balancing

Şimdi sıra, mail.bakicubuk.com adına gelen trafiği iki Mailbox sunucusu arasında dağıtacak katmanda. Exchange 2016 ve sonrasının güzel yanı, istemci protokollerinin durumsuz (stateless) hale gelmiş olmasıdır; bu sayede oturum benzerliği (session affinity) gerektirmeyen basit Layer 4 (katman 4) load balancing yeterlidir.

İki temel yaklaşım:

Yaklaşım Açıklama Ne Zaman?
Layer 4 (TCP) İstemciyi IP/port bazında dağıtır, session affinity gerekmez Çoğu Exchange SE senaryosu için önerilen, sade yöntem
Layer 7 (HTTP) İçeriğe göre (URL/health) dağıtım, protokol bazlı sağlık kontrolü Protokol bazında ayrı sağlık takibi isteyen büyük ortamlar

Uygulama adımları:

  1. Load Balancer üzerinde bir VIP (Virtual IP address) tanımlayın; arka uç (backend) olarak W25EXCNOD1 ve W25EXCNOD2‘yi ekleyin (443/TCP).
  2. Sağlık kontrolü (health probe) olarak Exchange’in sunduğu https:///owa/healthcheck.htm sayfasını kullanın. Bu sayfa sağlıklı bir sunucuda 200 OK döner; sorunlu sunucu otomatik olarak havuzdan çıkarılır.
  3. mail.bakicubuk.com DNS kaydını bu VIP’e yönlendirin.
Küçük ortam alternatifi: Ayrı bir load balancer’ınız yoksa, geçici olarak DNS round robin (iki A kaydı) ile de dağıtım yapabilirsiniz. Ancak DNS round robin bir sunucu düştüğünde onu otomatik devre dışı bırakamaz; bu yüzden gerçek yüksek erişilebilirlik için bir load balancer önerilir.

DNS Kayıtları

Sık karıştırılan bir noktayı burada netleştirelim: IP-less DAG kurduğumuz için DAG’e ait bir IP adresi yoktur; ancak bunun namespace çözümlemesiyle hiçbir ilgisi yoktur. Atlanan şey, yalnızca DAG’in cluster yönetim erişim noktasıdır (CNO + cluster IP) ve istemciler zaten ona hiçbir zaman bağlanmaz. İstemciler DAG’e değil, Mailbox sunucularının üzerindeki Client Access hizmetlerine bağlanır. Dolayısıyla mail.bakicubuk.com, DAG’in IP’sine değil; ya Load Balancer’ın VIP (Virtual IP address) ya da doğrudan Mailbox sunucularının IP’lerine çözülür.

Load balancer varsa (önerilen): Namespace, tek bir A kaydıyla VIP (Virtual IP address)’e (Örneğimizde 192.168.1.210) bağlanır:

Kayıt Tür Hedef
mail.bakicubuk.com A 192.168.1.210 (LB VIP)
autodiscover.bakicubuk.com A 192.168.1.210 (LB VIP)

Load balancer yoksa (DNS round robin): Namespace, iki Mailbox sunucusunun MAPI IP’lerine ikişer A kaydıyla bağlanır:

Kayıt Tür Hedef
mail.bakicubuk.com A 192.168.1.202 (W25EXCNOD1)
mail.bakicubuk.com A 192.168.1.204 (W25EXCNOD2)
autodiscover.bakicubuk.com A 192.168.1.202 (W25EXCNOD1)
autodiscover.bakicubuk.com A 192.168.1.204 (W25EXCNOD2)
Split DNS (Dikkat): Active Directory domain adınız bakicubuk.local, namespace ise bakicubuk.com ise; iç DNS sunucunuzda bakicubuk.com için ayrı bir forward lookup zone oluşturup yukarıdaki mail ve autodiscover A kayıtlarını oraya eklemeniz gerekir (split-brain / split DNS). Aksi halde iç ağdaki istemciler mail.bakicubuk.com adını çözemez. Dış (public) DNS’te ise aynı adlar, dışarıdan erişim için firewall/NAT public IP’nize bakar.

Özetle akış şöyledir: bakicubuk.com -> (DNS) -> LB VIP -> W25EXCNOD1/W25EXCNOD2 Client Access -> aktif veritabanı kopyası.

Adım 5: EAC (ECP) Paneline DAG Ortamında Bağlanma

Sık sorulan bir soru: DAG’de EAC (Exchange admin center)’ye nasıl bağlanırız? Unutmayın, EAC (Exchange admin center)/ECP (Exchange Control Panel) DAG’in kendisine değil, sunucuların üzerindeki Client Access hizmetlerine bağlanır.

İki yol var:

Yönetim/sorun giderme için doğrudan sunucuya:

https://W25EXCNOD1/ecp?ExchClientVer=15

?ExchClientVer=15 parametresi, sizi Exchange Online’a yönlendirmeden on-premises EAC (Exchange admin center)’yi açmaya zorlar (özellikle karışık/hybrid ortamlarda faydalıdır). Organization Management üyesi bir hesapla giriş yapar ve servers > database availability groups altından DAG’i yönetirsiniz.

Sertifika uyarısı normaldir: Sunucu adıyla (https://W25EXCNOD1/ecp gibi) girdiğinizde tarayıcı bir sertifika ad uyuşmazlığı uyarısı verebilir. Bunun sebebi, sertifikanın mail.bakicubuk.com ve autodiscover.bakicubuk.com adlarını kapsaması; sunucunun kısa adını (W25EXCNOD1) kapsamamasıdır. Yönetim/sorun giderme amaçlı bu uyarıyı geçebilirsiniz. Uyarısız, temiz bir erişim için namespace üzerinden girin: https://mail.bakicubuk.com/ecp. Ayrıca iç bir CA kullanıyorsanız, kök CA sertifikasını istemcilerin Trusted Root Certification Authorities deposuna (Örneğin GPO ile) ekleyin; aksi halde ad doğru olsa bile güven hatası görülebilir.

Production (Üretim) ortak namespace üzerinden:

https://mail.bakicubuk.com/ecp

Bu adres load balancer üzerinden hangi sunucu ayaktaysa oraya düşer; böylece bir node bakımdayken bile EAC (Exchange admin center)’ye erişim sürer.

Adım 6: Doğrulama

Yapılandırmayı test edelim:

Sanal dizin URL’lerini topluca gözden geçirme:

Get-OwaVirtualDirectory | Format-Table Server,InternalUrl,ExternalUrl -AutoSize
Get-EcpVirtualDirectory | Format-Table Server,InternalUrl,ExternalUrl -AutoSize

Autodiscover URI kontrolü:

Get-ClientAccessService | Format-Table Name,AutoDiscoverServiceInternalUri -AutoSize

İstemci protokol servislerinin sağlığı

Get-ServerHealth -Identity "W25EXCNOD1" | Where-Object { $_.HealthSetName -like "*OWA*" -or $_.HealthSetName -like "*ECP*" }

Son olarak pratik testler: https://mail.bakicubuk.com/owa adresine tarayıcıdan girip oturum açın; ardından W25EXCNOD1‘i bakım moduna alıp (Bölüm 4‘teki StartDagServerMaintenance.ps1) aynı adrese tekrar erişerek trafiğin W25EXCNOD2 üzerinden kesintisiz sürdüğünü doğrulayın. Gerçek bir failover testi, tüm bu katmanın birlikte çalıştığını gösteren en iyi kanıttır.

Özet

Bu bölümde DAG’in üzerine istemci erişimi katmanını kurduk:

Genel görünüm:

Artık yalnızca verisi değil, istemci erişimi de yüksek erişilebilir olan tam bir Exchange Server SE DAG kurgusuna sahipsiniz. Bir sunucu bakımda ya da arızalı olsa bile kullanıcılar mail.bakicubuk.com üzerinden kesintisiz posta hizmeti almaya devam eder. Bu, serinin başında hedeflediğimiz uçtan uca yüksek erişilebilirliğin son parçasıydı.

Bu yazı, Microsoft’un resmi Exchange Server dokümantasyonundan yararlanılarak Türkçe olarak özgün biçimde hazırlanmıştır. Komutları üretim ortamında uygulamadan önce mutlaka bir test ortamında doğrulayın. Load balancer yapılandırması, kullandığınız ürünün (F5, HAProxy, KEMP, NGINX vb.) kendi dokümantasyonuna göre değişebilir.

Başka bir yazımızda görüşmek dileğiyle…

Exit mobile version