Improve server control and logging of the DOS blacklist (#10904)

* Log kicks related to DOS bans

* unBlacklistDos method

Added a method to remove an IP that was blacklisted for being a potential DOS attack.

* Added a command to add/remove/list DOS bans

* Switched from spaces to a tab in the subnet-ban command

Switched from spaces to a tab in the subnet-ban command's listing function. This is better for accessibility and customizability.

* Use info(String, Object...) instead of String.format

* Fixed formatting to fit style guidelines
This commit is contained in:
Lett
2025-06-07 00:13:15 -04:00
committed by GitHub
parent 47c19487fc
commit a18c5d148d
3 changed files with 36 additions and 1 deletions

View File

@@ -91,6 +91,10 @@ public class Administration{
dosBlacklist.add(address); dosBlacklist.add(address);
} }
public synchronized void unBlacklistDos(String address){
dosBlacklist.remove(address);
}
public synchronized boolean isDosBlacklisted(String address){ public synchronized boolean isDosBlacklisted(String address){
return dosBlacklist.contains(address); return dosBlacklist.contains(address);
} }

View File

@@ -113,6 +113,8 @@ public class ArcNetProvider implements NetProvider{
//kill connections above the limit to prevent spam //kill connections above the limit to prevent spam
if((playerLimitCache > 0 && server.getConnections().length > playerLimitCache) || netServer.admins.isDosBlacklisted(ip)){ if((playerLimitCache > 0 && server.getConnections().length > playerLimitCache) || netServer.admins.isDosBlacklisted(ip)){
Log.info("Closing connection @ - IP marked as a potential DOS attack.", ip);
connection.close(DcReason.closed); connection.close(DcReason.closed);
return; return;
} }

View File

@@ -666,7 +666,7 @@ public class ServerControl implements ApplicationListener{
if(arg.length == 0){ if(arg.length == 0){
info("Subnets banned: @", netServer.admins.getSubnetBans().isEmpty() ? "<none>" : ""); info("Subnets banned: @", netServer.admins.getSubnetBans().isEmpty() ? "<none>" : "");
for(String subnet : netServer.admins.getSubnetBans()){ for(String subnet : netServer.admins.getSubnetBans()){
info("&lw " + subnet); info("&lw\t" + subnet);
} }
}else if(arg.length == 1){ }else if(arg.length == 1){
err("You must provide a subnet to add or remove."); err("You must provide a subnet to add or remove.");
@@ -1054,6 +1054,35 @@ public class ServerControl implements ApplicationListener{
} }
}); });
handler.register("dos-ban", "[add/remove] [ip]", "Add or remove a DOS ban.", arg -> {
if(arg.length == 0){
info("DOS bans: @", netServer.admins.dosBlacklist.isEmpty() ? "<none>" : "");
netServer.admins.dosBlacklist.forEach(address -> {
info("&lw\t" + address);
});
return;
}else if(arg.length == 1){
err("Expected either zero or two parameters, but only got one parameter.");
return;
}
String action = arg[0].toLowerCase();
String ip = arg[1];
if(action.equals("add")){
netServer.admins.blacklistDos(ip);
info("Dos banned: @", ip);
return;
}else if(action.equals("remove")){
netServer.admins.unBlacklistDos(ip);
info("Removed dos ban: @", ip);
return;
}
err("Unrecognized action: @", action);
});
mods.eachClass(p -> p.registerServerCommands(handler)); mods.eachClass(p -> p.registerServerCommands(handler));
} }