Eğer مثال.ir gibi bir alan adını tarayıcıya yazdıysanız ve site açılmak yerine ERR_NAME_NOT_RESOLVED hatası aldıysanız ya da DNS panelinizde Farsça harfler yerine xn--mgbh0fb.ir gibi garip bir dizi gördüyseniz, sorun sizin ayarlarınızda değil. 2003'ten beri RFC 3492'de standartlaştırılan ve hâlâ çoğu teknik ekibin yanlış kullandığı Farsça alan adı depolama katmanıyla karşı karşıyasınız.
Farsça alan adı DNS'te var olmaz. Var olan şey, Unicode dizesinden Punycode algoritmasıyla oluşturulan bir ASCII etiketidir. "Farsça alan adı" ile karşılaştığınız her yerde, aslında aynı şeyin iki temsiliyle karşı karşıyasınız: insan tarafından okunabilir temsil ve çözümleyici tarafından çözülebilir temsil.
Punycode tam olarak neyi saklar
DNS'te alan adı etiketleri 63 bayt ve tam ad 253 bayt ile sınırlıdır. Punycode, Unicode dizesini xn-- önekiyle başlayan bir ASCII dizisine dönüştürür. Örneğin:
مثال.ir → xn--mgbh0fb.ir
ایران.ir → xn--mgba3a4f16a.ir
تست.ir → xn--hgbk6aj7f.ir
Bu dönüşüm kesindir. Bir girdi her zaman bir çıktı verir ve hiçbir çözümleyici onu başka türlü yorumlayamaz. Ancak önemli nokta şu: bu dönüşüm DNS'te değil, uygulama katmanında yapılır. Yani tarayıcıda مثال.ir yazdığınızda, tarayıcı önce IDNA kütüphanesiyle onu xn--mgbh0fb.ir biçimine dönüştürür ve sonra DNS sorgusu gönderir.
Terminalde bu dönüşüm otomatik değildir. dig ile doğrudan Farsça alan adı yazarsanız, aracın sürümüne bağlı olarak yanıt alabilir veya hata alabilirsiniz. Emin olmak için her zaman ASCII biçimini kullanın:
dig +short xn--mgbh0fb.ir A
dig +short xn--mgbh0fb.ir MX
dig +short xn--mgbh0fb.ir TXT
Bir Farsça alan adının hangi diziye dönüştüğünü görmek istiyorsanız, Linux'ta idn veya daha yeni GNU sürümlerinde idn2 aracı işi görür:
echo "مثال.ir" | idn2
# xn--mgbh0fb.ir
Neden bazı tarayıcılar Farsça alan adını ham gösterir
Tarayıcılar yıllardır IDN'i destekliyor, ancak hepsi aynı davranmıyor. Chrome ve Firefox alan adını Unicode biçiminde gösterir, ancak yalnızca tüm etiketler aynı yazı sisteminden ve aynı dilden ise. Bir Farsça etiket ile bir Latin etiket karışırsa, tarayıcı sahtecilik saldırısını önlemek için adı xn-- biçimine döndürür.
Bu davranış kasıtlıdır. IDN homograph adı verilen bir saldırı vardır; burada saldırgan, yazı tipinde asıl harfe benzer görünen başka bir alfabeden bir harfi değiştirir. Örneğin Farsça «ی» harfi ile Arapça «ي» harfi birçok yazı tipinde aynı şekilde görüntülenir, ancak farklı Unicode kodlarına sahiptir ve sonuç olarak farklı Punycode oluşturur. Bir phishing alan adı tam olarak bankanızın alan adına benzeyebilir ve DNS'te tamamen başka bir yerde olabilir.
Tarayıcılar bu sorunla "ya hep ya hiç" politikasıyla başa çıkar: ya tüm ad tutarlıdır ve Unicode gösterimi verir, ya da şüphelidir ve ASCII biçimini gösterir. Burada hata yapıyorlar: birçok teknik ekip, tarayıcı alan adını Farsça gösterdiği için her yerde aynı şekilde çalıştığını düşünür. Sonra web sunucusu günlüğünde Host header'ının xn--mgbh0fb.ir biçiminde geldiğini ve vhost'larının eşleşmediğini ve varsayılan sitenin döndüğünü görürler. Belirtisi şudur: site doğrudan IP ile açılır ama alan adıyla açılmaz ve access.log'da alan adı ASCII biçiminde kaydedilmiştir.
DNS kaydını hangi biçimle oluşturmalıyız
Kısa cevap: her zaman Punycode biçimiyle. İran DNS panelleri genellikle her ikisini de kabul eder ve kendileri dönüştürür, ancak yabancı paneller ve API'ler çoğu zaman yalnızca ASCII kabul eder. Kaydı Farsça harflerle kaydederseniz ve panel dönüşümü yanlış yaparsa, kayıt zone file'da çözümleyicinin asla sorgulamayacağı bir adla saklanır.
مثال.ir alan adı için sağlıklı bir zone file şöyledir:
$ORIGIN xn--mgbh0fb.ir.
@ IN A 185.xx.xx.xx
www IN CNAME xn--mgbh0fb.ir.
@ IN MX 10 mail.xn--mgbh0fb.ir.
@ IN TXT "v=spf1 include:_spf.example.com ~all"
MX kaydının sağ tarafında da Punycode biçimini yazmanız gerektiğine dikkat edin, aksi halde çözümleyici mail server'ı bulamaz. Aynı kural NS ve CNAME kayıtları için de geçerlidir. Alan adını bir sanal sunucuya bağlıyorsanız, Alan adını sanal sunucuya bağlama; A kaydından SSL'e tam rehber kayıtların tam sırasını ve sertifika düzenleme zamanını açıklar.
SSL ve Farsça alan adı: nerede takılırsınız
SSL sertifikaları 2008'den beri IDN alan adını destekler, ancak yalnızca Punycode biçiminde. CSR'de adı Farsça girerseniz, Let's Encrypt Error creating new order :: Cannot issue for "مثال.ir": Domain name contains an invalid character hatasıyla reddeder. Doğru yol, certbot'ta her zaman ASCII biçimini vermektir:
certbot certonly --webroot -w /var/www/html \
-d xn--mgbh0fb.ir -d www.xn--mgbh0fb.ir
Düzenlemeden sonra nginx'te de server_name'i ASCII biçimiyle yazmalısınız. Farsça yazarsanız, nginx onu farklı bir bayt dizisi olarak görür ve istek varsayılan vhost'a gider. Bu, Farsça alan adlarında "SSL kurulu ama site açılmıyor" sorununun en yaygın nedenlerinden biridir.
Kayıt ve yönetimde iki yaklaşımın karşılaştırması
| Konu | Unicode biçimi (Farsça) | Punycode biçimi (ASCII) |
|---|---|---|
| Kullanıcıya gösterim | Okunabilir ve tanıtılabilir | Okunamaz |
| DNS panel desteği | Değişken, bazı paneller dönüştürür | Her yerde çalışır |
| SSL desteği | Reddedilir | Standart |
| Homograph riski | Yüksek, çünkü kullanıcı farkı görmez | Sıfır, çünkü Unicode kodu açıktır |
| Günlük ve izleme | Normalleştirme gerektirir | Doğrudan kullanılabilir |
Bu ikisinden birini seçmek zorunda kalsam, altyapıyla ilgili her şey için Punycode'u seçerim. Unicode biçimini yalnızca site içeriğinde ve reklamlarda kullanırım. Nedeni basit: alan adıyla çalışan her araç, curl'den openssl s_client'a ve zone dosyalarına kadar, sonunda ASCII ile konuşur. Baştan ASCII ile çalışırsanız, hiçbir zaman sürprizle karşılaşmazsınız.
Unicode biçimini tercih ettiğim tek durum, tamamen Farsça markalaşma ve organik trafik için tasarlanmış ve teknik ekibinin her yerde normalleştirme yapması gerektiğini bilen bir alan adıdır. Bu durumda, uygulama kodunda her girdiyi kullanmadan önce Punycode'a dönüştüren bir normalleştirme fonksiyonu zorunludur.
Pratikte çok gördüğüm bir nokta
DNS ve web sunucusu günlüklerinde Farsça alan adları her zaman ASCII biçiminde görünür. Sorun gideriyorsanız ve bir alt alan adının neden çalışmadığını bilmiyorsanız, önce zone file'da hangi biçimle kaydedildiğine bakın. dig aracını ASCII biçimiyle çalıştırın ve yanıt gelirse, sorun DNS'te değil uygulama tarafındadır. Kayıtları incelemek ve farklı çözümleyicilerin yanıtlarını karşılaştırmak için DNS kayıtlarını sorgulama en hızlı yoldur. Kaydın doğru yayınlanıp yayınlanmadığından veya eski önbelleğin yanıt verip vermediğinden emin değilseniz, DNS yayılımı nedir ve neden zaman alır? TTL ve önbellek tam rehberi inceleme sırasını gerçek TTL değeriyle açıklar.
.ir alan adları için ek bir katman daha vardır: bunların kaydı ve yönetimi IRNIC üzerinden yapılır ve kullanıcı kimliği gerekir. Kayıt aşamasında takıldıysanız, IRNIC kimliği ile ir alan adı kaydı ve yönetimi tam rehberi adımları adım adım kapsar. Ve alan adınızın süresi dolmak üzereyse, Alan adı yenileme; süre dolumu ve alan adı kurtarma adımları tam rehberi kurtarma zaman penceresini tam olarak belirtir.
Bir pratik nokta daha: birden fazla Farsça alan adı barındıran bir sunucuda barındırıyorsanız, nginx'te server_name'i ASCII biçimiyle kullanın ve her alan adı için ayrı bir blok oluşturun. Birden fazla Farsça alan adını wildcard ile tek blokta birleştirmek çalışır, ancak dinamik alt alan adlarınız varsa, DNS'te wildcard kaydı ve dinamik alt alan adı yönetimi catch-all ile wildcard davranış farkını netleştirir. Sitenin kendisini barındırmak için de kararlı bir Linux ortamına ihtiyacınız varsa, Linux hosting nginx ve certbot yapılandırmasının ekstra zahmet olmadan yapıldığı bir seçenektir.
Sık sorulan sorular
Farsça alan adı DNS'te nasıl saklanır?
Farsça alan adı DNS'te, Unicode dizesinden Punycode algoritmasıyla oluşturulan xn-- önekli bir ASCII etiketi olarak saklanır. Örneğin مثال.ir, xn--mgbh0fb.ir biçimine dönüşür. Çözümleyiciler Unicode biçimini asla görmez; dönüşüm tarayıcıda veya uygulamada yapılır.
Tarayıcı Farsça alan adımı neden xn-- biçiminde gösteriyor?
Tarayıcı, alan adı etiketleri birden fazla yazı sisteminden veya birden fazla dilden olduğunda, görsel benzerlik saldırısını önlemek için adı ASCII biçimine döndürür. Bu davranış kasıtlıdır ve ayarlarınızda bir hata olduğunun göstergesi değildir. Tüm etiketler Farsça ve tutarlıysa, tarayıcı adı okunabilir biçimde gösterir.
Farsça alan adı için SSL sertifikası alabilir miyim?
Evet, ancak yalnızca Punycode biçimiyle. Sertifika isteğinde Farsça ad girerseniz, sertifika otoritesi geçersiz karakter hatasıyla reddeder. Certbot'ta ve nginx server_name'de her zaman xn-- biçimini yazın.
Farsça alan adının güvenlik açısından ana riski nedir?
IDN homograph saldırısı; yani bir harfin, yazı tipinde ona benzeyen ancak farklı Unicode koduna ve dolayısıyla farklı Punycode'a sahip başka bir alfabeden bir harfle değiştirilmesi. Kullanıcı adres çubuğunda farkı görmez ve saldırganın alan adına gider. Bu yüzden günlüklerde ve yapılandırmalarda ASCII biçimiyle çalışmak daha güvenlidir.