{"id":160613,"date":"2026-06-09T17:59:23","date_gmt":"2026-06-09T14:59:23","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/"},"modified":"2026-06-09T17:59:23","modified_gmt":"2026-06-09T14:59:23","slug":"tunnelmc","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/","title":{"rendered":"TunnelMC"},"content":{"rendered":"<p># TunnelMC \ud83c\udf10<\/p>\n<p>> Expose any local port to the internet via ngrok or cloudflared \u2014 no port allocations needed. Includes a full browser-based management dashboard.<\/p>\n<p>TunnelMC is a Bukkit\/Spigot\/Paper plugin that automatically downloads and manages ngrok and\/or cloudflared, creates tunnels for any local port, and broadcasts the public URL to console and online OPs the moment the tunnel is ready.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udd95 What&#8217;s New in 1.3.0<\/p>\n<p>### Java 25 &#038; Build Modernization<br \/>\n&#8211; **Upgraded to Java 25** \u2014 compiled with Java 25 bytecode for the latest JVM performance and language features.<br \/>\n&#8211; **Gradle 9.5.1** \u2014 build system upgraded from Gradle 8.x to 9.5.1 for native Java 25 support.<br \/>\n&#8211; **Virtual thread executor** \u2014 the dashboard HTTP server now uses `newVirtualThreadPerTaskExecutor()` for non-blocking I\/O scaling on Java 25.<br \/>\n&#8211; **`plugin.yml` api-version** updated from `1.13` to `1.21` to match the target platform and suppress Paper deprecation warnings.<\/p>\n<p>### Security Hardening<br \/>\n&#8211; **CSRF protection** \u2014 all mutating API endpoints now require an `X-TM-Request` header.<br \/>\n&#8211; **Brute-force login protection** \u2014 lockout after 5 failed attempts with 500ms delay per failure.<br \/>\n&#8211; **Timing-safe password comparison** \u2014 login now uses `MessageDigest.isEqual()` to prevent timing attacks.<br \/>\n&#8211; **CSP headers** \u2014 Content-Security-Policy added to all dashboard responses to mitigate XSS risks.<br \/>\n&#8211; **Session sweep** \u2014 expired sessions and stale lockout entries are automatically cleaned up hourly.<\/p>\n<p>### Stability<br \/>\n&#8211; **`volatile` singleton** \u2014 static plugin instance is now `volatile` and nulled on disable to prevent classloader leaks during reloads.<br \/>\n&#8211; **Config bounds checking** \u2014 all numeric config getters now clamp to valid ranges via `Math.max`.<br \/>\n&#8211; **Default password warning** \u2014 a prominent console warning at startup if the dashboard password is still `&#8221;changeme&#8221;`.<\/p>\n<p>### Compatibility<br \/>\n&#8211; **Minecraft 1.21.x \u2013 26.1.x** \u2014 compiled against Paper 1.21.1 API, which is forward-compatible with all Paper versions through 26.1.x.<\/p>\n<p>Existing configs remain fully compatible \u2014 no config changes required.<\/p>\n<p>&#8212;<\/p>\n<p>## \u2728 Features<\/p>\n<p>**\ud83c\udf10 Two Tunnel Providers** \u2014 ngrok and cloudflared, configurable per tunnel. Mix them freely.<\/p>\n<p>**\ud83d\udd11 Multiple ngrok Accounts** \u2014 Each ngrok tunnel has its own authtoken (required for v3). Run different accounts simultaneously.<\/p>\n<p>**\ud83d\ude80 Zero-Setup Quick Tunnels** \u2014 Cloudflared quick tunnels work out of the box with no account.<\/p>\n<p>**\ud83d\udccc Custom Domains** \u2014 Cloudflared named tunnels give you persistent custom hostnames via Cloudflare Zero Trust.<\/p>\n<p>**\ud83d\udda5\ufe0f Web Dashboard** \u2014 Full management UI. Create\/edit\/delete tunnels live, download binaries, change settings \u2014 all from a browser.<\/p>\n<p>**\u26a1 Auto-Download** \u2014 Detects OS and CPU arch, downloads the right binary on first use. Cached forever after.<\/p>\n<p>**\ud83d\udd14 Instant URL Broadcast** \u2014 URL goes to console and all online OPs the moment the tunnel is ready.<\/p>\n<p>**\ud83c\udfae Full Command Support** \u2014 `\/tunnel` with tab completion for everything.<\/p>\n<p>**\ud83d\udd01 Auto-Restart &#038; Crash Loop Protection** \u2014 Tunnels restart after failure. Stops retrying if it fails too many times in a short window.<\/p>\n<p>**\ud83e\ude7a Health Checks** \u2014 ngrok tunnels get API-level checks; cloudflared tunnels get process-alive checks.<\/p>\n<p>**\ud83d\udc0b Pterodactyl Compatible** \u2014 Tunnels are outbound connections, so no extra port allocations are ever needed.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udce5 Installation<\/p>\n<p>1. Drop `TunnelMC.jar` into `plugins\/`<br \/>\n2. Start the server \u2014 TunnelMC generates config and auto-exposes the dashboard via cloudflared if no tunnels are configured<br \/>\n3. Open the printed URL in your browser<br \/>\n4. Configure tunnels from the dashboard, or edit `config.yml` and run `\/tunnel reload`<\/p>\n<p>&#8212;<\/p>\n<p>## \u2699\ufe0f Configuration<\/p>\n<p>&#8220;`yaml<br \/>\nauto-start: false<br \/>\ndefault-region: &#8220;us&#8221;       # fallback region for ngrok tunnels<br \/>\nnotify-ops: true<br \/>\nauto-restart: true<br \/>\nrestart-delay-seconds: 10<br \/>\nmax-restarts: 5<br \/>\ncrash-window-seconds: 60<br \/>\nhealth-check-interval-seconds: 30<\/p>\n<p>dashboard:<br \/>\n  enabled: true<br \/>\n  port: 8090<br \/>\n  bind-address: &#8220;127.0.0.1&#8221;<br \/>\n  password: &#8220;changeme&#8221;<br \/>\n  auto-expose-on-first-run: true<\/p>\n<p>tunnels:<br \/>\n  # Cloudflared quick tunnel \u2014 no account, random URL, HTTP only<br \/>\n  &#8211; name: &#8220;dashboard&#8221;<br \/>\n    port: 8090<br \/>\n    provider: &#8220;cloudflared&#8221;<br \/>\n    auto-start: true<\/p>\n<p>  # ngrok HTTP tunnel with its own account token<br \/>\n  &#8211; name: &#8220;noderunner&#8221;<br \/>\n    port: 8080<br \/>\n    provider: &#8220;ngrok&#8221;<br \/>\n    protocol: &#8220;http&#8221;<br \/>\n    region: &#8220;us&#8221;<br \/>\n    authtoken: &#8220;your-ngrok-token-here&#8221;<\/p>\n<p>  # ngrok TCP tunnel from a different account<br \/>\n  &#8211; name: &#8220;gameserver&#8221;<br \/>\n    port: 25565<br \/>\n    provider: &#8220;ngrok&#8221;<br \/>\n    protocol: &#8220;tcp&#8221;<br \/>\n    region: &#8220;eu&#8221;<br \/>\n    authtoken: &#8220;another-account-token&#8221;<\/p>\n<p>  # Cloudflared named tunnel \u2014 persistent custom domain<br \/>\n  &#8211; name: &#8220;mc&#8221;<br \/>\n    port: 25565<br \/>\n    provider: &#8220;cloudflared&#8221;<br \/>\n    token: &#8220;your-cloudflare-zero-trust-token&#8221;<br \/>\n    hostname: &#8220;mc.yourdomain.com&#8221;<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udfae Commands &#038; Permissions<\/p>\n<p>**Permission:** `tunnelmc.admin` *(default: OP)*<\/p>\n<p>| Command | Description |<br \/>\n|&#8212;|&#8212;|<br \/>\n| `\/tunnel start [name]` | Start all or a specific tunnel |<br \/>\n| `\/tunnel stop [name]` | Stop all or a specific tunnel |<br \/>\n| `\/tunnel restart [name]` | Restart all or a specific tunnel |<br \/>\n| `\/tunnel url [name]` | Show public URL(s) |<br \/>\n| `\/tunnel status` | Show all tunnel status |<br \/>\n| `\/tunnel download ngrok` | Download ngrok binary |<br \/>\n| `\/tunnel download cloudflared` | Download cloudflared binary |<br \/>\n| `\/tunnel dashboard` | Show dashboard port info |<br \/>\n| `\/tunnel reload` | Reload config and restart tunnels |<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udccb Provider Comparison<\/p>\n<p>| | ngrok | Cloudflared Quick | Cloudflared Named |<br \/>\n|&#8212;|:&#8212;:|:&#8212;:|:&#8212;:|<br \/>\n| Account required | \u2705 free | \u274c none | \u2705 free |<br \/>\n| HTTP tunnels | \u2705 | \u2705 | \u2705 |<br \/>\n| TCP tunnels | \u2705 | \u274c | \u2705 |<br \/>\n| Persistent URL | paid only | \u274c | \u2705 |<br \/>\n| Multiple accounts | \u2705 per-tunnel | \u2014 | \u2014 |<\/p>\n<p>&#8212;<\/p>\n<p>## \u26a0\ufe0f Free Plan Notes<\/p>\n<p>**ngrok free:** one active tunnel at a time, random URL on each restart, bandwidth limits. Authtoken is required for all ngrok v3 tunnels. Per-tunnel authtokens let you use multiple free accounts to work around the one-tunnel limit.<\/p>\n<p>**Cloudflared quick tunnels:** HTTP only, random `*.trycloudflare.com` URL, no bandwidth limits.<\/p>\n<p>**Cloudflared named tunnels:** require a Cloudflare account (free), any protocol, persistent custom domain.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udc0b Pterodactyl<\/p>\n<p>No extra port allocations needed \u2014 tunnels are outbound connections only. The dashboard also binds locally and doesn&#8217;t need an allocated port.<\/p>\n<p>**Slow download?** TunnelMC will warn after 30 seconds with manual install steps. Place the binary at `plugins\/TunnelMC\/ngrok\/ngrok` or `plugins\/TunnelMC\/cloudflared\/cloudflared` and restart.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcca Compatibility<\/p>\n<p>| | |<br \/>\n|&#8212;|&#8212;|<br \/>\n| **Platforms** | Bukkit, Spigot, Paper, Purpur |<br \/>\n| **Minecraft** | 1.21.x \u2013 26.1.x |<br \/>\n| **Java** | 25+ (compiled with Java 25) |<br \/>\n| **OS** | Linux, macOS, Windows |<br \/>\n| **Arch** | x64, ARM64 |<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd17 Related<\/p>\n<p>**NodeRunner** \u2014 Run a Node.js Discord bot inside your Minecraft server.<\/p>\n<p>**PyRunner** \u2014 Run a Python Discord bot inside your Minecraft server.<\/p>\n<p>*TunnelMC pairs perfectly with both \u2014 a cloudflared quick tunnel to port 8080 makes their dashboards publicly accessible with zero port allocation.*<\/p>\n<p>&#8212;<\/p>\n<p>*Developed by Spider*<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Expose any server port to the internet via ngrok and cloudflared tunnels \u2014 no extra port allocations needed.<\/p>\n","protected":false},"featured_media":160614,"template":"","meta":{"_minecraft_slug":"tunnelmc","_minecraft_project_id":"cEYrTBi3","_minecraft_author":"spider2742","_minecraft_license":"LicenseRef-All-Rights-Reserved","_minecraft_downloads":28,"_minecraft_follows":0,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"tunnelmc.zip","_minecraft_size_bytes":212530,"_minecraft_version_count":4,"_minecraft_updated_at":"2026-05-15T22:19:33.919674Z","_minecraft_date_created":"2026-04-14T00:08:02.183978Z","_minecraft_date_modified":"2026-05-14T12:26:59.738487Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/tunnelmc","_minecraft_icon_attachment_id":160614,"_minecraft_imported_at":"2026-06-09T14:59:23+00:00","_minecraft_import_hash":"b5383300636d57a59bf19eb60fcc826c","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,125,126,127,128,129,123,92],"mod_loader":[130,131,132,133,134],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82,83,167,163],"class_list":["post-160613","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-folia","mod_category-management","mod_category-paper","mod_category-purpur","mod_category-spigot","mod_category-technology","mod_category-utility","mod_loader-bukkit","mod_loader-folia","mod_loader-paper","mod_loader-purpur","mod_loader-spigot","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9","minecraft_version-26-1","minecraft_version-26-1-1","minecraft_version-26-1-2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>TunnelMC - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"TunnelMC - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Expose any server port to the internet via ngrok and cloudflared tunnels \u2014 no extra port allocations needed.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/\",\"name\":\"TunnelMC - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/tunnelmc-icon-476361d47f07649cd586c7da11b328a7f380724d_96.webp\",\"datePublished\":\"2026-06-09T14:59:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/tunnelmc-icon-476361d47f07649cd586c7da11b328a7f380724d_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/tunnelmc-icon-476361d47f07649cd586c7da11b328a7f380724d_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/tunnelmc\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"TunnelMC\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"TunnelMC - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/","og_locale":"en_US","og_type":"article","og_title":"TunnelMC - Minecraft","og_description":"Expose any server port to the internet via ngrok and cloudflared tunnels \u2014 no extra port allocations needed.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/","name":"TunnelMC - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/tunnelmc-icon-476361d47f07649cd586c7da11b328a7f380724d_96.webp","datePublished":"2026-06-09T14:59:23+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/tunnelmc-icon-476361d47f07649cd586c7da11b328a7f380724d_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/tunnelmc-icon-476361d47f07649cd586c7da11b328a7f380724d_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/tunnelmc\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"TunnelMC"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/160613","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/160614"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=160613"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=160613"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=160613"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=160613"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}