Setting Up a Minecraft Server Network (one IP to rule them all)

One IP. Many servers. A proxy lets you connect multiple Minecraft servers together under a single address — so players can bounce between survival, creative, minigames, and hub without ever disconnecting.

Proxy Network
Server Switching
DDoS Protection
Unified Player Base

/ the big picture

What Even Is a Server Network?

You know how big servers like Hypixel have a hub where you click signs or NPCs to join different games? That's a proxy network. Instead of running one server, you run several — but players see them as one seamless experience.

How It Works

A proxy sits between players and your backend servers. Players connect to the proxy's IP, and the proxy decides which backend server to send them to:


  • Hub server — the lobby players see first. They can navigate to other servers from here (click signs, NPCs, command menus)
  • Game servers — survival, creative, minigames, PvP arenas, etc. Each runs independently on its own port/world
  • Proxy — BungeeCord or Velocity routes players between servers seamlessly. Players don't see loading screens or different IPs

Why Bother?

A single server can only run one world, one game mode, one set of plugins. A network lets you:


  • Run Survival, Creative, and Minigames simultaneously
  • Scale horizontally — add more servers when player count grows
  • Isolate crashes — one server going down doesn't take the whole network
  • Hide backend IPs behind the proxy for security
  • Enable cross-server chat, friends, and messaging
  • Support both Java and Eaglercraft players through the same proxy

/ choose your fighter

BungeeCord vs Velocity

These are your two options for proxy software. One's been around forever, the other's newer and better in almost every way.

Feature BungeeCord Velocity
Release Year 2012 (legacy) 2020 (modern)
Performance Good, but single-threaded bottlenecks Excellent — multi-threaded, 3-5x faster
DDoS Protection Basic connection throttling Built-in: connection limiting, timeouts, keepalive filtering
Modern Forwarding Not supported Encrypted forwarding — prevents fake proxy connections
Plugin Compatibility Massive library — most existing proxy plugins are for Bungee Good but growing — most popular plugins are ported now
Eaglercraft Support EaglercraftBungee plugin works natively EaglercraftXVelocity plugin available
Setup Complexity Simple — download and run Simple — similar process
Minecraft Version Support Supports 1.7.x to latest Supports 1.7.2 to latest, better protocol translation
Maintenance Rarely updated, community forks (Waterfall) exist Actively maintained, regular updates

Bottom line: Start with Velocity unless you need a BungeeCord-only plugin that hasn't been ported. Velocity is faster, safer, and actively maintained.

Setting Up a Velocity Network

I'll walk you through a real Velocity setup with a hub server and a survival backend. This isn't abstract — you can follow along right now.

1. Download Velocity

Grab the latest Velocity JAR from velocitypowered.com. Choose the regular or "build" version — regular is fine. Save it in a folder called proxy.


Also download PaperMC for your backend servers. You'll need at least two: one for the hub, one for survival. Put each in its own folder (hub-server, survival-server).

2. Configure velocity.toml

Run java -jar velocity-3.x.x.jar once, it'll generate velocity.toml. Edit it:

# velocity.toml
bind = "0.0.0.0:25565"
motd = ">> My Awesome Network <<"
show-max-players = 500
online-mode = false # for Eaglercraft
player-info-forwarding-mode = "modern"

[forced-hosts]
"minecraft.myserver.com" = ["lobby", "survival"]

[advanced]
forwarding-secret-file = "forwarding-secret.txt"

If you don't need Eaglercraft support, set online-mode = true. Velocity will then verify Mojang sessions — but Eaglercraft players can't join.

3. Generate Forwarding Secret

Velocity uses a shared secret to verify that connections from backend servers are actually coming from your proxy. Generate one:

# On Linux/macOS
openssl rand -base64 32 > forwarding-secret.txt

# On Windows (PowerShell)
[Convert]::ToBase64String([byte[]](1..32)) > forwarding-secret.txt

Put this file in both the proxy folder and each backend server's folder. Velocity reads it to authenticate connections.

4. Configure Backend Servers

Each backend server needs to accept proxy connections. In server.properties:

# hub/server.properties
server-port=25566
online-mode=false

# survival/server.properties
server-port=25567
online-mode=false

Also add Velocity's modern forwarding config to each backend's velocity.toml (yes, Paper reads it too). Place the forwarding-secret.txt in each backend folder.


Start each backend with java -jar paper.jar nogui to verify they work independently before connecting through the proxy.

5. Connect Backends to Proxy

Now register your backend servers in velocity.toml:

[servers]
lobby = "127.0.0.1:25566"
survival = "127.0.0.1:25567"
try = ["lobby", "survival"]

try defines the order Velocity tries when a player first connects. Set it to your hub/lobby server first. Start the proxy: java -jar velocity-3.x.x.jar.


If both backends connect successfully, you'll see them in the proxy's console output. Connect to localhost:25565 in Minecraft — you should land in your hub.

6. Server Switching

Players need a way to move between servers. Options:


  • Command: /server survival — works out of the box with Velocity
  • Signs: Use [survival] on the first line of a sign. Clicking it sends the player to the "survival" server
  • NPCs: Citizens plugin + a script to run /server <name> when clicked
  • GUI menu: Plugins like /server or DeluxeMenus create a clickable GUI
# Sign format (place in hub world)
============
[survival]
Survival World
============

Network Plugins You'll Actually Use

These plugins make a network feel like a network instead of a bunch of separate servers duct-taped together.

Cross-Server Chat

BungeeChat / VentureChat

Without these, each server has its own chat. Players on survival can't see messages from players on creative. Cross-server chat plugins sync messages across all backend servers through the proxy. VentureChat also supports Discord bridging, private messaging, and channel-based chat (global, local, staff).


# VentureChat config — cross-server staff channel
channels:
staff:
cross-server: true
permission: "venturechat.staff"
format: "[Staff] %player%: %message%"
Friends

Friends Plugin

Players expect to see their friends' online status regardless of what server they're on. A cross-server friends plugin like FriendsAPI or PartyAndFriends syncs friend lists, online status, and party invites across your entire network.


Most friends plugins also support party systems — invite friends to a party, then the leader can move the whole party between servers. Essential for network play.

Economy

Shared Economy

If survival players earn money and creative players earn money, they should be able to spend it anywhere. Use Craftconomy or AndroEconomy with a MySQL backend so all servers share the same balance database.


# Craftconomy MySQL config
storage:
type: mysql
host: localhost:3306
database: mc_economy
user: mc_user
password: your-password

MySQL is key here — SQLite stores data per-server, so balances won't sync. With MySQL, all servers read/write the same data.

Permissions

LuckPerms (SQL Mode)

You already know LuckPerms from the single-server guide. On a network, you need it in SQL mode so permissions sync across all servers. A player promoted to "Mod" on survival automatically has mod permissions on creative, hub, and every other server.


# luckperms/sql-config.yml
storage-method: mysql
database: server-perms
host: localhost
port: 3306

You can also set per-server permissions: /lp group Admin permission set essentials.fly true server=survival — fly works on survival but not on hub.

Security

AntiVPN & Geoblocking

Networks attract more attacks than single servers. On a network, you can run security plugins at the proxy level that apply to all backend servers at once:


  • AntiVPN — detects and blocks known VPN/VPS IP ranges
  • Geoblocking — restrict connections by country (e.g., only allow your region)
  • ProxyBotBlocker — blocks connections from hosting companies and proxies
  • Connection throttle — Velocity has this built-in

Run these at the proxy level so blocked players never touch your backend servers at all — reducing load and log noise.

Hub

Hub / Lobby Server Essentials

Your hub server is the first thing players see. Make it good:


  • Multiverse-Core — create a separate hub world with its own terrain/generation
  • WorldGuard — protect hub from griefing, disable PvP, block block breaking
  • SpawnPoint or Essentials Spawn — auto-teleport to hub on first join
  • Parkour / minigames — simple jumping puzzles keep players entertained while they wait
  • Scoreboard — show player count across all servers, online friends, network rules
# Make hub a void world — flat, no mobs, no lag
multiverse create hub normal -g VoidGen
# Protect everything
/rg flag __global__ build deny
/rg flag __global__ pvp deny
/rg flag __global__ mob-spawning deny

Common Network Configurations

Here's how real servers structure their networks. Steal these ideas.

Survival + Creative + Hub

The classic starter network. One survival world, one creative plots world, and a hub to switch between them.


  • Hub server on port 25566 (default entry)
  • Survival server on port 25567 — GriefPrevention, CoreProtect, Economy
  • Creative server on port 25568 — PlotSquared, WorldEdit
  • MySQL shared: economy, permissions, player data

Players: 20-50 • RAM per server: 2-4GB • VPS: 8GB RAM, 4 vCPU (~$25/mo)

Minigame Network

Multiple game servers under one hub. Each minigame is its own server with its own world and plugins.


  • Hub with server selector GUI
  • SkyWars server (port 25567)
  • BedWars server (port 25568)
  • KitPvP server (port 25569)
  • Lobby parkour world (port 25566 — same as hub)

Players: 50-200 • Scaling: Add more SkyWars servers when one fills up • Use: Waterfall (Bungee fork) for better player distribution

School / Community Network

Multiple worlds for different groups, all moderated centrally.


  • Hub — rules, guides, announcements
  • Survival (Grades 6-8) — whitelist + password-protected
  • Survival (Grades 9-12) — fewer restrictions
  • Creative — open plot building
  • Staff server — admin tools, private chat

Key: Shared LuckPerms groups across all servers. A ban on any server bans across the network. DiscordSRV bridges chat to a staff Discord.

Eaglercraft + Java Hybrid

One network, two types of players. Java players get full Mojang auth; Eaglercraft players use AuthMe.


  • Velocity proxy with online-mode=false
  • EaglercraftBungee (or EaglercraftXVelocity) plugin on proxy
  • Backend servers run AuthMe — Eaglercraft players must register
  • Java players can also use AuthMe for consistency, or skip it
  • All servers behind TCPShield for DDoS protection

Note: Set player-info-forwarding-mode = "legacy" for Eaglercraft compatibility. Modern forwarding may not work depending on the Eaglercraft version.

/ stay safe at scale

Network Security — More Servers, More Risk

One server is already a target. A network with 3+ servers is a bigger attack surface. Here's what changes at scale.

Isolation

Server Isolation Is Non-Negotiable

If someone compromises your survival server, they should NOT automatically have access to your hub or creative server. Each server needs its own:


  • Separate port — each backend uses a different port (25566, 25567, 25568...)
  • Separate folder — don't share worlds or plugin folders between servers
  • Separate credentials — MySQL users should have per-database permissions
  • Firewall rules — backend ports should only accept connections from the proxy's IP
  • Docker containers — each server in its own container limits blast radius

Example UFW rules for a Linux VPS with a proxy on the same machine:

ufw default deny incoming
ufw allow 25565/tcp # proxy port (public)
ufw allow from 127.0.0.1 # backend ports (local only)
ufw enable

Backend ports are only accessible from localhost — the proxy connects to them internally. External connections can only reach port 25565.

Database

MySQL Setup for Networks

Single-server networks can get away with SQLite. For multi-server networks, MySQL is required:


  • Run MySQL on the same VPS or a separate database server
  • Create one database per plugin type: mc_economy, mc_perms, mc_coreprotect
  • Create a MySQL user per database with limited permissions: GRANT ALL ON mc_economy.* TO 'economy'@'localhost'
  • Never use the root MySQL user for plugins
  • Back up MySQL databases separately with mysqldump

# mysqldump daily backup
0 3 * * * mysqldump -u backup -p'pass' --all-databases | gzip > /backups/db_$(date +\%Y\%m\%d).sql.gz
Monitoring

Monitoring a Multi-Server Network

With 3+ servers, console spam becomes unmanageable. Set up proper monitoring:


  • Use DiscordSRV to send each server's console output to a separate Discord channel
  • Prometheus + Grafana — export server metrics (TPS, memory, player count) via the Spark plugin's Prometheus exporter
  • Create a Grafana dashboard showing all servers' health on one screen
  • Set up alerts when TPS drops below 18 or memory exceeds 80%
  • Use UptimeRobot to ping each server's port and alert you if one goes down
# Spark Prometheus exporter
spark prometheus enable
# Then configure Prometheus to scrape http://localhost:4567/metrics
Player Limits

Balancing Players Across Servers

When players join, which backend do they get? Without a plan, you'll end up with 50 players on survival and 2 on creative:


  • Lobby balancing — redirect new players to the least-loaded server
  • Max players per server — set per-server limits (max-players=30) so players spread out
  • Auto-scaling — with Waterfall (Bungee fork) you can dynamically spin up new server instances
  • Queue system — when all servers are full, show players a queue with position estimate

For small networks (under 100 players), just set reasonable per-server limits and let players choose. For larger networks, look into Waterfall's proxy balancing plugins.

Common Network Problems & Fixes

Because something will break, and here's how to fix it when it does.

Players connect but get "Disconnected" immediately

This is almost always a forwarding secret mismatch. The forwarding-secret.txt in your proxy folder must be identical to the one in each backend server's folder. Check for trailing newlines or whitespace. Regenerate the secret and copy it to all servers.

Backend servers show "Can't connect to server" in proxy console

Your proxy can't reach the backend server. Check: (1) are the backend servers actually running? (2) are the IP/port correct in velocity.toml? (3) is a firewall blocking the connection? (4) if using Docker, are the containers on the same network? (5) if localhost doesn't work, try 127.0.0.1 explicitly.

Players can't switch servers — command not found

Make sure you have a switching plugin or permissions set for /server. On Velocity, you need to add velocity.command.server permission to your players/groups via LuckPerms: /lp group default permission set velocity.command.server true.

Player inventories / data don't transfer between servers

That's by design — each backend server is independent. If you want shared inventories, use a plugin like RedisSync or AdvancedPortals with MySQL storage. Most networks keep inventories separate per server (you want different inventories on survival vs creative anyway).

Eaglercraft players can't connect through the proxy

Eaglercraft uses WebSocket, not raw TCP. Make sure the EaglercraftXVelocity (or EaglercraftBungee) plugin is installed on the proxy. Also check that online-mode is set to false on the proxy, and that you're using player-info-forwarding-mode = "legacy" — modern forwarding may not work with all Eaglercraft versions.

The server list shows the proxy MOTD but no player count

Velocity shows the correct player count by default (sum of all backends). If it shows 0, check your velocity.toml config for player-info-forwarding-mode — if it's "modern" but backends are configured for "legacy", the count won't update. Also verify the status section of your config isn't overriding the player count.

MySQL connection errors every 10 minutes

Your MySQL connection is timing out. Add ?autoReconnect=true to your JDBC connection URL. Example: jdbc:mysql://localhost:3306/mc_economy?autoReconnect=true. Also increase the wait_timeout in MySQL config to 28800 (8 hours).

Lag spikes when players switch servers

When a player switches servers, their player data is serialized, sent through the proxy, and deserialized on the new server. If it's lagging, check: (1) are you using SSDs? Network-level world switching with HDDs is painful. (2) is player data bloated? Large inventories or ender chests can slow switching. (3) You can limit inventory size with plugins to reduce serialization overhead.

Network Setup FAQ

Stuff people always ask when setting up their first network.

Do I need a separate VPS for the proxy?

No — you can run the proxy on the same machine as your backend servers. Just use different ports and point the proxy to 127.0.0.1. For production networks with 50+ players, a separate VPS for the proxy is recommended to distribute load and add a DDoS buffer.

How much RAM does Velocity need?

Velocity itself uses very little — about 100-200MB for the JVM. Most of the memory goes to your backend servers. Run Velocity with -Xms128M -Xmx256M. Backend servers need their own RAM allocation based on what they do (2GB for survival, 1GB for hub, etc.).

Can I mix Minecraft versions on one network?

Yes! Velocity supports protocol translation — players on Minecraft 1.17, 1.18, 1.19, 1.20, and 1.21 can all connect to the same proxy and play together. Backend servers should be the same version, but the proxy translates the protocol for clients. This is one of Velocity's biggest advantages over BungeeCord.

What plugins run on the proxy vs on backends?

Proxy plugins run on the proxy JAR and affect the whole network — chat bridging, server switching, player counting, connection throttling. Backend plugins run on individual servers — CoreProtect, GriefPrevention, gameplay mechanics. Most plugins are backend plugins. Proxy-specific plugins go in the proxy's plugins/ folder (they're usually labeled "BungeeCord" or "Velocity").

Do I need a domain name for a network?

Strongly recommended but not strictly required. With a domain, you can use Cloudflare to proxy connections and hide your IP. For the proxy itself, you just need one domain (play.yourserver.com). The backend servers don't need domains — they're internal. Without a domain, players connect to your raw IP, which works but is harder to secure.

How do I prevent players from directly connecting to backends?

Three layers of defense: (1) Firewall — backend ports only accept connections from localhost or the proxy's IP, (2) Velocity modern forwarding — backends only accept connections that present the correct forwarding secret, and (3) Don't publish backend IPs — players should only ever know your proxy's address. If someone does find a backend IP, the forwarding secret stops them from connecting directly.

What's the cheapest way to start a network?

Get a $10-15/mo VPS from Hetzner or BuyVM with 4 vCPU and 8GB RAM. Run the proxy and 2-3 backend servers on it. Use Docker to manage them. If you grow past 50 players, scale up to a bigger VPS or split servers across multiple VPSs. For zero cost, run everything on localhost and expose port 25565 via ngrok or a tunnel — but this is only for testing, not production.

Is BungeeCord completely obsolete now?

Not completely. Some plugins are only compatible with BungeeCord (or its fork Waterfall). If you need a specific plugin that hasn't been updated for Velocity, use Waterfall (a maintained BungeeCord fork). But for any new network, start with Velocity. It's objectively better in every metric and most plugins are ported now. The only reason to use BungeeCord in 2025 is legacy plugin compatibility.