Metin2 Server DDoS ve Altyapı Güvenliği
Hazırlayan: Metin2VIP Editörleri Yayın: 6 dk okuma
İçindekiler
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),AllowUsersile 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_addressdeğeri*, yani bütün ağ arabirimleridir.my.cnfiçinebind-address = 127.0.0.1yaz; 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_IPlistesini 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?
- 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ğunSYSTEM: new connection fromsatırlarına bak. - Kaynağı kes. Sağlayıcının koruma kipini aç; tek adreslerden gelen bağlantıları güvenlik duvarında engelle.
- 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).
- Duyur. Durumu sitede ve Discord'da düzenli aralıklarla, olduğu gibi yaz.
- 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_logtablosunu da kontrol et. - 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_SENTaçı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
- Metin2 CONFIG Ayarları: Game Çekirdeği Seçenekleri ve Anlamları (Server kurma)
- Metin2 db conf.txt Ayarları: SQL Satırları, BIND_PORT ve ITEM_ID_RANGE (Server kurma)
- Metin2 Giriş Akışı: auth, db ve game; Giriş Hataları (Server kurma)
- Metin2 Kanal ve Port Yapısı: auth, ch1, ch99 ve P2P (Server kurma)
- Metin2 Server Açarken Yapılan 8 Güvenlik Hatası ve Çözümleri (Blog)
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?