ShadowNode SHADOWNODE

Guides / Proxy

Run a Velocity or BungeeCord proxy

Want a lobby that sends players to several worlds (survival, anarchy, minigames)? Put a proxy in front of them. On ShadowNode there is exactly one rule that trips everyone up โ€” connect backends by their hostname on port 25565, never a custom port. This guide shows why, and the exact config.

๐Ÿงญ Velocity & BungeeCord๐Ÿ”Œ Port 25565๐ŸŽฎ Java Edition

What you need

A proxy setup is several servers working together โ€” each one is a normal ShadowNode Minecraft server with its own address.

Order one server for the proxy (this runs Velocity or BungeeCord) and one or more backend servers (your actual worlds). Each has its own address like yourname.mc.shadownodehosting.com, shown with a copy button in your console.
โš ๏ธ Fair use โ€” a proxy must front your own ShadowNode servers. Velocity/BungeeCord is for linking your ShadowNode Minecraft worlds behind one address. Running it as a standalone / pure proxy โ€” forwarding players to an external (non-ShadowNode) server, or using the slot as a generic relay, tunnel or VPN โ€” is not Minecraft hosting and is not allowed. A proxy with no ShadowNode backends (and no one ever joining) is treated as abuse and suspended without warning (see Terms & Acceptable Use).

The one rule: use port 25565, not the internal port

This is the single reason 99 % of proxy setups fail on shared hosting.

ShadowNode routes Minecraft traffic by hostname on the standard port 25565. When a connection comes in, our router reads the address from the Minecraft handshake and forwards it to the right server. That means:

โœ… Always point your proxy at <backend-address>:25565 โ€” the address exactly as shown in your console.
โŒ Never use an internal/allocation port like 27028. Those ports are not open on the public network, so the connection just times out.
๐Ÿ“ Where does 25565 go? Only in the proxy config (velocity.toml / config.yml). Do not touch server-port in server.properties โ€” that is your backend's internal port, assigned by the panel; changing it breaks the server. The only server.properties change for a proxy backend is online-mode=false.

If you use the wrong port, your proxy log looks like this:

[ERROR]: [connected player] Player: unable to connect to server ANARCHY
io.netty.channel.ConnectTimeoutException: connection timed out after 30000 ms:
    youranarchy.mc.shadownodehosting.com/โ€ฆ:27028   โ† wrong: custom port

The fix is always the same: change that port to 25565.

Velocity (velocity.toml)

Edit velocity.toml on your proxy server (open it in the console file manager). Each backend is its own hostname on 25565:

# velocity.toml
[servers]
lobby   = "yourlobby.mc.shadownodehosting.com:25565"
anarchy = "youranarchy.mc.shadownodehosting.com:25565"
survival = "yoursurvival.mc.shadownodehosting.com:25565"

# where new players land first
try = ["lobby"]
Use the address exactly as it appears in each backend server's console โ€” no trailing dot, no extra path, just host:25565.

For player info (skins, UUIDs, real IPs) Velocity uses modern forwarding. Set player-info-forwarding-mode = "modern" in velocity.toml, copy the generated forwarding.secret, and on each Paper backend enable it in config/paper-global.yml (velocity: enabled: true, paste the same secret). Backends then run in online-mode=false because the proxy handles authentication.

BungeeCord / Waterfall (config.yml)

Same idea โ€” every server entry points at the backend hostname on 25565:

# config.yml
servers:
  lobby:
    address: yourlobby.mc.shadownodehosting.com:25565
    restricted: false
  anarchy:
    address: youranarchy.mc.shadownodehosting.com:25565
    restricted: false
priorities:
  - lobby
On BungeeCord set ip_forward: true, and on each backend (Spigot/Paper) set bungeecord: true in spigot.yml and online-mode=false in server.properties.

Point your players at the proxy

Players don't connect to the backends โ€” they connect to the proxy's own address (e.g. yournetwork.mc.shadownodehosting.com). The proxy then forwards them to lobby, and in-game they can move between servers. Share only the proxy address.

Backends should be always-on for a network. Free servers sleep when empty and wake on join โ€” great for a single world, but a proxy expects its backends up, so use an always-on plan (mc-247 or a paid tier) for the backends.

Troubleshooting

ConnectTimeoutException โ€ฆ :27028 (or any custom port)
You used an internal port. Change every backend entry to :25565 and use the console address.
โ€œUnable to connect to backendโ€ / instant kick
Wrong hostname or the backend is asleep/offline. Copy the exact address from that server's console and make sure it's running (join it directly once to wake it).
Players show as offline-mode / wrong skins
Forwarding isn't set up. Enable modern forwarding (Velocity) or ip_forward + bungeecord:true (Bungee) and set the backends to online-mode=false.
"Connection to the remote server unexpectedly closed" (Velocity)
The forwarding modes don't match. Pick ONE: Velocity modern + paper-global.yml velocity enabled with the SAME forwarding.secret (and remove bungeecord: true from spigot.yml) โ€” or Velocity legacy + backend bungeecord: true. Never both. Restart backend AND proxy. If the backend is Fabric, install the FabricProxy-Lite mod and put the same secret in its config.
Address doesn't resolve
Check for typos and never put a dot right after the address โ€” Minecraft passes it through and the router won't match โ€œhost.โ€.
I need a dedicated port anyway
Rare, but possible โ€” open a support chat and we'll look at exposing one for your case.