MariaDB'ye başka bir makineden bağlanabilmek için üç şeyin birlikte doğru olması gerekir: sunucu TCP/IP bağlantılarını dinlemeli (skip-networking kapalı), doğru ağ arayüzünde dinlemeli (bind-address uygun değerde) ve bağlanan kullanıcının o hosttan gelen bağlantıya izin veren bir hesabı olmalıdır. Bunlara ek olarak sunucunun güvenlik duvarı 3306 numaralı portu (ya da kullandığınız portu) geçirmelidir. Bu dört katmandan biri eksikse bağlantı ya hiç kurulmaz ya da "Access denied" ile reddedilir.
Bu yazıda resmî "Configuring MariaDB for Remote Client Access" rehberini ve ilgili sistem değişkeni sayfalarını temel alarak her katmanı ayrı ayrı anlatıyoruz: yapılandırma dosyasında hangi satırı değiştireceğiniz, uzak hesapların host kısmının nasıl eşleştiği, güvenlik duvarı, bağlantıyı test etme ve değişikliği geri alma. Uzak erişimi açmak saldırı yüzeyini büyütür; yazı boyunca bunu nasıl sınırlayacağınızı da gösteriyoruz.
İki anahtar ayar: skip-networking ve bind-address

skip_networking açıksa (değeri 1) sunucu TCP/IP bağlantılarını hiç dinlemez; bütün etkileşim Unix'te soket dosyası, Windows'ta adlandırılmış kanal ya da paylaşılan bellek üzerinden olur. Varsayılan değer 0'dır ve belgeler yalnızca yerel istemcilerin bağlanmasına izin verilecekse bu seçeneği kullanmayı önerir. Değişken dinamik değildir; değiştirmek için sunucuyu yeniden başlatmanız gerekir.
bind_address sunucunun dinlediği adresi belirler. Sistem değişkeni sayfasına göre sunucu varsayılan olarak bütün adreslerde dinler ve değişkenin varsayılan değeri boş bir dizedir. Değer olarak bir host adı, bir IPv4 ya da IPv6 adresi verilebilir; "::" yalnızca IPv6 için bütün adresleri ifade eder. Belgeler, Debian ve Ubuntu gibi bazı sistemlerde değerin 127.0.0.1 olarak ayarlandığını, yani sunucunun yalnızca yerel makineden gelen bağlantıları dinlediğini belirtir. Uzak bağlantı rehberi de pek çok MariaDB paketinin güvenlik için 127.0.0.1'e bağlandığını söyler. MariaDB 10.11'den itibaren virgülle ayrılmış birden fazla adres verilebilir; böylece sunucuyu örneğin yalnızca yerel ve özel ağ arayüzlerinde dinletip genel arayüzü dışarıda bırakabilirsiniz. Bu değişken de dinamik değildir.
| Ayar | Değer | Sonuç |
|---|---|---|
| skip-networking | 1 (açık) | TCP yok; yalnızca soket bağlantıları |
| skip-networking | 0 (varsayılan) | TCP dinlenir; adres bind-address ile belirlenir |
| bind-address | boş (değişkenin varsayılanı) | Bütün adreslerde dinler |
| bind-address | 127.0.0.1 | Yalnızca yerel loopback üzerinden TCP |
| bind-address | 0.0.0.0 | Bütün IPv4 arayüzlerinde dinler |
| bind-address | virgülle ayrılmış liste | Yalnızca listedeki adreslerde dinler (10.11 ve sonrası) |
bind-address 127.0.0.1 iken başka bir makineden, hatta aynı makineden loopback olmayan bir IP ile bağlanmaya çalışırsanız rehbere göre şuna benzer bir hata alırsınız:
ERROR 2002 (HY000): Can't connect to MySQL server on 'myhost' (115)Yapılandırma dosyasını bulmak
Bu ayarlar sunucunun yapılandırma dosyasındadır. Rehber yaygın konumları şöyle sıralar: /etc/my.cnf, Debian ve Ubuntu'da sık görülen /etc/mysql/my.cnf, $MYSQL_HOME/my.cnf ve kullanıcıya özel ~/.my.cnf. Sunucunuzun hangi dosyaları hangi sırayla okuduğunu kesin olarak görmek için:
mariadbd --help --verboseÇıktıda "Default options are read from the following files in the given order" ile başlayan satır dosyaların listesini verir. Ana dosya çoğu zaman bir dizini !includedir ile dahil eder ve asıl ayar o dizindeki bir dosyada durur; aynı seçenek birden fazla dosyada varsa en son okunan geçerli olur. Bu kuralların ayrıntısı my.cnf yapılandırma dosyaları yazısında.
Uzak erişimi açmak
İlgili sunucu grubunu bulun. Rehber [mysqld] bölümünü örnek verir; MariaDB aynı ayarları [mariadb] ve [mariadbd] gruplarından da okur. Ardından:
skip-networkingetkinse satırı yorum yapın (#skip-networking) ya daskip-networking=0yazın.bind-address = 127.0.0.1varsa bütün IPv4 arayüzlerinde dinlemek için satırı yorum yapın ya da0.0.0.0yapın; yalnızca belirli bir arayüzde dinlemek için o arayüzün IP adresini yazın.- Rehber ayrıca
skip-bind-addresseklemenin de belirli bir adrese bağlanmayı kapatıp her yerde dinlemek anlamına geldiğini belirtir.
[mysqld]
bind-address = 0.0.0.0Güvenlik açısından daha iyi bir seçim, sunucunun yalnızca uygulama sunucularının ulaşabildiği özel ağ arayüzünde dinlemesidir. MariaDB 10.11 ve sonrasında yerel ve özel arayüzü birlikte verebilirsiniz; aşağıdaki özel ağ adresi yalnızca bir örnektir:
[mariadb]
bind-address = 127.0.0.1,10.0.0.5Dosyayı kaydedip sunucuyu yeniden başlatın; iki ayar da dinamik olmadığı için çalışan sunucuda SET GLOBAL ile değiştirilemez. systemd kullanan bir sistemde:
sudo systemctl restart mariadbRehberin önerdiği doğrulama, sunucunun etkin olarak hangi seçeneklerle başlayacağını yazdırmaktır. Birden fazla sunucu bölümü ya da skip-bind-address kullanıldıysa son belirtilen değer geçerli olur:
mariadbd --print-defaultsÇalışan sunucuda geçerli değeri SQL ile de okuyabilirsiniz:
SHOW GLOBAL VARIABLES LIKE 'bind_address';Kullanıcı hesapları: host kısmı nasıl eşleşir?

Sunucunun dinlemesi ilk adımdır; bağlanan kullanıcının o hosttan gelen bağlantıya izin veren bir hesabı da olmalıdır. MariaDB'de hesaplar 'kullanici'@'host' biçiminde tanımlanır ve 'ali'@'localhost' ile 'ali'@'192.0.2.20' iki ayrı hesaptır. CREATE USER sayfasına göre:
- Host belirtilmezse
'%'kabul edilir. - Host adında
%ve_joker karakterleri kullanılabilir veLIKEgibi eşleşir. - Bir IP aralığı için
'taban_ip/netmask'biçimi kullanılabilir; IPv6 adresleriyle netmask kullanılamaz. - Host eşleşmesi büyük-küçük harf duyarsızdır; host adları alan adlarıyla da IP adresleriyle de eşleşebilir.
- Linux'ta 127.0.0.1 loopback arayüzü
localhostile eşleşmez;localhostyalnızca Unix soket bağlantılarıyla eşleşir. - Birden fazla hesap eşleşirse MariaDB, joker içermeyen tam host adlarını önce olacak şekilde sıralayıp ilk eşleşeni seçer.
Uygulama sunucusunun bulunduğu alt ağdan bağlanacak, yalnızca kendi veritabanına yetkili bir hesap şöyle oluşturulabilir. Parola ve adresler örnektir:
CREATE USER 'uygulama'@'192.168.100.%' IDENTIFIED BY 'guclu-bir-parola';
GRANT SELECT, INSERT, UPDATE, DELETE ON magaza.* TO 'uygulama'@'192.168.100.%';Netmask biçimiyle aynı sınırlama belgelerdeki örnekte şöyle yazılır; bu hesap 247.150.130.0 ile 247.150.130.255 arasındaki adreslerden bağlanabilir:
CREATE USER 'maria'@'247.150.130.0/255.255.255.0';Var olan uzak hesapları görmek için rehberin sorgusu yerel adresleri dışarıda bırakarak listeler:
SELECT User, Host FROM mysql.user
WHERE Host <> 'localhost' AND Host <> '127.0.0.1' AND Host <> '::1';Anonim kullanıcı tuzağı
'melisa'@'%' hesabını oluşturduğunuz hâlde yerelden melisa olarak giremiyorsanız nedeni büyük olasılıkla anonim bir yerel hesaptır. Bağlantı sorunları rehberine göre ''@'localhost' hesabı daha belirli bir host eşleşmesi olduğu için önceliği alır. Çözüm ya 'melisa'@'localhost' hesabını ayrıca oluşturmak ya da anonim hesabı DROP USER ''@'localhost'; ile kaldırmaktır. Anonim hesapları kaldırmanın kolay yolu mariadb-secure-installation betiğidir.
Güvenlik duvarı
Sunucu doğru dinlese ve hesap doğru olsa bile sunucudaki yazılım ya da donanım güvenlik duvarı portu engelleyebilir. Rehberin RHEL/CentOS 7 örneği firewall-cmd kullanır; ilk komut kuralı kalıcı olarak ekler, ikincisi yeniden yükleyip uygular:
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reloadUbuntu'da UFW kullanıyorsanız kuralı yalnızca uygulama sunucusunun IP adresine açmanın yolları UFW güvenlik duvarı rehberinde anlatılıyor. Genel kural şudur: 3306'yı tüm internete açmak yerine yalnızca bağlanması gereken kaynak adreslere izin verin. SELinux etkin bir RHEL sisteminde varsayılan dışı bir port kullanırsanız, belgelerin başlatma sorunları sayfası bunun SELinux sorunlarına yol açabilecek durumlardan biri olduğunu not eder.
Portu değiştirmek
port sistem değişkeni TCP bağlantılarının dinlendiği portu belirler; varsayılanı 3306'dır ve dinamik değildir. Port değiştirmek tek başına bir güvenlik önlemi değildir, ama aynı makinede birden fazla sunucu çalıştırırken gereklidir. İstemci tarafında ise -P (--port) ile port verilir; komut satırında port vermek bağlantıyı TCP'ye zorlar.
[mariadb]
port = 3307Bağlantıyı test etmek
Önce sunucu makinesinin kendisinde TCP üzerinden bağlanmayı deneyin. Rehbere göre bind-address 127.0.0.1 olsa bile loopback üzerinden bu bağlantı genellikle çalışır:
mariadb --host=localhost --protocol=tcp --port=3306Ardından uzak makineden sunucunun adresiyle bağlanın. Ağ katmanını ayrı test etmek için bağlantı sorunları rehberi telnet önerir; "Connection refused" yanıtı bir ağ ya da güvenlik duvarı sorununa veya MariaDB'nin o arayüz ve portta TCP dinlemediğine işaret eder. İşletim sistemi hata kodunun anlamını perror aracıyla öğrenebilirsiniz; rehberin örneğinde 115 kodu sorgulanır:
telnet myhost 3306
perror 115Bağlantı kuruluyor ama kimlik doğrulama başarısız oluyorsa sorun artık ağda değil, hesaptadır: o hosttan gelen bağlantıyla eşleşen bir hesap olmayabilir, ya da anonim hesap öncelik alıyor olabilir. Hata kodlarının ayrıntılı listesi MariaDB sık hatalar yazısında.
Trafiği şifrelemek
Uzak bağlantıda parola ve veri ağ üzerinden geçer. Rehber, uzak erişimi açarken güçlü parolalar ve en az yetkiyle birlikte TLS kullanmayı da düşünmenizi önerir. İstemci tarafında --ssl, --ssl-ca gibi seçenekler bulunur; --ssl-verify-server-cert sunucu sertifikasındaki adı bağlandığınız host adıyla karşılaştırır. Sunucu tarafında bir hesabın yalnızca şifreli bağlantıyla girmesini CREATE USER ya da ALTER USER ifadesinin TLS seçenekleriyle zorunlu kılabilirsiniz. Kurulum adımları SSL/TLS şifreli bağlantı yazısında.
Senaryoya göre doğru ayar
Yukarıdaki katmanları birlikte düşündüğünüzde tipik iki senaryo ortaya çıkar. Birincisinde uygulama ve veritabanı aynı sunucudadır: uzak erişime hiç gerek yoktur, bind-address = 127.0.0.1 ya da yalnızca soket kullanılıyorsa skip-networking yeterlidir, hesaplar localhost hostuyla tanımlanır ve güvenlik duvarında 3306 açılmaz. İkincisinde uygulama sunucuları aynı özel ağdaki başka makinelerdir: sunucu yalnızca özel ağ arayüzünde dinler, hesapların host kısmı o alt ağla ya da tek tek uygulama sunucusu adresleriyle sınırlanır, güvenlik duvarı 3306'yı yalnızca bu kaynak adreslere açar ve bağlantı TLS ile şifrelenir. Her iki durumda da root uzaktan erişime kapalı kalır.
Değişikliği geri almak
Uzak erişime artık ihtiyaç yoksa rehberin önerdiği sırayla yerel kuruluma dönün: yapılandırma dosyasında bind-address = 127.0.0.1 değerini açıkça yazın ya da eklediyseniz skip-bind-address satırını kaldırın; amaç etkin değerin 127.0.0.1 olmasıdır. Sunucuyu yeniden başlatın ve gereksiz uzak hesapları ve yetkileri gözden geçirip kaldırın. Uzak erişim hiç gerekmiyorsa ve yalnızca soketle çalışan yerel uygulamalarınız varsa skip-networking daha da sıkı bir seçenektir.
Sık yapılan hatalar

- Sadece bind-address'i değiştirip hesabı unutmak: Sunucu artık dinler ama
'kullanici'@'localhost'hesabı uzaktan gelen bağlantıyla eşleşmez. - Ayarı yanlış dosyaya yazmak: Dahil edilen dizindeki başka bir dosya aynı seçeneği daha sonra okutuyorsa sizin satırınız ezilir.
mariadbd --print-defaultsile etkin değeri kontrol edin. - Yeniden başlatmadan sonucu beklemek:
bind_address,skip_networkingveportdinamik değildir. - root@'%' açmak: İnternete açık bir root hesabı parola tahmin saldırılarının ilk hedefidir.
- Güvenlik duvarını tüm dünyaya açmak: 3306'yı yalnızca uygulama sunucularının adreslerine açın.
- 127.0.0.1 ile localhost'u aynı sanmak: Linux'ta 127.0.0.1 TCP bağlantısıdır ve
localhosthostlu hesapla eşleşmez. - Şifresiz bağlantıyı genel ağ üzerinden kullanmak: Parolalar ve sorgu sonuçları ağda açık metin olarak taşınır; TLS kullanın.
Sık Sorulan Sorular
bind-address değişkeninin varsayılanı boşsa neden sunucum sadece yerelde dinliyor?
Değişkenin derleme varsayılanı boştur ve bu bütün adreslerde dinlemek anlamına gelir; ancak belgelere göre Debian ve Ubuntu gibi bazı dağıtımlar paketle gelen yapılandırma dosyasında değeri 127.0.0.1 yapar. Yani davranışı yapılandırma dosyanız belirler. SHOW GLOBAL VARIABLES LIKE 'bind_address'; çalışan sunucunun gerçek değerini gösterir.
Hem IPv4 hem IPv6 dinletebilir miyim?
Belgelere göre değer olarak IPv4 ya da IPv6 adresi verilebilir, "::" yalnızca IPv6'yı ifade eder ve MariaDB 10.11'den itibaren virgülle ayrılmış bir liste kabul edilir. Netmask biçimli hesap tanımlarının IPv6 ile kullanılamadığını da unutmayın.
Uzak bağlantı için ayrı bir port açmak daha güvenli mi?
Portu değiştirmek bağlantıları kimin kurabileceğini değiştirmez. Asıl koruma; sunucunun yalnızca gereken arayüzde dinlemesi, güvenlik duvarının kaynak adresleri sınırlaması, hesapların host kısmının dar tutulması, en az yetki ve TLS'tir.
Web uygulamam aynı sunucuda, uzak erişime ihtiyacım var mı?
Hayır. Uygulama aynı makinedeyse soket ya da 127.0.0.1 üzerinden bağlanır ve sunucunun dışarıya hiç açılmaması en güvenli düzendir. PHP uygulamalarında bağlantı ayarları için PHP PDO veritabanı bağlantısı yazısına, WordPress hataları için WordPress veritabanı bağlantı hatası yazısına bakabilirsiniz.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: MariaDB öğrenme rehberi · CREATE USER · GRANT ve REVOKE · SSL/TLS şifreli bağlantı · my.cnf dosyaları · UFW güvenlik duvarı