COWMODSКаталог модов

ProxyShield

Anti-VPN and anti-proxy protection with country filtering, Discord alerts, a silent mode and a dry-run mode. Native builds for Paper, Folia, BungeeCord, Velocity and Sponge.

3841обновлён 29 окт. 2026 г.
УправлениеУтилиты

Описание

Discord Release Downloads Servers License

Built with Java 21 Available for Paper Available for Purpur Available for Spigot Available for Bukkit Available for Folia Available for Sponge Available for BungeeCord Available for Waterfall Available for Velocity

Watch us on YouTube Chat with us on Discord Available on Codeberg

ProxyShield

Anti-VPN and anti-proxy protection for Minecraft servers. Country filtering, Discord webhook alerts, a silent mode and a dry-run mode. One shared detection core, five native builds that behave identically.

BuildFileRuns on
PaperProxyShield-Paper-2.5.1.jarPaper, Purpur and Spigot 1.21+
FoliaProxyShield-Folia-2.5.1.jarFolia
BungeeCordProxyShield-Bungee-2.5.1.jarBungeeCord / Waterfall
VelocityProxyShield-Velocity-2.5.1.jarVelocity 3.3+
SpongeProxyShield-Sponge-2.5.1.jarSpongeAPI 17
UniversalProxyShield-Universal-2.5.1.jarall five of the above, one file

The universal jar carries all four entry points and all four plugin descriptors at once. Every server reads the descriptor it knows and ignores the rest, so the same file drops into a Paper plugins/ folder, a BungeeCord one, a Velocity one or a Sponge mods/ folder. It costs about 400 KB over a single-platform jar, which buys one download for a network running several of them. The per-platform jars are still the plainer choice when you only run one.

The Paper and Folia jars are built from the same sources and are interchangeable. The scheduling already uses the regionised API, so either one runs on either server. They exist separately because server owners look for a jar named after their platform.

Spigot is supported by the same jar. Paper and Folia offer AsyncScheduler, a per-entity scheduler and Adventure components; Spigot has none of the three. The jar picks an implementation at start-up, and the Paper-only types live in a class that is never loaded on a server without them.

Install one jar, on the machine that accepts the connection. On a network that is the proxy (BungeeCord or Velocity). The Paper build behind a proxy would only ever see the proxy's own address.


Showcase

A short demonstration of the checks, the verdict and what a blocked connection looks like.

Features

Detection

  • 26 IP intelligence services built in, enabled by name - 15 of them need no API key at all
  • Consensus scoring: several providers are asked at once and their weights added up, so one service that has never heard of a VPN cannot clear it, and one noisy service cannot kick anybody alone
  • Public VPN, datacenter and Tor exit feeds with correct CIDR matching, IPv4 and IPv6
  • Network (ASN) block and allow rules, which catch a VPN's new range before any feed lists it, plus downloadable ASN lists that refresh on their own
  • ISP filter with regular expressions, to block a hoster or always admit a mobile carrier
  • Conditions on any provider's answer (risk.score >= 85, connection.type = mobile) and custom request headers, so an unlisted service can be wired in exactly
  • Bogon addresses refused outright
  • Reverse DNS patterns as a signal - free, unlimited, and effective on ranges nobody has catalogued
  • Behavioural heuristics: join rate per subnet, accounts per address, an account changing country
  • Trust for regulars, so a tightened rule or a provider having a bad day does not kick your players
  • Country filtering, blacklist or whitelist mode
  • Manual blacklist, checked before everything else
  • Connection limit per address, by players online or within a time window
  • Configurable fail-open or fail-closed behaviour when a check cannot complete

Exemptions

  • IP whitelist accepting single addresses, CIDR blocks and ranges
  • Player name whitelist
  • Bypass permission
  • Loopback and private addresses are never checked, and never cost lookup quota
  • Bedrock players joining through Geyser/Floodgate are exempt by default

Operations

  • Dry-run mode: detect and report without disconnecting anybody
  • Passive mode: no checks at login, lookups on demand only
  • Restricted servers on BungeeCord and Velocity: keep a flagged player in the lobby instead of disconnecting them
  • Whitelist and blacklist entries with a reason and an expiry
  • /proxyshield alts lists every account seen on the same address
  • Debug output with every provider's raw answer
  • Console commands on a detection, so a flagged player can be marked or restricted instead of kicked
  • /proxyshield check shows what every single provider said, so a false positive can be traced
  • Lookup cache survives restarts and reloads; simultaneous logins from one address share one query
  • Shared storage for a network: MySQL, MariaDB, PostgreSQL, SQLite, H2 or Redis
  • PlaceholderAPI support and anonymous bStats metrics
  • Silent mode: no staff or console alerts, while the log file and webhook keep recording
  • Discord webhook with queueing, retry and rate-limit handling, and a layout you write yourself
  • Telegram and VK alerts
  • Block log at plugins/ProxyShield/blocks.log
  • Full /proxyshield command set with tab completion
  • English and German out of the box, any language by copying one file

Getting started

  1. Drop the jar for your platform into plugins/ and start the server once.
  2. Edit plugins/ProxyShield/config.yml.
  3. Run /proxyshield reload.

Recommended first run: leave detection.dry-run: true for a day and watch blocks.log. It records what would have been blocked without disconnecting anybody, which is the cheapest way to find false positives before they hit real players.

Providers and scoring

Enable a service by name. The fifteen listed as free need no key at all:

api:
  mode: consensus          # or failover
  required-score: 1.5
  providers:
    ip-api:     { enabled: true, weight: 1.0 }
    blackbox:   { enabled: true, weight: 1.0 }
    ipapi-is:   { enabled: true, weight: 1.5 }
    proxycheck: { enabled: false, weight: 2.0, key: "" }

In consensus mode every enabled provider is asked at once and the weights of those flagging the address are added up. At required-score: 1.5 a single strong provider is enough, or any two weaker ones, or one weak provider plus a reverse DNS hit. Raise it to 2.5 if you would rather miss a VPN than kick a real player; lower it to 1.0 to block on any single hit.

This does not multiply your quota the way it looks. Answers are cached (IPv6 folded to its /64), simultaneous logins from one address share one lookup, the fan-out stops the moment the score is reached, the cache survives restarts and reloads, and a provider that starts failing is dropped from the rotation until it recovers.

A service the catalog does not know can be described directly in config.yml with a URL and dotted field paths - see the commented example at the bottom of the providers section.

Country filtering

country:
  enabled: true
  mode: whitelist        # only these countries may connect
  codes: ["DE", "AT", "CH"]
  block-unknown: false

Set mode: blacklist to invert it. Country data comes from the lookup provider, so country.enabled triggers a provider query even when detection.use-api is off.

Silent mode

notifications:
  silent: true

Suppresses the staff broadcast and the console line. The log file and the webhook still record every detection, so you keep the data without announcing to everyone online that the filter fired.

Commands on a detection

Not every server wants a flagged player gone. To mark them instead, run whatever you would have run by hand:

detection:
  dry-run: true

actions:
  on-flag:
    - "lp user {player} permission set myserver.vpnflagged true"
    - "webhook {player} flagged {reason} from {ip}"
  delay-seconds: 3
  run-when: always

With dry-run on, the detection still fires, the alert and the webhook still go out and these commands still run, but the player stays connected. That is the flag-instead-of-kick setup: put them in a restricted group, make them verify through Discord, hand the name to another plugin.

Commands run as the console, with or without a leading slash. Available placeholders are {player}, {uuid}, {ip}, {reason}, {reason_id}, {country}, {isp}, {asn}, {score}, {sources}, {action} and {platform}.

delay-seconds matters more than it looks. A connection is judged before the player is on the server, so at 0 the commands run while they are still connecting. That is fine for a permission grant or a webhook, but anything that needs them actually online, such as messaging them or prompting them to link an account, needs a few seconds here.

run-when accepts always, kicked or allowed when the commands should only fire for players who were disconnected, or only for those who were not.

Discord webhook

discord:
  enabled: true
  webhook-url: "https://discord.com/api/webhooks/..."
  show-ip: true

show-ip: false posts hidden instead of the address. Only https:// URLs are accepted.

The message layout is yours to write. By default it is a title and six inline boxes; clear the fields and write a description instead:

discord:
  embed:
    title: "`{player}`"
    description: |
      ```ansi
      IP: `{ip}`
      Country: {country}
      Action: {action}
      ```
    thumbnail: "https://your-server.example/alert.gif"
    fields: {}

Placeholders: {player} {uuid} {ip} {reason} {country} {isp} {asn} {score} {sources} {platform} {version} {action} {action_id}. Fields are named entries and appear in the order written.

Values go in exactly as written, so you place the backticks. Discord parses embed text as Markdown and an underscore is a legal Minecraft name character, so without a code span Some_Name shows up italic and __Name__ underlined with the underscores gone. Deleting the whole embed section keeps the layout from before 2.4.

Storage on a network

One server needs no setup - verdicts and trust live in two files. A network of several proxies should share them, so each address is looked up once for the whole network instead of once per proxy:

storage:
  type: redis            # or mysql, mariadb, postgresql, sqlite, h2, file, memory
  redis:
    host: "127.0.0.1"
    port: 6379
    password: ""

Redis also pushes invalidations: whitelisting an address or running /proxyshield clearcache on one proxy takes effect on the others immediately, rather than when the entry expires.

ProxyShield bundles no database driver and no Redis library, so nothing is relocated into a server that did not ask for it. Most Bukkit servers already have a MySQL and a SQLite driver; if yours does not, drop the driver jar into the ProxyShield folder and name it under storage.sql.driver-path. If the store cannot be reached, the plugin says so once and falls back to file storage - a database outage never becomes a login outage.

PlaceholderAPI

Available on the Bukkit builds when PlaceholderAPI is installed. Every placeholder reads the cache, so none of them can stall the main thread:

PlaceholderShows
%proxyshield_blocked% / %proxyshield_checked%Counters since start-up
%proxyshield_blocked_proxy% / %proxyshield_blocked_hosting% / %proxyshield_blocked_country%Blocks by reason
%proxyshield_country% / %proxyshield_isp% / %proxyshield_asn%The player's own address
%proxyshield_is_proxy% / %proxyshield_is_hosting% / %proxyshield_score%The verdict on it
%proxyshield_sources%Which services flagged it
%proxyshield_trusted%Whether the player has earned an exemption
%proxyshield_mode% / %proxyshield_providers% / %proxyshield_storage%How the plugin is set up
%proxyshield_cache_size% / %proxyshield_trusted_players% / %proxyshield_uptime%Live state

Metrics

Anonymous statistics through bStats: server count, platform, Java version and which ProxyShield settings are in use. No addresses and no player data. Public at bstats.org, and switched off with metrics.enabled: false.

API for other plugins

if (ProxyShieldApi.isAvailable() && ProxyShieldApi.isProxy(address)) {
    // cache-only, safe on the main thread
}

LookupResult result = ProxyShieldApi.lookup(address);   // blocking, async only
boolean regular = ProxyShieldApi.isTrusted(uuid);

de.lucasthcr.bridgesave.proxyshield.api.ProxyShieldApi is read-only: it answers questions, it never changes a verdict or disconnects anybody.

Language

All player facing text lives in messages_en.yml and messages_de.yml. Point settings.language at the one you want. For another language, copy a file to messages_<code>.yml, translate it and set settings.language: <code>. Any key you delete falls back to the built-in English, so a message file from an older version keeps working after an update.


Commands

All of these need proxyshield.admin. Aliases: /ps, /antivpn.

CommandDoes
/proxyshield infoVersion, active mode, lookup mode and list status
/proxyshield providersEvery enabled service with its weight, health and latency
/proxyshield statsDetection counters, cache and webhook state
/proxyshield check <player|ip>Runs the full pipeline and explains the verdict
/proxyshield lookup <player|ip>Fresh provider lookup, ignoring the cache
/proxyshield whitelist <add|remove|info|list|purge> [entry] [time] [reason]Manage the never-block list
/proxyshield blacklist <add|remove|info|list|purge> [entry] [time] [reason]Manage the always-block list
/proxyshield alts <player|ip>Every account seen on the same address
/proxyshield refreshRe-download the feeds
/proxyshield recheckRe-check everyone online, disconnect whoever fails
/proxyshield clearcacheDrop cached lookup results
/proxyshield reloadRe-read config.yml and the message file

Entries added in game are stored in whitelist.txt and blacklist.txt and survive restarts. Entries that came from config.yml have to be removed there.

/proxyshield check is the tool for a false-positive report: it walks the whole pipeline and prints what each stage decided, so you can see exactly which rule fired.

Permissions

NodeDefaultGrants
proxyshield.bypassopSkip every check
proxyshield.notifyopReceive live block alerts
proxyshield.adminopUse /proxyshield

On Paper, BungeeCord and Sponge no permission data exists yet during the login handshake, so proxyshield.bypass only resolves for operators there. For reliable exemptions on those platforms use whitelist.players or whitelist.ips. On Velocity the player object is available at LoginEvent and the permission works normally.


How a connection is decided

Strictly top to bottom, first match wins. Everything that can allow a player is evaluated before anything that can block one, so an operator can always whitelist their way out of a false positive.

#CheckResultCost
1proxyshield.bypass permissionallownone
2Name in whitelist.playersallownone
3IP in whitelist.ipsallownone
4Bedrock player via Floodgateallownone
5Loopback or private addressallownone
6Bogon addressblocknone
7IP in blacklist.ipsblocknone
8IP in a downloaded feedblock~0.6 µs
9Network (ASN) or ISP ruleallow or blockone HTTP request per uncached IP
10Provider reports proxyblocksame request
11Provider reports hostingblocksame request
12Country not permittedblocksame request
13Over the connection limitblocknone

Steps 1 to 8 never touch the network. Step 9 onwards costs one provider request per address that is not in the cache, which is why the cache TTL matters more than the rate limit on most servers.

Performance

Measured with the four default feeds (62,555 entries compiled into 35,161 merged ranges):

Memory held1.3 MB
Startup parse259 ms, on an async thread
Feed check per login589 ns
1000 logins0.59 ms total, about 1/85th of one tick

The provider lookup is the only part with real latency: typically 50 to 200 ms, capped by api.timeout-seconds. It runs off the main thread on every platform, so it delays that one player's login and never the server tick. Set detection.use-api: false for a pure feed setup with zero network traffic per login.


Building

Requires JDK 21 and Maven.

mvn clean package

The five plugin jars land in proxyshield-*/target/. Tests run as part of the build.

Module layout

proxyshield-common     detection core, no platform APIs, 124 tests
proxyshield-paper      Bukkit adapter    -> AsyncPlayerPreLoginEvent, Paper/Folia/Spigot
proxyshield-folia      same sources as proxyshield-paper, own descriptor and jar name
proxyshield-bungee     Bungee adapter    -> LoginEvent with intents
proxyshield-velocity   Velocity adapter  -> LoginEvent with EventTask.async
proxyshield-sponge     Sponge adapter    -> ServerSideConnectionEvent.Auth

Each platform module shades proxyshield-common, so every jar is self-contained. The Velocity and Sponge builds also bundle a relocated SnakeYAML, because neither exposes a YAML config API and both read the same config.yml as the others.

proxyshield-folia adds no Java sources of its own. It pulls in proxyshield-paper/src/main/java with build-helper-maven-plugin, so both jars are compiled from one copy of the code and a fix can never land in only one of them.

Tests

mvn -pl proxyshield-common test

Beyond the unit tests, two of them are worth knowing about: ShieldConfigTest parses the config.yml that actually ships in the jar and asserts every value the reader expects, and MessagesTest asserts that both bundled message files define exactly the keys the code looks up and that no key or value is swallowed by YAML's boolean coercion. Both of those caught real defects during development.


Changes from 1.1

See CHANGELOG.md. The short version: the IP feeds never matched anything in v1 because the CIDR prefix was thrown away, proxy detection was a substring test, the webhook payload was injectable, and BungeeCord and Velocity did blocking work on the wrong thread.

The original 1.1 sources are kept under legacy-1.1/ and the raw decompiler output under decompiled/ for reference.

Licence

GPL-3.0, see LICENSE.

Последние версии

Все версии →
release

ProxyShield 3.0.1 (Universal)

3.0.1+universal
29 окт. 2026 г.8Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3bukkit, bungeecord, folia, paper, purpur, spigot, sponge, velocity, waterfall
Скачать
Что нового
### Fixed - **Bursts of logins no longer queue behind each other.** The lookup pool was sized to the number of providers, so one login used all of it and every other login waited, some until the 6 second total timeout and then got in unchecked. `api.max-parallel` now sizes the pool (default 64, up to 256). In a local join test, 21 of 60 joins in 6 seconds reached a provider before, all 60 now. ### Changed - **Staged lookups.** A lookup now asks the first two providers (`api.first-wave`, 0 asks all at once) and stops there when both answer and neither flags the address. A flag, a failure or a slow answer brings in the rest. Providers that are out of quota or recovering are skipped instead of being asked and failing. An ordinary address costs two requests instead of five, so the free quotas serve about twice as many new addresses. The default provider order puts the strongest keyless ones first (blackbox, ip-check, iplocate, ip-api, iprisk). - **Zowi's service is on by default, first in the list.** It was the strongest keyless provider in the public benchmark. The request uses `feature=security`, so only the verdict fields come back, and the provider limit is 120 a minute against the 150 the service allows per address. Existing configs keep their settings. - **Open proxies are blocked from a list.** monosans/proxy-list (MIT, rebuilt hourly, about 1,300 addresses) is a default list source. List entries may now be `socks5://1.2.3.4:1080`, `1.2.3.4:8080` or `[2001:db8::1]:8080`, only the address counts. proxifly's much larger, unverified list is in the config as a commented option. - **Offline network data.** `detection.network-data.source` takes the URL of a feed file that marks end-user networks and hosting-like ones. It is read from disk, so a lookup costs no request. Two uses, both set under the same key: `fallback-block-hosting` (on) refuses a hosting-like network when no provider could answer, and `fast-admit-end-user` (off) skips the provider lookup for end-user networks and keeps the quota for the rest. The source is empty by default. - **Redis no longer holds up the start or needs a reload.** With `storage.type: redis` the plugin answers from its local store at once and connects to Redis in the background, retrying every 5 to 60 seconds. A start while Redis is down and a recovery afterwards both work without anybody touching the plugin. - **Faster first start.** Without a cached list the download begins at once instead of after an 8 second grace period, and the sources load side by side (at most three connections per host, the network feed alongside). A fresh install is protected about a second after it enables instead of 13. - **A hosting flag alone no longer blocks.** `detection.hosting-min-score` (default 0.5) asks for at least that much score from other signals, so a provider tagging an ordinary ISP as hosting does not refuse a real player. Set it to 0 to block every hosting flag as before. - **New default providers.** ip-check is on. ipapi.is (answers without flags when it has no key), IPQuery and FreeIPAPI (flagged no proxy in a public benchmark) are off, which saves requests. Existing configs keep their settings.
release

ProxyShield 3.0.1 (Sponge)

3.0.1+sponge
29 окт. 2026 г.1Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2sponge
Скачать
Что нового
### Fixed - **Bursts of logins no longer queue behind each other.** The lookup pool was sized to the number of providers, so one login used all of it and every other login waited, some until the 6 second total timeout and then got in unchecked. `api.max-parallel` now sizes the pool (default 64, up to 256). In a local join test, 21 of 60 joins in 6 seconds reached a provider before, all 60 now. ### Changed - **Staged lookups.** A lookup now asks the first two providers (`api.first-wave`, 0 asks all at once) and stops there when both answer and neither flags the address. A flag, a failure or a slow answer brings in the rest. Providers that are out of quota or recovering are skipped instead of being asked and failing. An ordinary address costs two requests instead of five, so the free quotas serve about twice as many new addresses. The default provider order puts the strongest keyless ones first (blackbox, ip-check, iplocate, ip-api, iprisk). - **Zowi's service is on by default, first in the list.** It was the strongest keyless provider in the public benchmark. The request uses `feature=security`, so only the verdict fields come back, and the provider limit is 120 a minute against the 150 the service allows per address. Existing configs keep their settings. - **Open proxies are blocked from a list.** monosans/proxy-list (MIT, rebuilt hourly, about 1,300 addresses) is a default list source. List entries may now be `socks5://1.2.3.4:1080`, `1.2.3.4:8080` or `[2001:db8::1]:8080`, only the address counts. proxifly's much larger, unverified list is in the config as a commented option. - **Offline network data.** `detection.network-data.source` takes the URL of a feed file that marks end-user networks and hosting-like ones. It is read from disk, so a lookup costs no request. Two uses, both set under the same key: `fallback-block-hosting` (on) refuses a hosting-like network when no provider could answer, and `fast-admit-end-user` (off) skips the provider lookup for end-user networks and keeps the quota for the rest. The source is empty by default. - **Redis no longer holds up the start or needs a reload.** With `storage.type: redis` the plugin answers from its local store at once and connects to Redis in the background, retrying every 5 to 60 seconds. A start while Redis is down and a recovery afterwards both work without anybody touching the plugin. - **Faster first start.** Without a cached list the download begins at once instead of after an 8 second grace period, and the sources load side by side (at most three connections per host, the network feed alongside). A fresh install is protected about a second after it enables instead of 13. - **A hosting flag alone no longer blocks.** `detection.hosting-min-score` (default 0.5) asks for at least that much score from other signals, so a provider tagging an ordinary ISP as hosting does not refuse a real player. Set it to 0 to block every hosting flag as before. - **New default providers.** ip-check is on. ipapi.is (answers without flags when it has no key), IPQuery and FreeIPAPI (flagged no proxy in a public benchmark) are off, which saves requests. Existing configs keep their settings.
release

ProxyShield 3.0.1 (Velocity)

3.0.1+velocity
29 окт. 2026 г.1Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2velocity
Скачать
Что нового
### Fixed - **Bursts of logins no longer queue behind each other.** The lookup pool was sized to the number of providers, so one login used all of it and every other login waited, some until the 6 second total timeout and then got in unchecked. `api.max-parallel` now sizes the pool (default 64, up to 256). In a local join test, 21 of 60 joins in 6 seconds reached a provider before, all 60 now. ### Changed - **Staged lookups.** A lookup now asks the first two providers (`api.first-wave`, 0 asks all at once) and stops there when both answer and neither flags the address. A flag, a failure or a slow answer brings in the rest. Providers that are out of quota or recovering are skipped instead of being asked and failing. An ordinary address costs two requests instead of five, so the free quotas serve about twice as many new addresses. The default provider order puts the strongest keyless ones first (blackbox, ip-check, iplocate, ip-api, iprisk). - **Zowi's service is on by default, first in the list.** It was the strongest keyless provider in the public benchmark. The request uses `feature=security`, so only the verdict fields come back, and the provider limit is 120 a minute against the 150 the service allows per address. Existing configs keep their settings. - **Open proxies are blocked from a list.** monosans/proxy-list (MIT, rebuilt hourly, about 1,300 addresses) is a default list source. List entries may now be `socks5://1.2.3.4:1080`, `1.2.3.4:8080` or `[2001:db8::1]:8080`, only the address counts. proxifly's much larger, unverified list is in the config as a commented option. - **Offline network data.** `detection.network-data.source` takes the URL of a feed file that marks end-user networks and hosting-like ones. It is read from disk, so a lookup costs no request. Two uses, both set under the same key: `fallback-block-hosting` (on) refuses a hosting-like network when no provider could answer, and `fast-admit-end-user` (off) skips the provider lookup for end-user networks and keeps the quota for the rest. The source is empty by default. - **Redis no longer holds up the start or needs a reload.** With `storage.type: redis` the plugin answers from its local store at once and connects to Redis in the background, retrying every 5 to 60 seconds. A start while Redis is down and a recovery afterwards both work without anybody touching the plugin. - **Faster first start.** Without a cached list the download begins at once instead of after an 8 second grace period, and the sources load side by side (at most three connections per host, the network feed alongside). A fresh install is protected about a second after it enables instead of 13. - **A hosting flag alone no longer blocks.** `detection.hosting-min-score` (default 0.5) asks for at least that much score from other signals, so a provider tagging an ordinary ISP as hosting does not refuse a real player. Set it to 0 to block every hosting flag as before. - **New default providers.** ip-check is on. ipapi.is (answers without flags when it has no key), IPQuery and FreeIPAPI (flagged no proxy in a public benchmark) are off, which saves requests. Existing configs keep their settings.
release

ProxyShield 3.0.1 (Bungee)

3.0.1+bungee
29 окт. 2026 г.2Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2bungeecord, waterfall
Скачать
Что нового
### Fixed - **Bursts of logins no longer queue behind each other.** The lookup pool was sized to the number of providers, so one login used all of it and every other login waited, some until the 6 second total timeout and then got in unchecked. `api.max-parallel` now sizes the pool (default 64, up to 256). In a local join test, 21 of 60 joins in 6 seconds reached a provider before, all 60 now. ### Changed - **Staged lookups.** A lookup now asks the first two providers (`api.first-wave`, 0 asks all at once) and stops there when both answer and neither flags the address. A flag, a failure or a slow answer brings in the rest. Providers that are out of quota or recovering are skipped instead of being asked and failing. An ordinary address costs two requests instead of five, so the free quotas serve about twice as many new addresses. The default provider order puts the strongest keyless ones first (blackbox, ip-check, iplocate, ip-api, iprisk). - **Zowi's service is on by default, first in the list.** It was the strongest keyless provider in the public benchmark. The request uses `feature=security`, so only the verdict fields come back, and the provider limit is 120 a minute against the 150 the service allows per address. Existing configs keep their settings. - **Open proxies are blocked from a list.** monosans/proxy-list (MIT, rebuilt hourly, about 1,300 addresses) is a default list source. List entries may now be `socks5://1.2.3.4:1080`, `1.2.3.4:8080` or `[2001:db8::1]:8080`, only the address counts. proxifly's much larger, unverified list is in the config as a commented option. - **Offline network data.** `detection.network-data.source` takes the URL of a feed file that marks end-user networks and hosting-like ones. It is read from disk, so a lookup costs no request. Two uses, both set under the same key: `fallback-block-hosting` (on) refuses a hosting-like network when no provider could answer, and `fast-admit-end-user` (off) skips the provider lookup for end-user networks and keeps the quota for the rest. The source is empty by default. - **Redis no longer holds up the start or needs a reload.** With `storage.type: redis` the plugin answers from its local store at once and connects to Redis in the background, retrying every 5 to 60 seconds. A start while Redis is down and a recovery afterwards both work without anybody touching the plugin. - **Faster first start.** Without a cached list the download begins at once instead of after an 8 second grace period, and the sources load side by side (at most three connections per host, the network feed alongside). A fresh install is protected about a second after it enables instead of 13. - **A hosting flag alone no longer blocks.** `detection.hosting-min-score` (default 0.5) asks for at least that much score from other signals, so a provider tagging an ordinary ISP as hosting does not refuse a real player. Set it to 0 to block every hosting flag as before. - **New default providers.** ip-check is on. ipapi.is (answers without flags when it has no key), IPQuery and FreeIPAPI (flagged no proxy in a public benchmark) are off, which saves requests. Existing configs keep their settings.
release

ProxyShield 3.0.1 (Folia)

3.0.1+folia
29 окт. 2026 г.2Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2folia
Скачать
Что нового
### Fixed - **Bursts of logins no longer queue behind each other.** The lookup pool was sized to the number of providers, so one login used all of it and every other login waited, some until the 6 second total timeout and then got in unchecked. `api.max-parallel` now sizes the pool (default 64, up to 256). In a local join test, 21 of 60 joins in 6 seconds reached a provider before, all 60 now. ### Changed - **Staged lookups.** A lookup now asks the first two providers (`api.first-wave`, 0 asks all at once) and stops there when both answer and neither flags the address. A flag, a failure or a slow answer brings in the rest. Providers that are out of quota or recovering are skipped instead of being asked and failing. An ordinary address costs two requests instead of five, so the free quotas serve about twice as many new addresses. The default provider order puts the strongest keyless ones first (blackbox, ip-check, iplocate, ip-api, iprisk). - **Zowi's service is on by default, first in the list.** It was the strongest keyless provider in the public benchmark. The request uses `feature=security`, so only the verdict fields come back, and the provider limit is 120 a minute against the 150 the service allows per address. Existing configs keep their settings. - **Open proxies are blocked from a list.** monosans/proxy-list (MIT, rebuilt hourly, about 1,300 addresses) is a default list source. List entries may now be `socks5://1.2.3.4:1080`, `1.2.3.4:8080` or `[2001:db8::1]:8080`, only the address counts. proxifly's much larger, unverified list is in the config as a commented option. - **Offline network data.** `detection.network-data.source` takes the URL of a feed file that marks end-user networks and hosting-like ones. It is read from disk, so a lookup costs no request. Two uses, both set under the same key: `fallback-block-hosting` (on) refuses a hosting-like network when no provider could answer, and `fast-admit-end-user` (off) skips the provider lookup for end-user networks and keeps the quota for the rest. The source is empty by default. - **Redis no longer holds up the start or needs a reload.** With `storage.type: redis` the plugin answers from its local store at once and connects to Redis in the background, retrying every 5 to 60 seconds. A start while Redis is down and a recovery afterwards both work without anybody touching the plugin. - **Faster first start.** Without a cached list the download begins at once instead of after an 8 second grace period, and the sources load side by side (at most three connections per host, the network feed alongside). A fresh install is protected about a second after it enables instead of 13. - **A hosting flag alone no longer blocks.** `detection.hosting-min-score` (default 0.5) asks for at least that much score from other signals, so a provider tagging an ordinary ISP as hosting does not refuse a real player. Set it to 0 to block every hosting flag as before. - **New default providers.** ip-check is on. ipapi.is (answers without flags when it has no key), IPQuery and FreeIPAPI (flagged no proxy in a public benchmark) are off, which saves requests. Existing configs keep their settings.
release

ProxyShield 3.0.1 (Paper)

3.0.1+paper
29 окт. 2026 г.2Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2bukkit, paper, purpur, spigot
Скачать
Что нового
### Fixed - **Bursts of logins no longer queue behind each other.** The lookup pool was sized to the number of providers, so one login used all of it and every other login waited, some until the 6 second total timeout and then got in unchecked. `api.max-parallel` now sizes the pool (default 64, up to 256). In a local join test, 21 of 60 joins in 6 seconds reached a provider before, all 60 now. ### Changed - **Staged lookups.** A lookup now asks the first two providers (`api.first-wave`, 0 asks all at once) and stops there when both answer and neither flags the address. A flag, a failure or a slow answer brings in the rest. Providers that are out of quota or recovering are skipped instead of being asked and failing. An ordinary address costs two requests instead of five, so the free quotas serve about twice as many new addresses. The default provider order puts the strongest keyless ones first (blackbox, ip-check, iplocate, ip-api, iprisk). - **Zowi's service is on by default, first in the list.** It was the strongest keyless provider in the public benchmark. The request uses `feature=security`, so only the verdict fields come back, and the provider limit is 120 a minute against the 150 the service allows per address. Existing configs keep their settings. - **Open proxies are blocked from a list.** monosans/proxy-list (MIT, rebuilt hourly, about 1,300 addresses) is a default list source. List entries may now be `socks5://1.2.3.4:1080`, `1.2.3.4:8080` or `[2001:db8::1]:8080`, only the address counts. proxifly's much larger, unverified list is in the config as a commented option. - **Offline network data.** `detection.network-data.source` takes the URL of a feed file that marks end-user networks and hosting-like ones. It is read from disk, so a lookup costs no request. Two uses, both set under the same key: `fallback-block-hosting` (on) refuses a hosting-like network when no provider could answer, and `fast-admit-end-user` (off) skips the provider lookup for end-user networks and keeps the quota for the rest. The source is empty by default. - **Redis no longer holds up the start or needs a reload.** With `storage.type: redis` the plugin answers from its local store at once and connects to Redis in the background, retrying every 5 to 60 seconds. A start while Redis is down and a recovery afterwards both work without anybody touching the plugin. - **Faster first start.** Without a cached list the download begins at once instead of after an 8 second grace period, and the sources load side by side (at most three connections per host, the network feed alongside). A fresh install is protected about a second after it enables instead of 13. - **A hosting flag alone no longer blocks.** `detection.hosting-min-score` (default 0.5) asks for at least that much score from other signals, so a provider tagging an ordinary ISP as hosting does not refuse a real player. Set it to 0 to block every hosting flag as before. - **New default providers.** ip-check is on. ipapi.is (answers without flags when it has no key), IPQuery and FreeIPAPI (flagged no proxy in a public benchmark) are off, which saves requests. Existing configs keep their settings.
beta

ProxyShield 3.0.0 (Universal)

3.0.0+universal
10 окт. 2026 г.63Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2, 26.3bukkit, bungeecord, folia, paper, purpur, spigot, sponge, velocity, waterfall
Скачать
Что нового
### Added - **Rules on provider answers.** Every provider, listed or your own, takes a `conditions` block with named groups of `<field> <op> <value>` lines. A `bypass` group that matches clears every flag the provider raised, a `flag` group raises one the field mapping did not. Lines inside a group must all hold, any one group is enough. Numbers compare as numbers, text ignoring case, and a field missing from the answer never satisfies a line. An unreadable line is skipped with a warning at start-up instead of taking the whole config down. - **Request headers per provider.** `headers:` adds any header to a provider's request, with `{key}` and `{ip}` filled in, for services that want `Authorization: Bearer ...` or similar. - **`settings.debug`** prints every provider answer, raw body included, next to what was read from it. That is what you write conditions against. - **ISP filter.** `detection.isp.blocked` and `detection.isp.allowed` take case-insensitive regular expressions matched against the provider's ISP name. An allowed ISP outranks the proxy and hosting flags, which makes it the place for a mobile carrier that keeps getting flagged. - **Downloadable ASN lists.** `detection.asn.sources` takes https URLs serving a JSON array or plain text with one network per line. They refresh with the address feeds, and the last good download is kept in `asn-cache.txt`. - **Bogon addresses are refused.** Documentation, benchmark, multicast and reserved ranges cannot belong to a real player; one of them at login means a forwarding layer was given a false address. Private and Tailscale ranges are not affected. `detection.block-bogon: false` turns it off. - **Connection limit.** `limiter` caps accounts per address as a hard rule, either counting who is online right now or counting admissions inside a window such as `30m`, which resets on its own. Whitelisted, local and bypassing players never count. Off by default. - **Restricted servers** on BungeeCord and Velocity. With `restricted.enabled`, a flagged player is not disconnected but kept on the backends you list, for example the lobby and the login server. On the first connect they are routed to the first allowed backend, and disconnected only if none exists. - **Passive mode.** `detection.passive` checks nobody at login. `/proxyshield check` and the API keep working, so ProxyShield can sit next to another anti-VPN as a lookup tool. - **Telegram and VK alerts**, plain text with the same placeholders as the console line, sent through the same bounded queue model as the Discord webhook. - **`/proxyshield alts <ip|player>`** lists every account seen on the same address, newest first. The history lives in `alts.tsv` next to the config, is pruned after `alts.retention-days`, and groups IPv6 clients by their /64 the same way the cache does. - **Whitelist and blacklist entries with a reason and an expiry.** `/proxyshield whitelist add <entry> [30m|12h|7d|perm] [reason...]` stores who added the entry, when, why, and until when. `info` shows that, `purge` clears every in-game entry, and `list` marks the timed ones. A timed entry stops matching the moment it runs out, not at the next save. Files written by older builds load unchanged, and a note written by hand after `#` is kept as the reason. - `/proxyshield stats` counts network/ISP, account-limit and bogon blocks. ### Changed - **The ISP name is the one most providers agree on**, not the first that answered. Providers disagree on names more than on anything else: for 1.1.1.1 one reports Cloudflare and another the registrant of the block, APNIC. Which of those landed in the alert and in the ISP filter used to depend on network timing. ### Upgrading New options take effect with their defaults even when your `config.yml` does not list them yet: bogon blocking and the account history are on, everything else is off. To see and change them, compare your file with the new default or let the plugin write a fresh one. ### Testing Live on Paper 1.21.11: bogon refusal, the ISP filter, a flag condition on a custom provider, debug output, timed whitelist entries with `info` and `purge`, and the account history with two connecting clients. Telegram, VK, the connection limit and restricted servers are covered by unit tests only so far; the last two cannot be exercised from a loopback address, which ProxyShield never checks.
beta

ProxyShield 3.0.0 (Sponge)

3.0.0+sponge
10 окт. 2026 г.8Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2sponge
Скачать
Что нового
### Added - **Rules on provider answers.** Every provider, listed or your own, takes a `conditions` block with named groups of `<field> <op> <value>` lines. A `bypass` group that matches clears every flag the provider raised, a `flag` group raises one the field mapping did not. Lines inside a group must all hold, any one group is enough. Numbers compare as numbers, text ignoring case, and a field missing from the answer never satisfies a line. An unreadable line is skipped with a warning at start-up instead of taking the whole config down. - **Request headers per provider.** `headers:` adds any header to a provider's request, with `{key}` and `{ip}` filled in, for services that want `Authorization: Bearer ...` or similar. - **`settings.debug`** prints every provider answer, raw body included, next to what was read from it. That is what you write conditions against. - **ISP filter.** `detection.isp.blocked` and `detection.isp.allowed` take case-insensitive regular expressions matched against the provider's ISP name. An allowed ISP outranks the proxy and hosting flags, which makes it the place for a mobile carrier that keeps getting flagged. - **Downloadable ASN lists.** `detection.asn.sources` takes https URLs serving a JSON array or plain text with one network per line. They refresh with the address feeds, and the last good download is kept in `asn-cache.txt`. - **Bogon addresses are refused.** Documentation, benchmark, multicast and reserved ranges cannot belong to a real player; one of them at login means a forwarding layer was given a false address. Private and Tailscale ranges are not affected. `detection.block-bogon: false` turns it off. - **Connection limit.** `limiter` caps accounts per address as a hard rule, either counting who is online right now or counting admissions inside a window such as `30m`, which resets on its own. Whitelisted, local and bypassing players never count. Off by default. - **Restricted servers** on BungeeCord and Velocity. With `restricted.enabled`, a flagged player is not disconnected but kept on the backends you list, for example the lobby and the login server. On the first connect they are routed to the first allowed backend, and disconnected only if none exists. - **Passive mode.** `detection.passive` checks nobody at login. `/proxyshield check` and the API keep working, so ProxyShield can sit next to another anti-VPN as a lookup tool. - **Telegram and VK alerts**, plain text with the same placeholders as the console line, sent through the same bounded queue model as the Discord webhook. - **`/proxyshield alts <ip|player>`** lists every account seen on the same address, newest first. The history lives in `alts.tsv` next to the config, is pruned after `alts.retention-days`, and groups IPv6 clients by their /64 the same way the cache does. - **Whitelist and blacklist entries with a reason and an expiry.** `/proxyshield whitelist add <entry> [30m|12h|7d|perm] [reason...]` stores who added the entry, when, why, and until when. `info` shows that, `purge` clears every in-game entry, and `list` marks the timed ones. A timed entry stops matching the moment it runs out, not at the next save. Files written by older builds load unchanged, and a note written by hand after `#` is kept as the reason. - `/proxyshield stats` counts network/ISP, account-limit and bogon blocks. ### Changed - **The ISP name is the one most providers agree on**, not the first that answered. Providers disagree on names more than on anything else: for 1.1.1.1 one reports Cloudflare and another the registrant of the block, APNIC. Which of those landed in the alert and in the ISP filter used to depend on network timing. ### Upgrading New options take effect with their defaults even when your `config.yml` does not list them yet: bogon blocking and the account history are on, everything else is off. To see and change them, compare your file with the new default or let the plugin write a fresh one. ### Testing Live on Paper 1.21.11: bogon refusal, the ISP filter, a flag condition on a custom provider, debug output, timed whitelist entries with `info` and `purge`, and the account history with two connecting clients. Telegram, VK, the connection limit and restricted servers are covered by unit tests only so far; the last two cannot be exercised from a loopback address, which ProxyShield never checks.
beta

ProxyShield 3.0.0 (Velocity)

3.0.0+velocity
10 окт. 2026 г.5Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2velocity
Скачать
Что нового
### Added - **Rules on provider answers.** Every provider, listed or your own, takes a `conditions` block with named groups of `<field> <op> <value>` lines. A `bypass` group that matches clears every flag the provider raised, a `flag` group raises one the field mapping did not. Lines inside a group must all hold, any one group is enough. Numbers compare as numbers, text ignoring case, and a field missing from the answer never satisfies a line. An unreadable line is skipped with a warning at start-up instead of taking the whole config down. - **Request headers per provider.** `headers:` adds any header to a provider's request, with `{key}` and `{ip}` filled in, for services that want `Authorization: Bearer ...` or similar. - **`settings.debug`** prints every provider answer, raw body included, next to what was read from it. That is what you write conditions against. - **ISP filter.** `detection.isp.blocked` and `detection.isp.allowed` take case-insensitive regular expressions matched against the provider's ISP name. An allowed ISP outranks the proxy and hosting flags, which makes it the place for a mobile carrier that keeps getting flagged. - **Downloadable ASN lists.** `detection.asn.sources` takes https URLs serving a JSON array or plain text with one network per line. They refresh with the address feeds, and the last good download is kept in `asn-cache.txt`. - **Bogon addresses are refused.** Documentation, benchmark, multicast and reserved ranges cannot belong to a real player; one of them at login means a forwarding layer was given a false address. Private and Tailscale ranges are not affected. `detection.block-bogon: false` turns it off. - **Connection limit.** `limiter` caps accounts per address as a hard rule, either counting who is online right now or counting admissions inside a window such as `30m`, which resets on its own. Whitelisted, local and bypassing players never count. Off by default. - **Restricted servers** on BungeeCord and Velocity. With `restricted.enabled`, a flagged player is not disconnected but kept on the backends you list, for example the lobby and the login server. On the first connect they are routed to the first allowed backend, and disconnected only if none exists. - **Passive mode.** `detection.passive` checks nobody at login. `/proxyshield check` and the API keep working, so ProxyShield can sit next to another anti-VPN as a lookup tool. - **Telegram and VK alerts**, plain text with the same placeholders as the console line, sent through the same bounded queue model as the Discord webhook. - **`/proxyshield alts <ip|player>`** lists every account seen on the same address, newest first. The history lives in `alts.tsv` next to the config, is pruned after `alts.retention-days`, and groups IPv6 clients by their /64 the same way the cache does. - **Whitelist and blacklist entries with a reason and an expiry.** `/proxyshield whitelist add <entry> [30m|12h|7d|perm] [reason...]` stores who added the entry, when, why, and until when. `info` shows that, `purge` clears every in-game entry, and `list` marks the timed ones. A timed entry stops matching the moment it runs out, not at the next save. Files written by older builds load unchanged, and a note written by hand after `#` is kept as the reason. - `/proxyshield stats` counts network/ISP, account-limit and bogon blocks. ### Changed - **The ISP name is the one most providers agree on**, not the first that answered. Providers disagree on names more than on anything else: for 1.1.1.1 one reports Cloudflare and another the registrant of the block, APNIC. Which of those landed in the alert and in the ISP filter used to depend on network timing. ### Upgrading New options take effect with their defaults even when your `config.yml` does not list them yet: bogon blocking and the account history are on, everything else is off. To see and change them, compare your file with the new default or let the plugin write a fresh one. ### Testing Live on Paper 1.21.11: bogon refusal, the ISP filter, a flag condition on a custom provider, debug output, timed whitelist entries with `info` and `purge`, and the account history with two connecting clients. Telegram, VK, the connection limit and restricted servers are covered by unit tests only so far; the last two cannot be exercised from a loopback address, which ProxyShield never checks.
beta

ProxyShield 3.0.0 (Bungee)

3.0.0+bungee
10 окт. 2026 г.4Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2, 26.2bungeecord, waterfall
Скачать
Что нового
### Added - **Rules on provider answers.** Every provider, listed or your own, takes a `conditions` block with named groups of `<field> <op> <value>` lines. A `bypass` group that matches clears every flag the provider raised, a `flag` group raises one the field mapping did not. Lines inside a group must all hold, any one group is enough. Numbers compare as numbers, text ignoring case, and a field missing from the answer never satisfies a line. An unreadable line is skipped with a warning at start-up instead of taking the whole config down. - **Request headers per provider.** `headers:` adds any header to a provider's request, with `{key}` and `{ip}` filled in, for services that want `Authorization: Bearer ...` or similar. - **`settings.debug`** prints every provider answer, raw body included, next to what was read from it. That is what you write conditions against. - **ISP filter.** `detection.isp.blocked` and `detection.isp.allowed` take case-insensitive regular expressions matched against the provider's ISP name. An allowed ISP outranks the proxy and hosting flags, which makes it the place for a mobile carrier that keeps getting flagged. - **Downloadable ASN lists.** `detection.asn.sources` takes https URLs serving a JSON array or plain text with one network per line. They refresh with the address feeds, and the last good download is kept in `asn-cache.txt`. - **Bogon addresses are refused.** Documentation, benchmark, multicast and reserved ranges cannot belong to a real player; one of them at login means a forwarding layer was given a false address. Private and Tailscale ranges are not affected. `detection.block-bogon: false` turns it off. - **Connection limit.** `limiter` caps accounts per address as a hard rule, either counting who is online right now or counting admissions inside a window such as `30m`, which resets on its own. Whitelisted, local and bypassing players never count. Off by default. - **Restricted servers** on BungeeCord and Velocity. With `restricted.enabled`, a flagged player is not disconnected but kept on the backends you list, for example the lobby and the login server. On the first connect they are routed to the first allowed backend, and disconnected only if none exists. - **Passive mode.** `detection.passive` checks nobody at login. `/proxyshield check` and the API keep working, so ProxyShield can sit next to another anti-VPN as a lookup tool. - **Telegram and VK alerts**, plain text with the same placeholders as the console line, sent through the same bounded queue model as the Discord webhook. - **`/proxyshield alts <ip|player>`** lists every account seen on the same address, newest first. The history lives in `alts.tsv` next to the config, is pruned after `alts.retention-days`, and groups IPv6 clients by their /64 the same way the cache does. - **Whitelist and blacklist entries with a reason and an expiry.** `/proxyshield whitelist add <entry> [30m|12h|7d|perm] [reason...]` stores who added the entry, when, why, and until when. `info` shows that, `purge` clears every in-game entry, and `list` marks the timed ones. A timed entry stops matching the moment it runs out, not at the next save. Files written by older builds load unchanged, and a note written by hand after `#` is kept as the reason. - `/proxyshield stats` counts network/ISP, account-limit and bogon blocks. ### Changed - **The ISP name is the one most providers agree on**, not the first that answered. Providers disagree on names more than on anything else: for 1.1.1.1 one reports Cloudflare and another the registrant of the block, APNIC. Which of those landed in the alert and in the ISP filter used to depend on network timing. ### Upgrading New options take effect with their defaults even when your `config.yml` does not list them yet: bogon blocking and the account history are on, everything else is off. To see and change them, compare your file with the new default or let the plugin write a fresh one. ### Testing Live on Paper 1.21.11: bogon refusal, the ISP filter, a flag condition on a custom provider, debug output, timed whitelist entries with `info` and `purge`, and the account history with two connecting clients. Telegram, VK, the connection limit and restricted servers are covered by unit tests only so far; the last two cannot be exercised from a loopback address, which ProxyShield never checks.