Web ve Veritabanı İletişimi Neden Genel İnternet Üzerinden Geçmemeli?
Web sunucunuzun genel bir IP üzerinde ve MySQL veritabanınızın başka bir sunucuda genel IP ile çalıştığını düşünün. Bağlantı için uygulama 203.0.113.25:3306 gibi bir adrese bağlanır. Bu, iki sunucu arasında gidip gelen her paketin internet yolu üzerinden geçtiği ve dinlenme, manipülasyon veya brute-force saldırılarına maruz kalabileceği anlamına gelir. Güçlü bir parolanız olsa bile, genel IP üzerindeki 3306 portu tarayıcılar tarafından sürekli saldırıya uğrar.
Standart çözüm, özel ağ kullanmaktır. Bu mimaride, her sunucu genel IP'nin yanı sıra yalnızca veri merkezi ağı içinden erişilebilen özel bir IP (ör. 10.10.0.5) alır. Bu IP'ler arasındaki trafik asla genel internete çıkmaz; bunun yerine veri merkezinin dahili anahtar ve yönlendiricilerinden geçer. Sonuç: daha düşük gecikme (genellikle 0,5 ms altında), daha yüksek güvenlik ve daha düşük bant genişliği maliyeti.
Bu makalede, web sunucusu ile veritabanı arasında nasıl bir özel ağ kuracağınızı, güvenlik duvarını doğru şekilde yapılandırmayı ve en yaygın hataları tanımayı öğreneceksiniz. Bu kılavuz, VLAN veya VPC tanımlama imkânı olan her veri merkezi için geçerlidir (ServerNet bulut hizmetleri dahil).
Temel Kavramlar: Özel IP, VLAN ve VPC
Başlamadan önce üç terimi netleştirelim:
- Özel IP:
10.0.0.0/8,172.16.0.0/12veya192.168.0.0/16aralıklarından internette yönlendirilmeyen bir adres. - VLAN: Ağın 2. katmanda mantıksal olarak ayrılması. Aynı VLAN'daki iki sunucu doğrudan iletişim kurabilir; diğer VLAN'daki sunucular kuramaz.
- VPC (Sanal Özel Bulut): Bulut ortamlarında, alt ağları, yönlendirme tablosunu ve ağ geçidini kendinizin tanımlayabileceği izole bir ağ.
Her iki durumda da prensip aynıdır: sunucular yalnızca dahili ağa bağlı ikinci bir ağ arayüzüne (ör. eth1) sahiptir. Bu arayüzün IP'si dışarıdan görünmez.
Hedef Topolojiyi Tanıma
Önerdiğimiz mimari şu şekildedir:
Web Sunucusu (Nginx + PHP-FPM)
eth0: 203.0.113.10 ← Genel IP
eth1: 10.10.0.10 ← Özel IP
Veritabanı Sunucusu (MySQL 8)
eth0: 203.0.113.20 ← Genel IP
eth1: 10.10.0.20 ← Özel IP
Web sunucusundaki uygulama 203.0.113.20:3306 yerine 10.10.0.20:3306 adresine bağlanır. Veritabanının genel IP'sindeki 3306 portu kapalı kalır.
Adım 1: Sunucularda Özel Ağı Etkinleştirme
Veri merkezi veya bulut yönetim panelinde her sunucuya ikinci bir ağ arayüzü ekleyin. Bulut ortamında bu genellikle "İkincil ağ ekle" ile yapılır. Fiziksel veri merkezinde, ağ ekibinden sizin için özel bir VLAN tanımlamasını istemeniz gerekir.
Arayüzü ekledikten sonra Linux'ta yapılandırmanız gerekir. Debian/Ubuntu tabanlı dağıtımlarda /etc/netplan/01-netcfg.yaml dosyasını düzenleyin:
network:
version: 2
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: false
addresses:
- 10.10.0.10/24
routes:
- to: 10.10.0.0/24
via: 10.10.0.1
Ardından ayarları uygulayın:
sudo netplan apply
ip addr show eth1
Çıktı inet 10.10.0.10/24 içermelidir. Aynı işlemi 10.10.0.20 IP'si ile veritabanı sunucusunda da tekrarlayın.
Yaygın Hata: Özel alt ağ için route tanımlamayı unutmak. Route yoksa, 10.10.0.20 adresine ping "Network is unreachable" hatası verir. Her zaman netplan apply'den sonra ip route ile 10.10.0.0/24 yolunun var olduğunu kontrol edin.
Adım 2: Veritabanı Sunucusunda Güvenlik Duvarını Ayarlama
Şimdi MySQL'in yalnızca özel IP üzerinde dinlediğinden emin olmalıyız. İki koruma katmanı gerekir: MySQL'de bind-address ayarı ve güvenlik duvarı kuralları.
2.1 MySQL'de bind-address Ayarı
MySQL yapılandırma dosyasını (/etc/mysql/mysql.conf.d/mysqld.cnf Ubuntu'da) düzenleyin:
[mysqld]
bind-address = 10.10.0.20
port = 3306
Bu ayar, MySQL'in yalnızca özel IP üzerinde dinlemesini ve genel IP'ye gelen istekleri yok saymasını sağlar. Ardından servisi yeniden başlatın:
sudo systemctl restart mysql
ss -tlnp | grep 3306
Çıktı yalnızca 10.10.0.20:3306 göstermeli, 0.0.0.0:3306 değil.
2.2 UFW Kuralları
UFW kullanıyorsanız, önce SSH portunu açık tutun ki sunucudan kilitlenmeyin:
sudo ufw allow OpenSSH
sudo ufw allow from 10.10.0.0/24 to any port 3306
sudo ufw enable
İkinci komut yalnızca özel ağdaki sunucuların MySQL'e bağlanmasına izin verir. Diğer her yerden (internet dahil) gelen istekler reddedilir.
Yaygın Hata: Güvenlik duvarında genel IP üzerinde 3306 portunu açık bırakmak. bind-address'i ayarlamış olsanız bile, güvenlik duvarında portun açık olması ekstra bir risk katmanıdır. Her zaman internet üzerinde 3306 portu için deny kuralı ekleyin:
sudo ufw deny 3306/tcp
Adım 3: Uygulamayı Özel IP Üzerinden Veritabanına Bağlama
Şimdi uygulamayı yeni adrese bağlamanız gerekir. Örneğin, Laravel .env dosyasında:
DB_HOST=10.10.0.20
DB_PORT=3306
DB_DATABASE=app_db
DB_USERNAME=app_user
DB_PASSWORD=güçlü_uzun_bir_parola
WordPress'te wp-config.php dosyasında:
define('DB_HOST', '10.10.0.20:3306');
Değişiklikten sonra uygulama önbelleğini temizleyin ve bağlantıyı test edin:
mysql -h 10.10.0.20 -u app_user -p -e "SELECT 1;"
Connection refused hatası alırsanız, sırasıyla şunları kontrol edin:
eth1her iki sunucuda da yukarıda mı? (ip link show eth1)- Özel alt ağa route var mı? (
ip route) - MySQL özel IP üzerinde dinliyor mu? (
ss -tlnp | grep 3306) - UFW'de alt ağ için allow kuralı var mı? (
sudo ufw status verbose)
Adım 4: Son Test ve İzleme
Trafiğin internetten geçmediğinden emin olmak için traceroute aracını kullanabilirsiniz:
traceroute -n 10.10.0.20
Çıktı yalnızca bir veya iki hop içermelidir (ör. dahili ağ geçidi ve sunucunun kendisi). Çok sayıda hop görüyorsanız, trafik yanlış yoldan gidiyor demektir.
Ayrıca genel IP üzerindeki 3306 portunu dışarıdan test edin:
nc -zv 203.0.113.20 3306
Bu komut Connection refused veya timed out hatası vermelidir. Başarılı olursa, güvenlik duvarı veya bind-address doğru yapılandırılmamış demektir.
Özel Ağın Güvenlik ve Performans Avantajları
Bu mimariyle birkaç önemli avantaj elde edersiniz:
- Saldırı yüzeyinin ortadan kaldırılması: Veritabanı portu internet görünümünden gizlenir. Otomatik tarayıcılar artık onu bulamaz.
- Gecikmenin azalması: Trafik, ekstra hop'lar içerebilecek internet yolu yerine veri merkezinin dahili yolundan geçer.
- Bant genişliği tasarrufu: Dahili trafik genellikle ücretsiz veya internet trafiğinden çok daha ucuzdur.
- Yönetim kolaylığı: Artık veritabanı IP'sini döndürmeye veya karmaşık VPN kullanmaya gerek yok.
Geçiş Zamanlaması ve Pratik Hususlar
Veritabanınız şu anda genel IP üzerinde çalışıyorsa, geçişi bakım penceresinde yapın:
- bind-address ayarını değiştirin ve MySQL'i yeniden başlatın.
- Uygulama yapılandırma dosyasını özel IP'ye değiştirin.
- Bağlantıyı test edin ve ardından güvenlik duvarına deny kuralı ekleyin.
- Genel IP üzerindeki 3306 portunu harici bir araçla test edin.
Veritabanına bağlanan birden fazla uygulamanız varsa, istenmeyen kesintileri önlemek için hepsini aynı anda değiştirin.
Özet
Web sunucusu ile veritabanı arasında özel ağ kullanmak, altyapı güvenliği için basit ama kritik bir önlemdir. Birkaç dakikalık yapılandırmayla, hassas veritabanı trafiğini genel internetten ayırır, saldırı yüzeyini önemli ölçüde azaltır ve gecikmeyi iyileştirirsiniz. Bu desen her veri merkezinde uygulanabilir ve veritabanı kullanan her uygulama için önerilir — WordPress'ten özel uygulamalara kadar.
Bulut ortamında çalışıyorsanız, ServerNet hizmetleri, bu deseni birkaç tıklamayla uygulayan sanal özel ağ (VPC) tanımlama imkânı sunar. Ancak fiziksel ortamda bile, ağ ekibiyle koordinasyon kurarak kendi özel VLAN'ınıza sahip olabilirsiniz.
Son olarak, güvenliğin tek katmanlı olmadığını unutmayın. Özel ağ ilk adımdır; ancak yine de güçlü parolalar, sunucu erişimi için iki faktörlü kimlik doğrulama ve düzenli log izlemeyi ciddiye almalısınız.