Bedrock Networking & Transport Architecture
Minecraft: Bedrock Edition utilizes a modernized connection pipeline based on NetherNet, a protocol built on top of WebRTC. Unlike legacy setups that relied exclusively on UDP-based RakNet, modern Bedrock multiplayer connections operate in two distinct phases:
- Signaling Phase (TCP): The Bedrock client opens an HTTP request over TCP to the server's signaling endpoint. Here, client identity, capabilities, and WebRTC Interactive Connectivity Establishment (ICE) session candidates are negotiated.
- Gameplay Phase (UDP WebRTC): Once signaling negotiation completes, real-time game traffic (chunk loading, block placement, player movements, and combat state) streams over high-speed UDP via WebRTC.
- Single-Port Setups: Pure Bedrock Dedicated Servers (BDS) or servers running legacy RakNet single-port setups listen on standard UDP port
19132. Similarly, if you utilize an external NXS signaling relay (such as Warden), Geyser does not need to open a separate local TCP port on your host. - Separate-Port Setups (Recommended for Java + Geyser): When bridging Minecraft Java Edition with Bedrock using Geyser's
builtinsignaling, your Java server already occupies the primary TCP port (e.g.,25565). Therefore, Geyser requires its own separate TCP port for signaling discovery and a dedicated UDP port for WebRTC gameplay traffic.
Recommended Port Architecture
For optimal reliability, performance, and DDoS scrubbing on Pterodactyl hosting, we recommend a three-port architecture (one for Java gameplay, one for Bedrock TCP signaling, and one for Bedrock UDP WebRTC gameplay):
| Traffic Purpose | Example Port | Protocol | Public Visibility | Function |
|---|---|---|---|---|
| Java Gameplay | 25565 |
TCP | Entered by Java players | Primary server port defined in server.properties. Java Edition players connect here directly. Remains completely untouched. |
| Bedrock Signaling | 25675 |
TCP | Entered by Bedrock players | The public entry port that Bedrock players enter in their client's server list. Handles HTTP handshake, server ping/MOTD, and ICE negotiation. |
| Bedrock WebRTC Gameplay | 25633 |
UDP | Internal / Auto-negotiated | Dedicated UDP port where actual gameplay packets flow. Advertised automatically to Bedrock clients during the signaling handshake. |
25675 and 25633 are illustrative examples:
Every Minecraft server hosted on Azion Cloud or standard Pterodactyl panels is assigned unique, non-overlapping port numbers from the node's allocation pool. Do not copy these port numbers verbatim. You must check your server's assigned ports in your Pterodactyl Panel → Network tab and insert your own allocated numbers.
Pterodactyl Panel Allocation & Networking
To establish dual-port NetherNet routing, your container must have two secondary allocations assigned in Pterodactyl. Follow these exact steps:
1. Assigning Allocations in Pterodactyl
- Log in to your Pterodactyl Control Panel (dash.azioncloud.com).
- Select your Minecraft server from the dashboard list.
- Click the Network tab located in the left sidebar menu.
- Inspect your existing allocations:
- The port marked with the Primary badge (usually e.g.
25565) is reserved for Java Edition. - You need two additional allocations: one for Bedrock TCP Signaling (e.g.
25675) and one for Bedrock UDP WebRTC (e.g.25633).
- The port marked with the Primary badge (usually e.g.
- Click the Create Allocation button in the top right corner to assign additional ports from your node's available pool.
- Note the exact port numbers assigned to your server. (If you have reached your plan's allocation limit, open a ticket on Discord or Client Area to have our staff assign more allocations).
2. How Docker and Wings Expose Both Ports
Pterodactyl's daemon (Wings) generates container port forwarding rules based strictly on the allocations assigned to your server in the panel database. When Wings starts your Minecraft Docker container:
- Wings creates both TCP and UDP port bindings for every assigned allocation (e.g.
-p <node_ip>:25675:25675/tcp -p <node_ip>:25675:25675/udpand-p <node_ip>:25633:25633/tcp -p <node_ip>:25633:25633/udp). - Critical: If an allocation is not explicitly added to your server in the Network tab, Wings will not bind it to the Docker container. Even if Geyser listens on port
25633inside the container, external packets will be dropped at the host boundary.
3. Opening TCP & UDP Firewall Ports
Network firewalls must permit ingress traffic for both protocols:
- Azion Cloud Managed Nodes: All port allocations assigned through our Pterodactyl panel are pre-authorized on our hardware firewall and routed through our 12+ Tbps Anti-DDoS scrubbing network. No manual firewall modification is required.
- Self-Hosted Linux VPS / Dedicated Servers: If you run your own Wings daemon or VPS, ensure your firewall (UFW, iptables, or Cloud Security Groups) permits both ports:
Linux UFW Commands
# Open TCP Signaling Port (Example: 25675) sudo ufw allow 25675/tcp comment "Geyser Bedrock TCP Signaling" # Open UDP WebRTC Port (Example: 25633) sudo ufw allow 25633/udp comment "Geyser Bedrock UDP WebRTC" # Reload UFW to apply sudo ufw reloadIf hosting on AWS, Oracle Cloud, Google Cloud, or Azure, also add ingress security group rules for TCP 25675 and UDP 25633 from source
0.0.0.0/0.
Configuring Geyser config.yml
You do not need to rewrite or replace your entire Geyser configuration. Only adjust the specific keys in the bedrock: section of plugins/Geyser-Spigot/config.yml (or plugins/Geyser-Paper/config.yml):
bedrock:
# Bind address (0.0.0.0 binds to all container network interfaces)
address: 0.0.0.0
# The primary Bedrock port (TCP signaling endpoint entered by players)
# Replace 25675 with your secondary assigned TCP allocation
port: 25675
# Must remain false when running an independent multi-port setup
clone-remote-port: false
# Modern transport protocol for Bedrock clients
transport: nethernet
# Dedicated UDP port for NetherNet WebRTC gameplay packets
# Replace 25633 with your tertiary assigned UDP allocation
webrtc-port: 25633
signaling:
# Supported modes: builtin, nxs, hybrid. NEVER use custom.
mode: builtin
# Public IP or Domain advertised to Bedrock clients for WebRTC gameplay
# Crucial: Must match your public node address and your webrtc-port
advertise-addresses:
- "in1.azioncloud.com:25633"
Signaling Modes Explained
Geyser's signaling.mode setting controls how Bedrock connection handshakes are negotiated:
builtin(Recommended for Dedicated Allocations): Geyser hosts its own lightweight HTTP signaling server locally on the Bedrock TCP port (25675). Bedrock clients connect directly to your server node.nxs(External Relay): Geyser registers with an external NXS signaling relay (such as Warden). Useful in environments where opening a second local TCP port is prohibited.hybrid: Runs both the local built-in signaling listener and registers with an external NXS signaling relay simultaneously.- Never Use
custom: There is nocustommode in Geyser. Usingmode: customwill result in configuration parse failures or silent signaling crashes.
Why advertise-addresses Is Critical
When running inside Docker containers or behind NAT routers, Geyser only sees internal container network interfaces (e.g. 172.18.0.5). If advertise-addresses is omitted or misconfigured, Geyser may hand its internal private IP to connecting Bedrock clients during the signaling phase.
External Bedrock clients cannot reach internal Docker IPs, resulting in immediate InitialConnection-149 or connection timeout errors. Setting advertise-addresses to your public server domain or node IP with your assigned UDP WebRTC port (e.g. in1.azioncloud.com:25633) guarantees the client knows exactly where to direct its WebRTC game traffic.
Connecting from Minecraft Bedrock Edition
Bedrock players (on Android, iOS, Windows 10/11, Xbox, PlayStation, and Nintendo Switch) add the server using the standard in-game server list:
| Bedrock Server Field | Required Value | Example Value | Explanation |
|---|---|---|---|
| Server Name | Any display label | Azion SMP |
Arbitrary friendly name in the player's server list. |
| Server Address | Server node IP or domain | in1.azioncloud.com |
The publicly accessible hostname or IP address of your server. |
| Port | TCP Signaling Port | 25675 |
Must be your TCP Signaling Port. Do NOT enter the WebRTC UDP port here. |
25675 runs the signaling server that negotiates the connection and passes the WebRTC port (25633) to the client dynamically. Entering 25633 directly will cause Bedrock to ping a UDP port that does not respond to initial TCP signaling, resulting in "Unable to connect to world".
Floodgate & Online Authentication
By default, Minecraft Java servers enforce online-mode=true in server.properties, requiring every connecting player to validate against Mojang's authentication servers. Because Bedrock players log in with Microsoft/Xbox Live accounts rather than Mojang Java accounts, standard Java servers would reject them.
How Floodgate Bridges Authentication
Floodgate solves this without requiring your server to run in insecure offline/cracked mode (online-mode=false):
- When a Bedrock player connects through Geyser, Floodgate gathers their verified Microsoft/Xbox Live credentials (including Xbox Gamertag and unique XUID).
- Floodgate constructs a deterministic offline UUID for the player (prefixed with
.by default, such as.Steve, to avoid namespace collisions with Java usernames). - Floodgate cryptographically signs this identity payload using an asymmetric RSA private key (stored in
key.pem). - The Java server plugin verifies this signature using the public key and admits the player as an authentic, verified user, allowing the server to keep
online-mode=truestrictly enforced for Java players.
Floodgate Configuration in Geyser
Open plugins/Geyser-Spigot/config.yml and ensure the authentication type is configured for Floodgate:
remote:
address: auto
port: auto
# Use floodgate authentication
auth-type: floodgate
advanced:
# Path to Floodgate RSA key file (automatically loaded on Spigot/Paper)
floodgate-key-file: key.pem
- Single Spigot/Paper Server: When Geyser and Floodgate run on the same server, Floodgate automatically creates and shares
key.pem. No manual file copying is needed. - Proxy Setups (Velocity / BungeeCord): If Floodgate is installed on backend Paper servers and Geyser is on the proxy, copy
plugins/Floodgate/key.pemfrom the proxy to all backend servers. - Preserve Your Key: Never delete
key.pem. Player inventories, statistics, and permission nodes are tied to the deterministic UUID generated by this key.
Comprehensive Troubleshooting & Diagnostics
If players encounter connection issues, consult the diagnostic table below for verified resolutions:
| Error / Symptom | Root Cause | Verified Resolution |
|---|---|---|
Port Binding FailureBindException: Address already in use |
Geyser attempted to bind a port already taken by Java Edition, another container, or an existing service. |
1. Verify clone-remote-port: false in config.yml.2. Ensure port (signaling) is distinct from server-port in server.properties.3. Verify in Pterodactyl Network tab that your allocated port is not duplicated. |
Connection Timeout /InitialConnection-149 |
Client completed TCP signaling on port 25675, but UDP WebRTC packets on port 25633 are unreachable or dropped. |
1. Verify advertise-addresses has your public node domain/IP and the exact UDP port (e.g. in1.azioncloud.com:25633).2. Verify the secondary UDP allocation is added to the server in Pterodactyl. 3. If self-hosting, check host firewall: sudo ufw allow 25633/udp.
|
Signaling Failure /Failed to start signaling server |
Invalid signaling mode configured, or TCP port blocked by external firewall. |
1. Check signaling.mode in config.yml. Supported values are builtin, nxs, or hybrid. Never use custom.2. Ensure TCP traffic is allowed on port 25675.
|
| "Trust on First Use" (TOFU) Prompt in Bedrock | Expected security warning in Minecraft Bedrock when connecting to unencrypted HTTP built-in signaling. |
1. Players can safely click Proceed or Trust to connect. 2. To remove the warning entirely, configure an HTTPS reverse proxy (such as Caddy or Nginx with Let's Encrypt SSL) for the signaling domain, or use signaling.mode: nxs.
|
| UDP WebRTC Packet Drop / Lag | ISP or cloud security group filtering UDP packets, or MTU fragmentation. |
1. Check cloud provider security lists (AWS/GCP/Oracle) to ensure UDP protocol ingress is permitted. 2. Ensure address: 0.0.0.0 is bound in Geyser's config.yml.
|
Generating a Diagnostic Dump
If you need to contact support, run the official diagnostic command in your Pterodactyl Console:
geyser dump
This command securely analyzes your server architecture, Geyser build version, network bindings, and Java runtime, returning a sanitized diagnostic URL that you can provide to our engineers on Discord or via support ticket.
Need Assistance with Port Routing?
Azion Cloud systems engineers are available 24/7. If you would like our team to configure your secondary allocations, verify firewall routing, or configure your Geyser YAML files, open a ticket or join our Discord community.
Compatibility & Official References
GeyserMC and Floodgate are active open-source projects providing continuous updates whenever Mojang releases Bedrock Edition updates. Always ensure your server runs official, verified builds:
- GeyserMC Official Setup Guide: https://geysermc.org/wiki/geyser/setup/
- GeyserMC Configuration Reference: https://geysermc.org/wiki/geyser/
- Floodgate Documentation: https://geysermc.org/wiki/floodgate/
- Official Geyser Downloads & Builds: https://geysermc.org/download