Skip to content
Security

Security

Security Overview

The security features cover the connection itself: where it comes from, what client is on the other end, and whether the account behind it is somebody you already banned. These features work together to create multiple layers of defense.

VPN / Proxy / Datacenter Blocking

XBans can detect and block connections from VPNs, proxies, datacenters, and mobile/carrier networks using the IPInfo API. When a player connects, their IP is checked against IPInfo's database to determine the connection type.

Connection types

TypeDescriptionExample
VPNVirtual Private Network servicesNordVPN, ExpressVPN, Surfshark
ProxyHTTP/SOCKS proxy serversPublic proxy lists, residential proxies
DatacenterHosted/cloud server IPsAWS, OVH, Hetzner
MobileCarrier/mobile network IPsCellular data connections

Setup

  1. Create a free account at ipinfo.io and get your API token.
  2. Set the token in config.yml under the ipinfo section and configure blocking in the consolidated ip-security section:
    ipinfo:
      enabled: true
      token: "your-api-token-here"
    
    ip-security:
      vpn:
        enabled: true
        bypass-permission: "xbans.bypass.vpn"
      hosting:
        enabled: true
        bypass-permission: "xbans.bypass.hosting"
      mobile:
        enabled: false
        bypass-permission: "xbans.bypass.mobile"
  3. Reload with /xbans reload.

IPInfo's free tier provides 50,000 requests/month, which is sufficient for most servers. Results are cached to minimize API calls.

Be careful with block-mobile: true. Many legitimate players connect from mobile data, especially in regions where mobile internet is the primary connection type.

ISP Blocking

ISP blocking allows you to deny connections from specific Internet Service Providers. This is useful for blocking hosting providers commonly used for bot attacks or specific ISPs known for abuse.

ISP blocking is configured under the consolidated ip-security section:

ip-security:
  isp:
    enabled: true
    blocked-isps:
      - "OVH SAS"
      - "Hetzner Online GmbH"
      - "DigitalOcean LLC"

The ISP name is resolved via the IPInfo API, so the IPInfo integration must also be enabled. ISP names must match exactly as returned by the API.

CIDR Range Blocking

CIDR blocking lets you block entire IP ranges using standard CIDR notation. This is a powerful tool for blocking known malicious networks at the network level.

IP range blocking is configured under the consolidated ip-security section:

ip-security:
  ip-range:
    enabled: true
    blocked-ranges:
      - "192.168.0.0/16"
      - "10.0.0.0/8"
      - "203.0.113.0/24"

CIDR checks are performed before any API calls, making them very fast. Use this for known bot networks or hosting ranges you want to block without consuming API quota.

CIDR notation works as follows: 203.0.113.0/24 blocks all IPs from 203.0.113.0 to 203.0.113.255. The number after the slash indicates how many bits of the IP are fixed.

Client Brand Control

Minecraft clients send a "brand" string on connection (e.g., "vanilla", "fabric", "forge", "lunar"). XBans can block or whitelist specific client brands to prevent unauthorized clients from joining.

client-brand:
  enabled: true
  mode: "blacklist"  # or "whitelist"
  list:
    - "wurst"
    - "meteor"
    - "impact"

In blacklist mode, brands in the list are denied. In whitelist mode, only brands in the list are allowed.

Client brand strings are sent by the client and can be spoofed. This feature is a deterrent, not a guarantee. Sophisticated cheat clients may report themselves as "vanilla". Use this alongside other security measures.

Protocol Version Control

Protocol version control allows you to restrict which Minecraft client versions can connect to your server. Each Minecraft version has a unique protocol number, and XBans can enforce minimum and maximum protocol versions.

protocol-version:
  enabled: true
  min-version: 767   # 1.21.1
  max-version: 769   # 1.21.4

Players connecting with a client version outside the allowed range are kicked with a configurable message. This prevents outdated or unreleased client versions from joining.

Alt-Account Detection

The alt-account detection weighs ten risk factors to score how likely it is that a new player is an alternate account of a banned player. This goes far beyond simple IP matching.

Risk Factors

#FactorDescription
1IP historyMatches the connecting IP against IPs used by banned players
2IP subnetChecks if the IP is in the same /24 subnet as a banned player's IP
3Name patternsAnalyzes username similarity (character sequences, prefixes, suffixes)
4Name lengthCompares username length patterns with banned accounts
5Join timingDetects suspicious timing (joining shortly after a ban)
6First joinBrand new accounts joining soon after a ban are flagged
7Client brandSame client brand as the banned player
8Protocol versionSame protocol version as the banned player
9Locale/LanguageSame client language settings
10Connection patternSimilar connection frequency and play time patterns

Each factor contributes a weighted score. When the total score exceeds the configured threshold, staff are notified and the account can be automatically blocked or flagged for review.

Client settings

The strongest signal of the lot, and the one an alt never thinks about. An address is shared by a household, a school and a VPN exit; skin layers, main hand, chat preferences and the answer to the resource pack come out of options.txt — they belong to the installation, not to the account. A second account is a new name and a new password; it is not a new options.txt.

Only a match on an unusual value scores. Almost everybody runs the defaults, so "both players use their right hand" describes most of the server and is worth nothing. "Both play left-handed with the cape hidden and coloured chat off" describes very few people.

MatchDefault scoreCounted when
Skin-layer mask15Identical and not the default (all seven on)
Main hand10Both left-handed — roughly a tenth of players
Chat setting8 eachVisibility, colours off, text filtering on, server listings off
Resource pack8Both declined the server pack

The whole block is capped (max-score, default 35) so it can never trigger an action on its own, and a disagreement is never counted against a player: reconfiguring one install between two sessions is ordinary.

Alt-detection runs asynchronously on player join to avoid impacting connection times. Results are cached and available in the player's profile GUI.

Address history

The addresses a player has connected from live in xbans_player_ips, one row per (player, address). They used to be a semicolon-separated VARCHAR(2048) column inside XCore's shared players table — two kilobytes carried on every player load and rewritten on every cache write, for every addon on the server.

The move happens by itself on the first start after updating, and writes a CSV backup next to the configuration before the old column is dropped. Looking a player up by address is now an exact match on an index: the old search matched 1.2.3.4 inside 11.2.3.40, and read every player row to do it.

Reviewing a case

/alts <player> opens the linked accounts straight away, each with its score and the evidence the engine actually weighed, rather than only the fact that an address was shared. Nothing is printed to chat. From the console, where there is no inventory to open, the same command prints the list instead.

CommandWhat it doesPermission
/alts <player>Opens the linked accounts with their evidencexbans.command.alts
/alts <player> ban <reason>Bans the whole cluster in one goxbans.command.alts.ban
/alts <player> link <other>Records a link the engine cannot seexbans.command.alts.link
/alts <player> unlink <other>Removes a link recorded by handxbans.command.alts.link

A link recorded by hand outranks anything the engine scores afterwards, so a case you have already judged stays judged.

Weighting the evidence

Every weight lives in alt-detection.risk-scoring, and the risk levels follow the thresholds you set. A shared address is weighted by what it is: a VPN exit, a datacentre or a mobile carrier is not a household, and an address used by forty accounts is a school. Evidence also loses weight as it ages, on the half-life set in risk-scoring.decay.

Rank immunity

A moderator cannot sanction someone above them. Give each rank a level through xbans.immunity.<level> — the highest node a player holds is their level — and an attempt against an equal or higher level is refused with a message rather than silently working.

Console has no level and is never refused.