HomeJavaModsAntiVPN-X
AntiVPN-X
ModsJava

AntiVPN-X

AntiVPN-X is plugin blocks any sort of VPN mobile hotspots proxy botting and MORE!

⬇ Download on Spigot

Please leave a preview of any kind


antivpnxbannerchat1200.png
antivpnxprotections.png
antivpnxcommands.png antivpnxpermissions.png AntiVPN-X

Detects and blocks VPN, proxy, Tor and datacenter connections when players join.
One jar, every platform. Each host reads its own descriptor and loads only its own entry point — the same pattern ViaVersion uses. A fully commented config.yml is generated on first start and is identical everywhere.
Supported platforms
Verified by compiling the same sources against Velocity 3.3, 3.4 and 3.5; against the oldest supported paper-api (1.19.4) so nothing newer can slip in; and against SpongeAPI 9, 11, 13 and 17 so the Sponge half stays valid across the whole range.
Works with zero configuration — the offline lists and four of the thirteen providers need no registration.
Honest scope: what "any VPN" means here
There is no technique that catches every VPN with certainty. The hard case is a self-hosted WireGuard endpoint on a residential IP — from the server's point of view that traffic is indistinguishable from an ordinary player. Anyone claiming 100 % detection is selling something.
What this plugin does instead is stack six independent layers so the realistic cases are covered and the remaining gap is small:
In practice the hosting flag does most of the work: nearly every VPN — commercial or self-hosted — exits from datacenter address space. It is enabled by default.
The trade-off is false positives. Blocking hosting also blocks players behind corporate networks, some university connections and anyone genuinely proxying through a VPS. iCloud Private Relay is caught by the relay flag. Mobile carriers are not blocked by default. Start with actions.kick: false (monitor-only) for a day and read detections.log before enforcing.
Permanent address memory — what keeps the free API tiers usable
The first time an address connects it goes through the full pipeline. The verdict is then written to known-addresses.json and reused: clean addresses are waved through with no API call, flagged ones are blocked with no API call either.
This changes what the provider quotas are spent on. Instead of scaling with logins, cost scales with distinct addresses ever seen — on a settled server that is a handful of new addresses a day, so even a 100/day free tier stops being the binding constraint.
Code (Text):
known-addresses:
enabled: true
revalidate-clean-after-days: 0 # 0 = remember forever
revalidate-blocked-after-days: 0
Read this before leaving both at 0. An IP address is not a permanent identity. Home connections rotate, and a range that is clean today can be sold to a VPN operator tomorrow. With 0 a stored verdict never self-corrects, which means a residential address that later becomes a VPN exit stays permanently whitelisted, and a dynamic address that was once a VPN exit stays permanently blocked.
Setting both to 30 still removes roughly 97 % of the API calls while letting a wrong verdict correct itself within a month. That is the setting to use unless you have a reason not to. Either way, /antivpn known forget <ip> fixes a single address on the spot.
Detection modes
MAJORITY and ALL query every provider sequentially, so they multiply the lookup time. Raise general.lookup-timeout-seconds when you use them.
Providers
Thirteen are supported, plus a configurable one. Four need no registration and are on by default:
Keyed providers, all off by default: ipqualityscore (5000/month, strongest single source), ipdata (1500/day), ipregistry (most granular security block), vpnapi, iphub, ipinfo, ip2location, getipintel, abuseipdb. A provider whose key is missing is skipped with a warning rather than failing the check.
Your own endpoint. providers.custom takes a URL and the names of the JSON fields that mean vpn, proxy, tor, hosting, a risk score and so on — dotted paths, so security.vpn reaches into a nested object. For a network that already runs its own reputation API, or a service that appeared after this build.
Each provider has its own token-bucket rate limiter, because exceeding a free tier gets the server's address banned for hours — which would silently disable detection.
Extra protections
Streamer safety
A false positive on someone who is live streaming is the one failure mode with a privacy cost: they get refused and their IP address appears on camera in front of an audience. So by default the kick screen shows a short reference code instead:
Code (Text):
CONNECTION REFUSED
A VPN was detected on your connection.
Please disable it and join again.
REFERENCE 8A3F1C
messages.hide-ip-from-players: true (the default) redacts %ip% to 203.0.113.*** in everything a player can see — even if you put the placeholder back into a kick message by hand. Staff alerts, the console and detections.log always keep the full address.
The reference code is a one-way hash of the address, so it is stable, quotable in a support ticket, and reveals nothing. Resolve it with /antivpn ref 8A3F1C.
26 languages
Player- and staff-facing text ships in 26 bundled files — English plus Spanish, Russian, German, French, Portuguese, Polish, Turkish, Chinese, Indonesian, Italian, Vietnamese, Dutch, Korean, Czech, Thai, Hungarian, Arabic, Japanese, Ukrainian, Swedish, Danish, Romanian, Slovak, Hebrew and Lithuanian.
Files are copied to plugins/AntiVPN-X/lang/ on first start and are never overwritten — edit any string there and run /antivpn reload. A missing key in a translation falls back to English, so an incomplete file never shows a raw key on a player's kick screen. With follow-player-language: true, staff alerts follow each viewer's own Minecraft client language.
Commands
/antivpn (alias /avpn), permission antivpn.admin:
Permissions
Configuration highlights
Code (Text):
general:
enforcement-stage: LOGIN # LOGIN = the bypass permission works; PRE_LOGIN = blocks earlier
fail-open: true # let players in when every source is unreachable
countries:
mode: DISABLED # DISABLED | WHITELIST | BLACKLIST
list: ["EU", "US"] # ISO country codes, continent codes, or both
detection:
mode: ANY # ANY | FIRST_AVAILABLE | MAJORITY | ALL
block:
vpn: true
hosting: true # the single most effective flag
mobile: false # do not ban phones
The country filter accepts continent codes ( EU, NA, SA, AS, AF, OC, AN) as well as ISO country codes, and the two can be mixed freely.
Installation
Drop the jar into plugins/ and restart — the same file works on every supported platform.
Install it on the proxy or on the servers, not both. The proxy refuses the connection earlier and one config covers the whole network. Use the server install only when there is no proxy, or the backend is reachable from the internet directly.
On first start plugins/AntiVPN-X/ is created with config.yml (heavily commented), known-addresses.json, lists/, cache.json, whitelist.json, blacklist.json and detections.log.
config.yml is never rewritten while it is valid. When an update adds options, the missing keys fall back to their defaults, a warning lists them, and the current defaults are written to config.new.yml so you can diff them by hand.
Self-repair on a broken config. A YAML typo does not leave detection silently off. The broken file is moved to config.old.yml, a fresh default is written in its place, the plugin comes up on those defaults and logs exactly what went wrong. This applies to an in-game /antivpn reload as well as to startup, so a bad edit never leaves the server unprotected — and nothing is lost.
Tuning for fewer false positives
  1. Run with actions.kick: false for a day, then read detections.log.
  2. If legitimate players are hit, first try detection.block.hosting: false — it is the noisiest flag by a wide margin.
  3. Still noisy? Switch detection.mode to MAJORITY and enable a second provider.
  4. For a single bad range, add it to local-lists.static-allowed-ranges or use /antivpn whitelist add 203.0.113.0/24.
  5. If an ISP name collides with a keyword (Google Fiber vs "google"), add it to asn-heuristics.keyword-exceptions.
Fabric, Forge and NeoForge
Not supported on their own — those are mod loaders with no Bukkit or Bungee API. There are two practical answers, and most networks already use one: run a hybrid (Mohist, Arclight, Banner), which gives you the Bukkit API on top and is supported above; or put Velocity or BungeeCord in front of the modded server and run AntiVPN-X on the proxy, which refuses the connection before it ever reaches the modded server.
Privacy
Only the connecting player's IP address is sent to the enabled providers — never names or UUIDs. The free ip-api.com endpoint is plain HTTP (their restriction); supplying a pro key switches the plugin to HTTPS automatically. Disable that provider if it matters to you — the offline lists work without it.
The plugin submits an anonymous server profile to bStats: server software and version, player count, Java version, OS and plugin version. No addresses, names, UUIDs or detection results ever leave the server. Opting out is bStats' own switch ( plugins/bStats/config.yml), so turning it off once covers every plugin on the server.
Deliberately not included
MySQL / shared storage (a large untestable surface — ask if you run a multi-proxy network and want it), a PlaceholderAPI expansion (it would make the jar Bukkit-aware for a handful of scoreboard values), and MCLeaks alt-account lookups (a second external API answering a different question than this plugin asks).
Requirements
Found a bug or want a feature? Use the Discussion tab — reviews are not a support channel and I cannot reply to them.

AntiVPN-X is a free Minecraft Java mod. Compatible with Minecraft 1.19, 1.20, 1.20.6, 1.21 and newer. Downloaded 79 times (via Spigot). Download it and open it directly in the game.

Explore more