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.
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:
- Birincil namespace: Tüm istemci protokollerinin bağlanacağı ortak ad: OWA (Outlook Web Access), ECP (Exchange Admin Center), EWS (Exchange Web Services), ActiveSync ve MAPI. Örneğimizde
mail.bakicubuk.com. - Autodiscover namespace: Outlook’un otomatik yapılandırma için kullandığı ad. Örneğimizde
autodiscover.bakicubuk.com.
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 |
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
W25EXCNOD2\... yaparak) tekrarlayın. Amacımız, hangi sunucuya düşerse düşsün istemcinin hep aynı mail.bakicubuk.com adını görmesidir.-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
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.-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
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
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ı:
- Load Balancer üzerinde bir VIP (Virtual IP address) tanımlayın; arka uç (backend) olarak W25EXCNOD1 ve W25EXCNOD2‘yi ekleyin (443/TCP).
- Sağlık kontrolü (health probe) olarak Exchange’in sunduğu
https:///owa/healthcheck.htmsayfasını kullanın. Bu sayfa sağlıklı bir sunucuda 200 OK döner; sorunlu sunucu otomatik olarak havuzdan çıkarılır. mail.bakicubuk.comDNS kaydını bu VIP’e yönlendirin.
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) |
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.
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:
- Exchange SE’de Client Access hizmetlerinin Mailbox rolüne dahil olduğunu, iki sunucunun da istemci isteklerini karşıladığını gördük.
- Ortak bir namespace (
mail.bakicubuk.com) ve Autodiscover adı tanımladık. - Tüm sanal dizin URL’lerini her iki sunucuda ortak namespace’e ayarladık.
- Namespace + Autodiscover’ı kapsayan SAN sertifikasını her iki sunucuya kurduk.
- Trafiği iki sunucu arasında dağıtan load balancing (Layer 4, healthcheck.htm sağlık kontrolü) katmanını kurduk.
- EAC’ye DAG ortamında hem doğrudan (
?ExchClientVer=15) hem de namespace üzerinden nasıl bağlanılacağını netleştirdik.
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…

