İçeriğe geç

Metin2 Server DDoS ve Altyapı Güvenliği

Hazırlayan: Metin2VIP Editörleri Yayın: 6 dk okuma

Kısaca: Metin2 sunucusunda dışarıya yalnız auth ve oyun çekirdeklerinin PORT'ları açık olmalı; P2P, db ve MySQL portları yalnız makinenin kendisine, SSH ise yalnız yönetici adreslerine açılmalıdır. Oyun çekirdeğinin kendi koruması sınırlıdır: çekirdek başına en fazla 4.096 bağlantı kabul eder, IP başına bir sınırı yoktur ve IP engeli yalnız auth'ta çalışır. Bu yüzden asıl koruma, güvenlik duvarındaki IP başına bağlantı sınırından ve barındırmanın trafiği sunucuya ulaşmadan süzen saldırı korumasından gelir.
İçindekiler
  1. Güvenlik duvarında hangi portlar açık olmalı?
    1. Paketteki ipfw şablonu neyi doğru, neyi yanlış yapar?
  2. Yönetim erişimi ve veritabanı
  3. DDoS koruma hizmeti türleri
  4. Oyun çekirdeğinin kendi bağlantı sınırları
  5. Saldırı sırasında ne yapılır?
  6. Günlüklerde hangi gizli bilgiler bulunur?

Metin2 sunucusunu saldırılara karşı korumanın büyük kısmı oyunun dışında, ağda ve güvenlik duvarında yapılır. Oyun çekirdeğinin kendi koruması sınırlıdır: çekirdek başına en fazla 4.096 bağlantı kabul eder, IP başına bir sınırı yoktur ve IP engeli yalnız auth'ta, açılışta okunan bir listeyle çalışır. Düzen bu yüzden üç katmandan oluşur: oyuncunun ihtiyaç duyduğu portlar dışındakileri kapatan bir güvenlik duvarı, yönetim erişimini ve veritabanını dışarıdan ayıran bir yapı ve trafiği sunucuya ulaşmadan süzen bir saldırı koruması.

Çekirdeğin davranışı kaynak koddan, güvenlik duvarı örnekleri paketin gen.py ile ürettiği ipfw şablonundan alındı. Varsayılan parolalar, TEST_SERVER ve GM yetkileri gibi açılış hataları server güvenlik hataları yazısında; burada ağ ve altyapı katmanı var.

Güvenlik duvarında hangi portlar açık olmalı?

Port Kim kullanır Güvenlik duvarında
auth PORT ve ch99 dahil bütün oyun çekirdeklerinin PORT'u Oyuncular Açık, IP başına bağlantı sınırıyla
P2P_PORT'lar ve db BIND_PORT Yalnız çekirdekler Yalnız makinenin kendisine
MySQL (3306) Çekirdekler, aynı makineden Kapalı
SSH (22) Yönetici Yalnız yönetici adreslerine
UDP Kimse; oyun UDP dinlemez Kapalı

Portların hangi çekirdeğe ait olduğu kanal ve portlar yazısında. P2P soketi makinenin genel adresinde dinler, yani bu portları dışarıya kapatan şey yalnız güvenlik duvarıdır. db portunu ayrıca conf.txt'deki BIND_IP = 127.0.0.1 ile yerel adrese bağla (db conf.txt).

Paketteki ipfw şablonu neyi doğru, neyi yanlış yapar?

gen.py'nin ürettiği ipfw.rules oyun PORT'larını açar ve her porta aynı adresten en fazla 20 eşzamanlı bağlantı izni verir (limit src-addr 20). db ve P2P portlarını yalnız 127.0.0.0/8'den kabul eder. Kurala yazılmayan her paket ipfw'nin 65535 numaralı varsayılan kuralıyla düşürülür. Şablonun şu satırları ise düzeltilmelidir:

  • default_tcp_yes_ports='22 53 3306': MySQL'in 3306 portu herkese açıktır; listeden çıkar.
  • 53 (DNS) TCP'de de UDP'de de açıktır. Sunucu DNS hizmeti vermiyorsa gerekmez; sunucunun kendi DNS sorgularının yanıtları, çıkan trafiğe izin veren durum kuralıyla zaten geçer.
  • Şablon auth portuna UDP de açar. Paketle gelen derleme __UDP_BLOCK__ ile yapıldığı için çekirdek UDP soketi açmaz; kural gereksizdir.
  • SSH (22) her adrese açıktır.

SSH'yi yönetici adresine daraltmak için şablona şu biçimde bir kural eklenir ve 22 genel listeden çıkarılır:

$IPF 2100 allow tcp from YONETIM_IP to me 22 in setup keep-state

Değişiklikleri gen_settings.py içindeki şablona yaz; gen.py her çalıştığında ipfw.rules dosyasını yeniden üretir. Kuralları uzaktan değiştirirken kendini sunucunun dışında bırakma riskine karşı önce sağlayıcının konsol erişimini hazırla.

IP başına sınırı belirlerken paylaşılan adresleri unutma: internet kafe, yurt ya da mobil operatör ağından gelen oyuncular aynı IP'yi kullanır. Sınırı çok düşük tutarsan aynı ağdaki gerçek oyuncuları da kesersin.

Yönetim erişimi ve veritabanı

  • SSH: Yalnız anahtarla giriş (PasswordAuthentication no), AllowUsers ile izinli kullanıcılar ve güvenlik duvarında yönetici adresi. Çekirdekleri root ile değil, ayrı bir kullanıcıyla çalıştır (server kurulumu).
  • MySQL: Varsayılan bind_address değeri *, yani bütün ağ arabirimleridir. my.cnf içine bind-address = 127.0.0.1 yaz; uzaktan yönetim gerekirse portu açmak yerine SSH tüneli kullan.
  • Web sitesi ve kayıt paneli: Oyun sunucusundan ayrı bir makinede ve IP'de çalışsın. account veritabanına özel ağ ya da tünel üzerinden, yalnız gereken tablolara yetkisi olan ayrı bir MySQL kullanıcısıyla bağlansın.
  • Oyun portundaki yönetim komutları: ADMINPAGE_IP listesini boş bırak ya da yalnız kendi yönetim adresini yaz (CONFIG ayarları).

Bu derlemedeki port güvenliği db portuna yalnız 127.0.0.1, 192.168.x ve 10.x adreslerinden, P2P portuna yalnız makinenin kendi adresinden bağlantı kabul eder. Bu bir adres süzgecidir, parola ya da kimlik denetimi değildir; güvenlik duvarının yerini tutmaz.

DDoS koruma hizmeti türleri

Hattı dolduran bir saldırı, sunucunun güvenlik duvarına ulaşmadan bağlantıyı tıkar. Sunucunun kendi kuralları yalnız ona ulaşan trafiği süzebilir; bu yüzden koruma, trafik sunucuya varmadan önce barındırmanın ağında yapılır.

Tür Ne yapar Metin2 için dikkat
Barındırmanın ağ düzeyinde süzmesi Hacim ve protokol saldırılarını trafik sunucuya ulaşmadan ayıklar; sürekli açık ya da saldırı algılanınca devreye girer Hangi saldırı türlerini kapsadığını ve büyük saldırıda IP'yi trafiğe kapatıp kapatmadığını önceden sor
Oyun portlarına özel süzgeç TCP oyun bağlantıları için kural ya da profil Oyun kendi protokolünü kullanır ve trafik bu derlemede şifrelidir; süzgeç paketin içine bakamaz, bağlantı davranışına göre çalışır. Betada gerçek oyuncularla dene
Trafiği aktaran koruma (proxy ya da tünel) Oyuncular korumanın adresine bağlanır, gerçek IP gizlenir Çekirdek bütün oyuncuları korumanın adresinden gelmiş görür; aşağıdaki nota bak
Web için CDN ve web güvenlik duvarı Yalnız HTTP ve HTTPS trafiği Oyun portlarını korumaz; siteyi oyun sunucusundan ayrı IP'de tut

Korumayı saldırı başlamadan kur; sağlayıcının hesabındaki önlemleri ve büyük bir saldırıda erişimi ne zaman, ne kadar süreyle kısacağını öğren. Saldırı başladıktan sonra hizmet aramak vakit kaybettirir, yeni hizmete geçerken değişen IP yüzünden istemcinin ve duyuruların da güncellenmesi gerekir.

Oyun çekirdeğinin kendi bağlantı sınırları

Sınır Değer Nereden değişir
Çekirdek başına bağlantı 4.096; ADMINPAGE_IP adresleri bu sınıra takılmaz Kodda sabit, derleme ister
Kanal başına oyuncu USER_LIMIT, varsayılan 32.768 CONFIG
IP başına bağlantı Yok Güvenlik duvarı
IP engeli BANIP, yalnız auth'ta ve yalnız açılışta okunur Dosya ve auth'u yeniden başlatma
Yanıt vermeyen bağlantı PING_EVENT_SECOND_CYCLE (varsayılan 180 saniye) aralıklarla yoklanır, yanıtsız bağlantı sonraki turda kapanır CONFIG
Komut ve sohbet taşkını GM olmayan oyuncu 1 saniyede 10 komutta düşer; 5 saniyelik pencerede 4. sohbet satırından itibaren yazılanlar yutulur, 10. satırda bağlantı kesilir Kodda sabit

4.096 sınırı dolunca syserr'e max connection reached. MAX_ALLOW_USER = 4096 yazılır ve yeni bağlantı açıldığı anda kapanır; gerçek oyuncular da giremez. Her bağlantı 192 KB tampon ayırdığı için bağlantı taşkını belleği de tüketir (sunucu donanımı). Hiç yanıt vermeyen bir bağlantı varsayılan ayarla 6 dakikaya kadar açık kalabilir. Bu yüzden IP başına sınır ve engel listesi çekirdekte değil, güvenlik duvarında tutulur. Tablodaki CONFIG satırlarının varsayılanları CONFIG ayarları listesinde.

Saldırı sırasında ne yapılır?

  1. Türünü anla. Sunucuya hiç ulaşılamıyorsa ya da sağlayıcı IP'yi kapatmışsa saldırı hattadır ve çözüm sağlayıcının süzmesidir. Sunucuya ulaşılıyor ama oyuncular giremiyorsa syserr'de max connection reached, syslog'da az sayıda adresten gelen yoğun SYSTEM: new connection from satırlarına bak.
  2. Kaynağı kes. Sağlayıcının koruma kipini aç; tek adreslerden gelen bağlantıları güvenlik duvarında engelle.
  3. Art arda yeniden başlatma. Hattı dolduran saldırıyı durdurmaz, yalnız oyuncuları atar. Kapatman gerekirse stop.py ile kapat; db çekirdeğini zorla kapatmak son kayıttan sonraki karakter ve eşya değişikliklerini kaybettirir (yedekleme).
  4. Duyur. Durumu sitede ve Discord'da düzenli aralıklarla, olduğu gibi yaz.
  5. Arkaya bak. Saldırı başka bir girişimi örtmek için yapılmış olabilir; SSH girişlerini, MySQL kullanıcılarını ve log veritabanındaki command_log tablosunu da kontrol et.
  6. Kaydet. Bitince zaman çizelgesini ve günlükleri sakla, sağlayıcıdan saldırı raporunu iste.

Günlüklerde hangi gizli bilgiler bulunur?

Günlük dosyaları hata ararken ilk açılan, paylaşılırken de en kolay sızan dosyalardır. Paketle gelen derlemede günlüklere şunlar düşer:

  • Her yeni bağlantı syslog'a IP adresiyle yazılır.
  • auth syslog'u hesap adını ve giriş anahtarını; db syslog'u her girişte hesap adını, giriş anahtarlarını ve karakter silme kodunu (social_id) yazar. Karakter silerken girilen kod da oyun çekirdeğinin syslog'una düşer.
  • Hata veren ve yarım saniyeyi aşan sorgular tam metniyle syserr ve syslog'a yazılır. Giriş sorgusu parola özetini içerdiği için bu satırlar da gizli bilgi taşır.
  • ENABLE_SYSLOG_PACKET_SENT açık olduğu için gönderilen her paket karakter adıyla syslog'a yazılır.

Günlüklerin yanında CONFIG, GENERAL_CONFIG, conf.txt, gen_settings.py ve yedek Makefile'ı veritabanı parolalarını düz metin tutar; .core dökümleri de sürecin belleğini, yani bunların hepsini içerebilir.

Sunucu klasörünün sahibi çekirdekleri çalıştıran kullanıcı olsun; ayar ve günlük dosyalarını başka kullanıcılar okuyamasın (dosyalar 600, klasörler 700). Yardım isterken yalnız gerekli satırı ver; hesap adlarını, IP'leri, anahtarları ve sorgulardaki parola özeti değerlerini sil (giriş akışı).

Eski günlükleri saklamak istiyorsan şifreli bir arşive kopyala. Çekirdek her gün 3 gün önceki günün klasörünü kendisi siler; CONFIG'teki LOG_KEEP_DAYS yalnız çekirdek açılırken yapılan temizliği değiştirir, çalışırken bu süreyi uzatmaz.

Sık sorulan sorular

Metin2 sunucusu için nasıl bir DDoS koruması gerekir?
Oyun trafiği web trafiği değil, oyunun kendi protokolünü kullanan TCP bağlantılarıdır; web siteleri için yapılan koruma oyun portlarını korumaz. Barındırmanın trafiği sunucuya ulaşmadan süzdüğü bir koruma ya da oyun portlarını kendi ağı üzerinden aktaran bir hizmet gerekir. Almadan önce hangi saldırı türlerini kapsadığını ve büyük bir saldırıda IP'yi trafiğe kapatıp kapatmadığını sor.
Saldırı sırasında sunucuyu yeniden başlatmak işe yarar mı?
Hattı dolduran bir saldırıda yaramaz: trafik sunucuya gelmeye devam eder, yeniden başlatma yalnız oyuncuları atar. Kapatman gerekirse stop.py ile düzgün kapat; db çekirdeği zorla kapatılırsa önbellekteki son dakikaların karakter ve eşya değişiklikleri kaybolur.
Oyun sunucusunun IP adresini gizleyebilir miyim?
Oyuncular oyun çekirdeklerine doğrudan bağlandığı için gerçek IP ancak trafiği aktaran bir koruma hizmetiyle gizlenir; bu durumda oyunculara bildirilen adres CONFIG'teki PROXY_IP satırıyla korumanın adresine çevrilir. Web sitesini, e-postayı ve diğer hizmetleri oyun sunucusuyla aynı IP'de çalıştırma.

İlgili sayfalar

Kategori: Server Kurma Server Kurulumu server güvenliği ddos güvenlik duvarı ipfw altyapı

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.