44using Chaos . Packets ;
55using Chaos . Packets . Abstractions ;
66using Darkages . Meta ;
7- using Darkages . Models ;
87using Darkages . Network . Client ;
98using Microsoft . Extensions . Logging ;
10- using RestSharp ;
11-
129using System . Net ;
1310using System . Net . Sockets ;
1411using System . Text ;
1512using Chaos . Networking . Abstractions . Definitions ;
1613using JetBrains . Annotations ;
17- using Newtonsoft . Json ;
1814using ServiceStack ;
1915using ConnectionInfo = Chaos . Networking . Options . ConnectionInfo ;
2016using ServerOptions = Chaos . Networking . Options . ServerOptions ;
@@ -34,7 +30,6 @@ public sealed class LobbyServer : ServerBase<ILobbyClient>, ILobbyServer<ILobbyC
3430{
3531 private readonly IClientFactory < LobbyClient > _clientProvider ;
3632 private readonly MServerTable _serverTable ;
37- private const string InternalIP = "192.168.50.1" ; // Cannot use ServerConfig due to value needing to be constant
3833
3934 public LobbyServer (
4035 IClientFactory < LobbyClient > clientProvider ,
@@ -154,12 +149,21 @@ protected override void OnConnected(Socket clientSocket)
154149 client . OnDisconnected += OnDisconnect ;
155150 var safe = false ;
156151
157- foreach ( var _ in ServerSetup . Instance . GlobalKnownGoodActorsCache . Values . Where ( savedIp => savedIp == ipAddress . ToString ( ) ) )
152+ var banned = BannedIpCheck ( ipAddress . ToString ( ) ) ;
153+ if ( banned )
154+ {
155+ client . Disconnect ( ) ;
156+ ServerSetup . ConnectionLogger ( $ "Banned connection attempt from { ip } ") ;
157+ return ;
158+ }
159+
160+ var foundIp = ServerSetup . Instance . GlobalKnownGoodActorsCache . Values . First ( savedIp => savedIp == ipAddress . ToString ( ) ) ;
161+ if ( ! foundIp . IsEmpty ( ) )
158162 safe = true ;
159163
160164 if ( ! safe )
161165 {
162- var badActor = ClientOnBlackList ( ipAddress . ToString ( ) ) ;
166+ var badActor = BadActor . ClientOnBlackList ( ipAddress . ToString ( ) ) ;
163167 if ( badActor )
164168 {
165169 try
@@ -202,152 +206,7 @@ private void OnDisconnect(object sender, EventArgs e)
202206 var client = ( ILobbyClient ) sender ! ;
203207 ClientRegistry . TryRemove ( client . Id , out _ ) ;
204208 }
205-
206- /// <summary>
207- /// Client IP Check - Blacklist and BOGON list checks
208- /// </summary>
209- /// <returns>Boolean, whether or not the IP has been listed as valid</returns>
210- private bool ClientOnBlackList ( string remoteIp )
211- {
212- if ( remoteIp . IsNullOrEmpty ( ) ) return true ;
213-
214- switch ( remoteIp )
215- {
216- case "127.0.0.1" :
217- case InternalIP :
218- return false ;
219- }
220-
221- var bogonCheck = BannedIpCheck ( remoteIp ) ;
222- if ( bogonCheck )
223- {
224- ServerSetup . ConnectionLogger ( "-----------------------------------" ) ;
225- ServerSetup . ConnectionLogger ( $ "{ remoteIp } is banned and unable to connect") ;
226- SentrySdk . CaptureMessage ( $ "{ remoteIp } is banned and unable to connect") ;
227- return true ;
228- }
229-
230- try
231- {
232- var keyCode = ServerSetup . Instance . KeyCode ;
233- if ( keyCode is null || keyCode . Length == 0 )
234- {
235- ServerSetup . ConnectionLogger ( "Keycode not valid or not set within ServerConfig.json" ) ;
236- return false ;
237- }
238-
239- // BLACKLIST check
240- var request = new RestRequest ( "" , Method . Get ) ;
241- request . AddHeader ( "Key" , keyCode ) ;
242- request . AddHeader ( "Accept" , "application/json" ) ;
243- request . AddParameter ( "ipAddress" , remoteIp ) ;
244- request . AddParameter ( "maxAgeInDays" , "90" ) ;
245- request . AddParameter ( "verbose" , "" ) ;
246- var response = ServerSetup . Instance . RestClient . Execute < Ipdb > ( request ) ;
247-
248- if ( response . IsSuccessful )
249- {
250- var json = response . Content ;
251-
252- if ( json is null || json . Length == 0 )
253- {
254- ServerSetup . ConnectionLogger ( $ "{ remoteIp } - API Issue, response is null or length is 0") ;
255- return false ;
256- }
257-
258- var ipdb = JsonConvert . DeserializeObject < Ipdb > ( json ! ) ;
259- var abuseConfidenceScore = ipdb ? . Data ? . AbuseConfidenceScore ;
260- var tor = ipdb ? . Data ? . IsTor ;
261- var usageType = ipdb ? . Data ? . UsageType ;
262-
263- if ( tor == true )
264- {
265- ServerSetup . ConnectionLogger ( "---------Lobby-Server---------" ) ;
266- ServerSetup . ConnectionLogger ( $ "{ remoteIp } is using tor and automatically blocked", LogLevel . Warning ) ;
267- SentrySdk . CaptureMessage ( $ "{ remoteIp } has a confidence score of { abuseConfidenceScore } , and was using tor, and IP type: { usageType } ") ;
268- return true ;
269- }
270-
271- if ( usageType == "Reserved" )
272- {
273- ServerSetup . ConnectionLogger ( "---------Lobby-Server---------" ) ;
274- ServerSetup . ConnectionLogger ( $ "{ remoteIp } was blocked due to being a reserved address (bogon)", LogLevel . Warning ) ;
275- SentrySdk . CaptureMessage ( $ "{ remoteIp } has a confidence score of { abuseConfidenceScore } , and was using a Reserved Address") ;
276- return true ;
277- }
278-
279- if ( usageType == "Data Center/Web Hosting/Transit" )
280- {
281- ServerSetup . ConnectionLogger ( "---------Lobby-Server---------" ) ;
282- ServerSetup . ConnectionLogger ( $ "{ remoteIp } was blocked due to being a data center, web hosting, or transit address", LogLevel . Warning ) ;
283- SentrySdk . CaptureMessage ( $ "{ remoteIp } has a confidence score of { abuseConfidenceScore } , and is a data center, web host, or transit service.") ;
284- return true ;
285- }
286-
287- switch ( abuseConfidenceScore )
288- {
289- case >= 5 :
290- ServerSetup . ConnectionLogger ( "---------Lobby-Server---------" ) ;
291- var comment = $ "{ remoteIp } has been blocked due to a high risk assessment score of { abuseConfidenceScore } , indicating a recognized malicious entity.";
292- ServerSetup . ConnectionLogger ( comment , LogLevel . Warning ) ;
293- SentrySdk . CaptureMessage ( $ "{ remoteIp } has a confidence score of { abuseConfidenceScore } , is using tor: { tor } , and IP type: { usageType } ") ;
294- ReportEndpoint ( remoteIp , comment ) ;
295- return true ;
296- case >= 0 :
297- return false ;
298- case null :
299- // Can be null if there is an error in the API, don't want to punish players if its the APIs fault
300- ServerSetup . ConnectionLogger ( $ "{ remoteIp } - API Issue, confidence score was null") ;
301- return false ;
302- }
303- }
304- else
305- {
306- // Can be null if there is an error in the API, don't want to punish players if its the APIs fault
307- ServerSetup . ConnectionLogger ( $ "{ remoteIp } - API Issue, response was not successful") ;
308- return false ;
309- }
310- }
311- catch ( Exception ex )
312- {
313- ServerSetup . ConnectionLogger ( "Unknown issue with IPDB, connections refused" , LogLevel . Warning ) ;
314- ServerSetup . ConnectionLogger ( $ "{ ex } ") ;
315- SentrySdk . CaptureException ( ex ) ;
316- return false ;
317- }
318-
319- return true ;
320- }
321-
322- private static void ReportEndpoint ( string remoteIp , string comment )
323- {
324- var keyCode = ServerSetup . Instance . KeyCode ;
325- if ( keyCode is null || keyCode . Length == 0 )
326- {
327- ServerSetup . ConnectionLogger ( "Keycode not valid or not set within ServerConfig.json" ) ;
328- return ;
329- }
330-
331- try
332- {
333- var request = new RestRequest ( "" , Method . Post ) ;
334- request . AddHeader ( "Key" , keyCode ) ;
335- request . AddHeader ( "Accept" , "application/json" ) ;
336- request . AddParameter ( "ip" , remoteIp ) ;
337- request . AddParameter ( "categories" , "14, 15, 16, 21" ) ;
338- request . AddParameter ( "comment" , comment ) ;
339- var response = ServerSetup . Instance . RestReport . Execute ( request ) ;
340-
341- if ( response . IsSuccessful ) return ;
342- ServerSetup . ConnectionLogger ( $ "Error reporting { remoteIp } : { comment } ") ;
343- SentrySdk . CaptureMessage ( $ "Error reporting { remoteIp } : { comment } ") ;
344- }
345- catch
346- {
347- // ignore
348- }
349- }
350-
209+
351210 private readonly HashSet < string > _bannedIPs = [ ] ;
352211
353212 private bool BannedIpCheck ( string ip )
0 commit comments