BungeeCord's config.yml determines listeners, backend addresses and start priorities. Check keys, indentation and the targets that are actually reachable from the proxy's point of view. An error-free YAML file does not yet protect offline-mode backends from direct access.

A syntactically valid configuration is not yet a secure network. As soon as backends use online-mode=false, their TCP port must be protected from direct connections. The complete procedure is in the BungeeCord setup pillar.

Secure basic skeleton

online_mode: true
ip_forward: true
player_limit: -1
server_connect_timeout: 5000
remote_ping_timeout: 5000

servers:
  lobby:
    address: <LOBBY-ADDRESS>:<PORT>
    motd: '&aLobby'
    restricted: false
  survival:
    address: <SURVIVAL-ADDRESS>:<PORT>
    motd: '&aSurvival'
    restricted: false

listeners:
  - host: 0.0.0.0:<PROXY-PORT>
    motd: '&aMy Network'
    priorities:
      - lobby
      - survival
    force_default_server: true
    forced_hosts:
      survival.example.net: survival
    max_players: 100
    tab_list: GLOBAL_PING
    query_enabled: false
    proxy_protocol: false

Placeholders must be replaced with panel addresses. A public backend address in the example is not permission to leave the port publicly open.

Global fields

Field Meaning Safe classification
online_mode Authentication at the proxy true for normal premium networks
ip_forward IP, UUID and profile to the backend required, but not access control
player_limit Global hard player limit 0 or less means unlimited
server_connect_timeout Time allowed for the backend connection too small causes false alarms, too large causes long waits
remote_ping_timeout Timeout for backend pings A ping is not the same as a real join
remote_ping_cache Cache for backend status can briefly show an old status
connection_throttle Time window for new connections not complete bot/DDoS protection
forge_support Additional Forge handshake support check mod loader compatibility separately

servers: naming backends

Every key under servers is an internal name. address must be reachable from the proxy process's point of view. restricted: true requires the permission bungeecord.server.<name>, but does not prevent direct network access to the backend port.

Avoid using the same public proxy domain as a backend address: it can create a loop. Use a specific internal, private or otherwise proxy-approved address.

listeners: public entry points

host must match the assigned proxy allocation. priorities is the ordered list for start and fallback. A typo like Lobby instead of lobby is enough for no default target to be found.

force_default_server: true starts new connections via the priorities/forced-host logic. With false, BungeeCord can try to restore a previously used target.

max_players is not player_limit

listeners.*.max_players controls the player count shown in the server list. player_limit is the global hard limit. Set both deliberately; a pretty display does not replace capacity measurement.

forced_hosts and DNS

forced_hosts maps a hostname to an internal server name. DNS still points to BungeeCord. For a domain and a non-standard port, use the domain/SRV guide.

Don't mix up fields

  • proxy_protocol is for an upstream HAProxy/PROXY protocol sender, not for normal BungeeCord forwarding.
  • query_enabled opens a separate UDP service when needed; don't enable it as a precaution.
  • ping_passthrough takes over a target's MOTD and status, but makes a backend outage more visible.
  • restricted is a BungeeCord permission, not a firewall.
  • /greload does not reliably reload every plugin and permission change; plan a restart.

Configuring the backend side to match

Set server.properties to online-mode=false and settings.bungeecord: true in spigot.yml. With Paper, proxies.bungee-cord.online-mode must match the proxy's online_mode. Before making a change, read the secure forwarding guide and create a tested backup using the copy/rollback path described in the version change guide.

Validation

  1. Use only spaces, no tabs.
  2. Check indentation and strings containing special characters.
  3. Compare all names in priorities and forced_hosts with servers.
  4. Restart the backend and proxy completely.
  5. Test TCP, Minecraft ping and a real lobby join separately.
  6. Test from an independent source that the backend port is blocked.

If BungeeCord can't reach a lobby, the fallback error guide helps. Only after this basic test, install proxy and backend plugins at the right level.

FAQ

Why shouldn't I copy the config.yml from a tutorial?

Because fields and default values change between builds. Let BungeeCord generate the file itself with your installed version and carry over only the values you really want to adjust. A field from an old example may be missing in your build or have a different meaning.

What is the difference between max_players and player_limit?

listeners.*.max_players is display only: the number clients see in the server list. player_limit is the hard global limit above which the proxy rejects connections (0 or less means unlimited). Set both deliberately — a high display value does not replace capacity measurement.

Is restricted: true enough to protect a backend?

No. restricted is a BungeeCord permission and requires bungeecord.server.<name> for switching via the proxy. It doesn't stop anyone from contacting the backend port directly. The protection there is a firewall or private network, not the proxy configuration.

Do I have to restart after a change, or is /greload enough?

Plan a restart. /greload re-reads the configuration, but doesn't reliably carry every plugin and permission change into the running state. For changes to listeners, servers or forwarding, a full restart is the only dependable way.

Why must the proxy domain not be used as a backend address?

Because the proxy would then address itself as the target and a loop arises. Under servers.<name>.address belongs the address at which the proxy process reaches the backend — an internal or private address, not the public name your network's DNS points to.

Primary sources

Checking a routing change without a DNS misjudgment

Compare every listener priority and every forced_hosts target name with an existing key under servers. Then check the backend address from the proxy network; a public domain can point back to the proxy itself. Test the join first via the known proxy address and then via the domain. If only one of the paths works, investigate DNS and host routing separately. Back up the previous config.yml and revert only the target change in question. The backend firewall and forwarding stay active during this test; briefly opening all ports is not a YAML check.

BungeeCord config.yml Explained: Secure Settings: Generate current file → Enter server targets → Assign listener → Align forwarding → Validate and restart
BungeeCord config.yml Explained: Secure Settings: Generate current file → Enter server targets → Assign listener → Align forwarding → Validate and restart