Z tego co widze to sporo osób ma problemy związane z magebomb. Ja zabezpieczam się przed tym ograniczając połączenie z portem otsa do 3 połączeń z danego IP.
Na linuxie bardzo prosto:
Code:
iptables -A INPUT -p tcp --dport 7171 -m connlimit --connlimit-above 3 -j REJECT --reject-with tcp-reset
(zakładając, że port 7171 to port gry)
Ostatnio prosił mnie kolega o sposób na winshita:
Można co prawda w lua, ale ja zrobiłem po swojemu. Dodałem do źródeł małą metodę która działa podobnie co mój sposób opisany dla linuxa.
connection.h
po linijce:
Code:
bool isDisabled(uint32_t clientIp, int32_t protocolId);
dodajemy:
Code:
bool isBlocked(uint32_t clientIp);
connection.cpp
gdzieś na końcu dodajemy:
Code:
bool ConnectionManager::isBlocked(uint32_t clientIp)
{
OTSYS_THREAD_LOCK_CLASS lockClass(m_connectionManagerLock);
if(!clientIp)
return false;
std::list<Connection*>::iterator it = m_connections.begin();
int32_t conn = 0;
while(it != m_connections.end())
{
if((*it)->getIP() == clientIp) conn++;
++it;
}
if(conn > 3) return true;
return false;
}
gdzie linijka:
if(conn > 3) return true;
określa limit połączeń z grą na dane IP. (w tym przypadku limit na 3 połączenia)
protocolgame.cpp
po:
Code:
if(ConnectionManager::getInstance()->isDisabled(getIP(), protocolId))
{
disconnectClient(0x14, "Too many connections attempts from this IP. Try again later.");
return false;
}
dodajemy:
Code:
if(ConnectionManager::getInstance()->isBlocked(getIP()))
{
disconnectClient(0x14, "To many connections with this IP. Your connection is blocked xD.");
return false;
}
Mam nadzieje, że o niczym nie zapomniałem, gdyby komuś nie działało PM me. Zaletą tego jest to, że powinno to działać na większośći dystrybucji ots.
P.S: Zapomniałem dodać, że ten drugi sposób testowany na TFS 0.3.4pl2, na innych nie gwarantuje ale możliwe, że będzie śmigać.