Linux VDS MySQL Uzaktan Bağlantı Açma ve Güvenlik Yapılandırması
Linux VDS üzerinde MySQL ve MariaDB uzaktan bağlantısı açma, bind-address ayarı, kullanıcı IP yetkilendirmesi, UFW güvenlik duvarı ve SSH tünelleme.
İçindekiler
Linux VDS üzerinde MySQL veya MariaDB veritabanına uzaktan bağlanmak; web sunucusu ile veritabanı sunucusunu birbirinden ayırmak, harici yönetim araçlarıyla (DBeaver, MySQL Workbench) sorgu çalıştırmak veya oyun sunucularının verilerini merkezi bir sunucuda toplamak için sıkça tercih edilir. Varsayılan kurulumlarda MySQL yalnızca yerel makineyi dinler ve dışarıdan gelen bağlantıları reddeder. Dış erişimi açmak için dinleme adresini düzenlemek, kullanıcıya belirli bir IP üzerinden yetki tanımlamak ve güvenlik duvarı seviyesinde gerekli kısıtlamaları uygulamak gerekir.
Ağ ve veritabanı servislerinde değişiklik yapmadan önce sunucu durumunu korumak önemlidir. TREAS altyapısında her VPS ve VDS için 1 adet ücretsiz snapshot hakkı sunulur. Yapılandırma dosyalarını değiştirmeden önce müşteri panelinden bir anlık görüntü oluşturduğunuzda, olası bir kural veya erişim hatasında sisteminizi saniyeler içinde eski çalışan durumuna döndürebilirsiniz.
1. MySQL dinleme adresini (bind-address) yapılandırma
Linux dağıtımlarında MySQL servisi, güvenlik amacıyla yalnızca yerel geri döngü adresini (127.0.0.1) dinleyecek şekilde kurulur. Bu durum, sunucu dışındaki hiçbir istemcinin TCP 3306 portuna ulaşamaması anlamına gelir.
Paket listesini güncelleyip MySQL sunucu paketini kurun:
DEBIAN_FRONTEND=noninteractive apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server
MySQL servisinin dış ağ isteklerini kabul etmesi için ana yapılandırma dosyasında yer alan bind-address direktifini düzenlemeniz gerekir. Ubuntu sistemlerde bu dosya /etc/mysql/mysql.conf.d/mysqld.cnf yolunda bulunur.
Aşağıdaki komutla bind-address değerini tüm ağ arayüzlerini dinleyecek biçimde 0.0.0.0 olarak güncelleyin ve değişikliği doğrulayın:
sed -i 's/^bind-address\s*=.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
grep -E "^bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf
Çıktıda direktifin aşağıdaki gibi güncellendiğini teyit edin:
bind-address = 0.0.0.0
Eğer sunucunuzda MariaDB kuruluysa yapılandırma dosyası genellikle /etc/mysql/mariadb.conf.d/50-server.cnf yolundadır ve aynı satır bu dosya içinde de düzenlenebilir.
Yapılan değişikliğin devreye girmesi için MySQL servisini yeniden başlatın:
systemctl restart mysql
Servisin TCP 3306 portunu tüm arayüzlerde (0.0.0.0:3306) dinlemeye başladığını doğrulamak için soket durumunu inceleyebilirsiniz:
ss -tlpn | grep 3306 || true
2. MySQL kullanıcı yetkilendirmesi: Güvenli IP kısıtlaması
Dinleme adresi açıldıktan sonra dışarıdan bağlanacak istemci için bir veritabanı kullanıcısı oluşturulmalıdır. MySQL 8.0 ve güncel sürümlerde kullanıcı oluşturma ve yetki verme adımları birbirinden ayrı komutlarla yürütülür.
Yaygın yapılan en büyük güvenlik hatası, 'kullanici'@'%' şeklinde genel bir joker karakter kullanarak kullanıcının internetteki herhangi bir IP adresinden bağlanmasına izin vermektir. Bu yaklaşım, parolanız zayıfsa veritabanınızı otomatik kaba kuvvet saldırılarına açık hale getirir. En doğru yöntem, yetkiyi yalnızca bağlanacak istemcinin veya web sunucusunun statik IP adresiyle sınırlandırmaktır.
MySQL yönetim konsoluna bağlanın:
# örnek, çalıştırma
mysql -u root -p
Konsolda hedef veritabanını oluşturun, yalnızca belirlenen statik IP adresinden bağlanabilecek bir kullanıcı tanımlayın ve gerekli izinleri verin:
CREATE DATABASE IF NOT EXISTS uygulama_db;
CREATE USER 'db_kullanici'@'203.0.113.50' IDENTIFIED BY 'GucluParola_123!';
GRANT ALL PRIVILEGES ON uygulama_db.* TO 'db_kullanici'@'203.0.113.50';
FLUSH PRIVILEGES;
EXIT;
Burada 203.0.113.50 yerine uzaktan bağlanacak uygulamanızın ya da ofisinizin sabit dış IP adresini yazmalısınız. Eğer istemcinizin sabit bir IP adresi yoksa doğrudan port açmak yerine aşağıda anlatılan SSH tünelleme yöntemini tercih etmeniz tavsiye edilir.
3. UFW ile 3306 portunu yalnızca belirli IP adresine açma
Servis dinlemeye açılsa ve kullanıcı tanımlansa bile, sunucu işletim sistemi düzeyindeki güvenlik duvarı portu engelliyorsa bağlantı kurulamaz. Detaylı kurallar için VDS port açma ve güvenlik duvarı rehberimizi inceleyebilirsiniz.
Veritabanı portunu (3306/tcp) tüm internete genel olarak açmak yerine, yalnızca yetkilendirilen istemci IP adresine izin veren bir kural tanımlanmalıdır:
# örnek, çalıştırma
sudo ufw allow from 203.0.113.50 to any port 3306 proto tcp
sudo ufw status verbose
Bu kural sayesinde dünyadaki diğer tüm IP adreslerinden gelen 3306 istekleri işletim sistemi düzeyinde doğrudan düşürülür; böylece port tarama botlarının gürültüsü ve yetkisiz erişim girişimleri sunucuya ulaşamaz. Sunucu güvenliğinizi daha kapsamlı sıkılaştırmak için Linux VDS sunucu güvenliği rehberimizdeki adımları da uygulayabilirsiniz.
Ayrıca TREAS bünyesindeki tüm sunucularda Mars İstanbul Veri Merkezi altyapısında 12 Tbps kapasiteli TRSHIELD DDoS koruması standart olarak devrededir; bu altyapı ağ katmanında hacimli TCP saldırılarını filtreleyerek sunucunuzun erişilebilir kalmasını destekler.
4. Uzaktan bağlantıyı istemci üzerinden test etme
Yapılandırma tamamlandıktan sonra, uzaktaki istemci makinenin terminalinden veya komut satırından bağlantının kurulabildiği test edilmelidir.
İstemci bilgisayarınızda kurulu olan MySQL istemcisi ile sunucunun genel IP adresine bağlanmayı deneyin:
# örnek, çalıştırma
mysql -h SUNUCU_IP_ADRESI -P 3306 -u db_kullanici -p uygulama_db
Parolanızı girdikten sonra mysql> komut satırı arayüzü karşınıza geliyorsa uzaktan bağlantı sorunsuz çalışıyor demektir.
Bağlantı sırasında zaman aşımı (timeout) alıyorsanız güvenlik duvarı kurallarını ve bind-address satırını; erişim reddedildi (Access denied) hatası alıyorsanız kullanıcı adı, IP ve parola eşleşmesini kontrol etmelisiniz.
5. Alternatif güvenli yöntem: SSH tünelleme ile bağlantı
Eğer sabit bir IP adresiniz yoksa ya da 3306 portunu internet trafiğine tamamen kapalı tutarak en üst düzey güvenliği sağlamak istiyorsanız, en ideal çözüm SSH tünelleme (SSH Port Forwarding) kullanmaktır.
Bu yöntemde MySQL sunucusunda bind-address değerini 127.0.0.1 olarak bırakabilirsiniz. İstemci bilgisayarınızdan açacağınız şifreli bir SSH oturumu, yerel makinenizdeki bir portu sunucudaki yerel sokete yönlendirir:
# örnek, çalıştırma
ssh -N -L 3307:127.0.0.1:3306 kullanici@SUNUCU_IP_ADRESI
Bu komut arka planda çalıştığı sürece kendi bilgisayarınızdaki DBeaver, MySQL Workbench veya yerel kodunuz üzerinden 127.0.0.1:3307 adresine bağlandığınızda, tüm veritabanı trafiği SSH tünelinin içinden geçerek uzak sunucuya güvenli şekilde aktarılır.
Aşağıdaki karar tablosu, ihtiyacınıza göre hangi bağlantı modelini seçmeniz gerektiğini özetlemektedir:
| İhtiyaç / Senaryo | Önerilen Yöntem | Güvenlik Düzeyi | Gerekli Yapılandırma |
|---|---|---|---|
| Sabit IP'li harici web sunucusu / API | Statik IP kısıtlamalı UFW + MySQL IP yetkisi | Yüksek | bind-address = 0.0.0.0, UFW IP kuralı |
| Dinamik IP'li yönetici / geliştirici erişimi | SSH Tünelleme (Port Forwarding) | Çok Yüksek | bind-address = 127.0.0.1, 3306 portu dışarıya kapalı |
| Çok katmanlı mikroservis mimarisi | Özel IP / VLAN üzerinden MySQL erişimi | Çok Yüksek | Dahili arayüz IP'sine bind-address bağlama |
Yoğun veritabanı işlemleri, karmaşık sorgular ve anlık veri yazma yükleri için sunucunun donanım gücü belirleyicidir. Performans VPS paketlerinde AMD Ryzen 9 7950X işlemci ile paylaşımlı vCore ve DDR5 bellek sunulurken; yüksek veritabanı yükleri gerektiren projelerde Ekstrem VDS paketleri AMD Ryzen 9 9950X işlemci ve ayrılmış (dedicated) vCore gücü sağlar. Her iki seride de yer alan Samsung 990 Pro Gen4 NVMe disk altyapısı, veritabanı girdi/çıktı (I/O) işlemlerinin akıcı şekilde gerçekleşmesini sağlar.
Sık sorulan sorular
MySQL uzaktan bağlantısı varsayılan olarak neden kapalıdır?
Veritabanı güvenliği gereği MySQL ve MariaDB kurulumlarında varsayılan yapılandırma yalnızca yerel soketi (127.0.0.1) dinler. Bu ayar, internet üzerinden gelebilecek yetkisiz port taramalarını ve kaba kuvvet parola saldırılarını doğrudan engellemek için tasarlanmıştır.
MySQL kullanıcısına her IP'den erişim (% yetkisi) vermek neden sakıncalıdır?
Kullanıcı adresi olarak '%' belirtildiğinde veritabanı tüm internetten gelen bağlantı isteklerini kabul eder. Bu durum kimlik bilgilerinin ele geçirilmesi ya da parola denemeleri karşısında ciddi bir güvenlik açığı oluşturur. Yetkileri daima bağlanacak web sunucusunun veya istemcinin statik IP adresiyle sınırlandırmak gerekir.
bind-address 0.0.0.0 yapıldığında güvenlik riski nasıl yönetilir?
bind-address parametresini 0.0.0.0 yapmak servisin tüm ağ arayüzlerini dinlemesini sağlar. Ancak veritabanı portunu korumak için işletim sistemi güvenlik duvarında (UFW) 3306 portuna yalnızca izin verilen statik IP adresinden gelen trafiğe onay verilmeli, diğer tüm istekler engellenmelidir.
Port açmadan uzak veritabanına bağlanmanın güvenli bir yolu var mıdır?
Evet. SSH port yönlendirme (tünelleme) yöntemiyle 3306 portunu internete hiç açmadan, yerel makinenizdeki bir port üzerinden şifreli SSH oturumu ile uzak sunucunun yerel 127.0.0.1:3306 soketine bağlanabilirsiniz.
Ağ ve yetki ayarlarını değiştirmeden önce neden snapshot alınmalıdır?
Güvenlik duvarı veya veritabanı yapılandırmasında oluşabilecek beklenmedik bir kural hatası sunucu erişiminizi ya da çalışan servislerinizi olumsuz etkileyebilir. İşleme başlamadan önce snapshot almak, sistemi çalışan anlık durumuna kolayca geri döndürmenizi sağlar.