Geyser 2.12.0
Overview
Geyser is the open-source bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition. Bedrock players on consoles, phones, tablets and Windows normally cannot join a Java Edition server. Geyser sits in front of your Java server, accepts Bedrock players on port 19132 and translates their connection to the Java protocol, so both editions can play together on a server you run.
This guide covers launching the Geyser 2.12.0 on Ubuntu 24.04 AMI from SecureAnyCloud on Amazon EC2. The AMI is one version of the SecureAnyCloud game server listing on AWS Marketplace. You pick it as the software version when you subscribe and launch.
Geyser is a proxy, not a game server. The image contains no Minecraft server, no Mojang game assets and no accepted Minecraft EULA. You point Geyser at your own Java Edition server, on this instance or elsewhere, and your players use their own Minecraft clients.
On its first start, Geyser downloads Mojang's client jar itself to extract language strings and default skins. Each instance fetches its own copy, and the image ships none of it.
NetherNet is already on. From Bedrock 26.60 (planned for 27 October 2026), Bedrock clients connect only with NetherNet, Mojang's new connection method. Geyser 2.12.0 still defaults to the old RakNet method. This image switches Geyser to NetherNet with its built-in signaling, so players can keep joining.
A client first asks the server how to connect with a small web request on TCP 19132, which is called signaling. It then plays over an encrypted WebRTC connection on UDP 19132.
What you get:
- NetherNet set up for EC2. Built-in signaling runs on TCP 19132 and gameplay on UDP 19132. On first boot, the instance reads its public IPv4 address (IMDSv2) and tells players to connect to it. Without that step, Geyser would offer only the instance's private address.
- A contained service. Geyser runs as the
geysersystem account (no shell, no password) under a sandboxed systemd unit. The unit has no capabilities, a read-only operating system with only/var/lib/geyserwritable, private/tmpand devices, and a system call filter. The Geyser jar is owned by root, so the service cannot change its own code. - A key unique to your instance. NetherNet uses a server identity key. Geyser creates it on your instance's first start (
/var/lib/geyser/nethernet/identity.pem, readable only by thegeyseraccount). No key is baked into the image. - Instance metadata blocked for Geyser. Geyser fetches URLs that players and servers influence, such as skin textures and resource packs. The service is therefore denied the instance metadata service (169.254.169.254), while it can still reach your Java server and Microsoft sign-in. The AMI also requires IMDSv2.
- Players authenticate. Geyser keeps online mode (
auth-type: online). Bedrock players sign in with their own Microsoft accounts and Bedrock logins are validated, so nobody can join as someone else. There is no administrator login, web console or management API, so there is no password to manage. - Exactly the ports players need. TCP and UDP 19132 for players and TCP 22 for SSH.
- A pinned, checked download. Geyser 2.12.0 build 1265 from GeyserMC, verified against the sha256 that GeyserMC publishes.
- A fully patched base. Ubuntu 24.04 LTS is patched at build time, with unattended security upgrades switched on.
- The software on the image: Geyser Standalone 2.12.0 build 1265 (
/opt/geyser/Geyser-Standalone.jar), OpenJDK 21 (Ubuntu package), Ubuntu 24.04 LTS, cloud-init and the AWS Systems Manager agent.
Default user: ubuntu. Architecture: x86_64. Recommended instance type: m5.large.
Prerequisites
- An AWS account subscribed to the listing, an EC2 key pair and a VPC subnet with a route to the internet. Geyser needs outbound internet access to reach Microsoft sign-in, GeyserMC and Mojang's download servers.
- A public IPv4 address on the instance, either auto-assigned or an Elastic IP, so that players on the internet can reach it.
- A security group that allows TCP 19132 and UDP 19132 from your players (usually anywhere) and TCP 22 (SSH) from your own networks only. NetherNet needs both protocols on 19132.
- A Minecraft: Java Edition server for Geyser to forward to. If it runs on another machine, that machine must accept connections from this instance on its Java port (25565 by default).
Launch the instance
In the AWS Marketplace listing, choose Continue to Subscribe, then Continue to Configuration. Pick Geyser 2.12.0 on Ubuntu 24.04 as the software version and select your Region. Then choose Launch through EC2.
Choose m5.large, your key pair and a security group as described above. Geyser itself uses about 0.6 GB of memory, so size up if you also run your Java server on this instance.
To launch with the AWS CLI instead, replace the values in angle brackets:
aws ec2 run-instances --region <region> --image-id <ami-id-from-the-listing> \
--instance-type m5.large --key-name <your-key-pair> \
--security-group-ids <your-security-group> --subnet-id <your-subnet> \
--associate-public-ip-address \
--metadata-options HttpTokens=required,HttpEndpoint=enabled \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=geyser}]'Create the security group rules with the AWS CLI:
aws ec2 authorize-security-group-ingress --group-id <your-security-group> \
--ip-permissions 'IpProtocol=tcp,FromPort=19132,ToPort=19132,IpRanges=[{CidrIp=0.0.0.0/0}]' \
'IpProtocol=udp,FromPort=19132,ToPort=19132,IpRanges=[{CidrIp=0.0.0.0/0}]' \
'IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges=[{CidrIp=<your-mgmt-cidr>}]'Connect to your instance
Connect over SSH as the ubuntu user, which is the SSH user for Geyser 2.12.0 on Ubuntu 24.04:
ssh -i <your-key.pem> ubuntu@<public-ip>The login message shows the address that players connect to and the commands used in the steps below.
Check the service and the connection note
A few seconds after boot, Geyser and its first-boot unit are active:
systemctl is-active geyser geyser-firstbootactive activeFirst boot records this instance's addresses (read with IMDSv2) in a note for you. The note holds connection details only, never a secret:
sudo cat /root/geyser-instance-info.txt# Geyser - instance information (written by geyser-firstboot.service).
# Geyser has no administrator login: this note holds connection details only, never a secret. GEYSER_PUBLIC_IP=203.0.113.10 GEYSER_PRIVATE_IP=172.31.83.103 GEYSER_BEDROCK_PORT=19132 (TCP signaling + UDP NetherNet) GEYSER_CONFIG=/var/lib/geyser/config.yml
# Point Geyser at your Java Edition server: edit the java: section of the config, then
#
sudo systemctl restart geyserYour addresses will differ. Bedrock players enter GEYSER_PUBLIC_IP with port 19132.
If the instance has no public IPv4 address, the note says none and Geyser offers players its private address. That address works only inside your VPC or VPN.
Prove NetherNet signaling answers
The image ships a self-test. It makes the same signaling request that every current Bedrock client makes before it joins (GET /v1/join on TCP 19132) and checks Geyser's reply:
geyser-selftestOK NetherNet signaling: name="Geyser" protocol=2193 version=26.52 players=0/100 onlineAuth=trueA pass proves that the Java runtime started, the configuration parsed, NetherNet is on, signaling answers and online authentication is enforced. It does not need your Java server yet.
The same request works from your own computer against the public address, which also proves the security group:
curl -s http://<public-ip>:19132/v1/joinIt returns a short JSON record with "name":"Geyser", the protocol, the Bedrock version and "onlineAuth":true.
NetherNet is set in the bedrock section of the configuration. First boot fills in the address that players are sent to:
sudo grep -n -E '^ transport:|^ advertise-addresses:|^ - ' /var/lib/geyser/config.yml31: transport: nethernet 50: advertise-addresses: 51: - '203.0.113.10' 75: advertise-addresses: []Line 50 is the built-in signaling list, which holds your public address. Line 75 belongs to the external signaling service, which this image does not use.
Point Geyser at your Java server
Geyser itself wrote the shipped config.yml during the image build, and it keeps Geyser's defaults apart from NetherNet. Its java section points at 127.0.0.1 port 25565, which works only if your Java server runs on this same instance:
sudo grep -n -A10 '^java:' /var/lib/geyser/config.yml84:java: 85-
# The IP address of the Java Edition server. 86- address: 127.0.0.1 87- 88-
# The port of the Java Edition server. 89- port: 25565 90- 91-
# What type of authentication Bedrock players will be checked against when logging into the Java server. 92-
# Can be "floodgate" (see https://wiki.geysermc.org/floodgate/), "online", or "offline". 93- auth-type: online 94-Edit the file with sudo nano /var/lib/geyser/config.yml:
addressandport: your Java server's address (an IP or DNS name reachable from this instance) and port. If the Java server runs on this instance, keep127.0.0.1.auth-type: keeponlinewhen your Java server runs in online mode, which is the normal case. Players then sign in with their Microsoft accounts. Usefloodgateonly if you install the Floodgate plugin on your Java server. In that case, copy that server'skey.pemto/var/lib/geyser/key.pem(ownergeyser, mode 0640) and treat it as a secret. Avoidoffline, because then anyone could join under any name.
Restart Geyser and wait for signaling:
sudo systemctl restart geyser for i in $(seq 1 30); do geyser-selftest >/dev/null 2>&1 && break; sleep 2; done; geyser-selftestOK NetherNet signaling: name="Geyser" protocol=2193 version=26.52 players=0/100 onlineAuth=trueWhen the Java server is reachable, the server list entry shows your Java server's MOTD and player count (passthrough-motd). To check reachability from this instance, run nc -zv YOUR_JAVA_HOST 25565, replacing the host and port with your own.
Connect from a Bedrock client
In Minecraft (Bedrock Edition), open Play, then Servers, then Add Server. Enter a name, enter the instance's public address as Server Address and 19132 as Port, then save and join.
Consoles that cannot add servers directly need a DNS or "server list" workaround. See the Geyser documentation.
The trust prompt. Built-in signaling uses plain HTTP, which is Geyser's default. The first time a player joins by IP address, Minecraft shows a "trust on first use" prompt. After the player accepts it, the prompt does not appear again for this server. The gameplay connection itself is encrypted (WebRTC with DTLS). To remove the prompt, serve signaling over HTTPS with a certificate for a domain name (Step 8).
Bedrock client versions. Each Geyser release accepts the Bedrock versions it was built for. Geyser 2.12.0 build 1265 accepts Bedrock 26.52 (protocol 2193), as geyser-selftest shows.
Bedrock clients update automatically. When a newer Bedrock release is out, the Geyser log says so with a line starting There's a new Geyser update available to support Bedrock version:
sudo journalctl -u geyser --no-pager -o cat | sed -E 's/\x1b\[[0-9;]*m//g' | grep -E 'Loading Geyser version|Built-in signaling started|new Geyser update|NetherNet support' | tail -3[00:28:59 INFO] Built-in signaling started on http://0.0.0.0:19132 [00:29:16 INFO] Loading Geyser version 2.12.0-b1265 (git-master-02dbfac) [00:29:23 INFO] Built-in signaling started on http://0.0.0.0:19132If your players run a newer Bedrock version than this build accepts, upgrade Geyser as described in Step 10.
Security checks
Only SSH (TCP 22) and Geyser on 19132 listen on the network. TCP 19132 is NetherNet signaling. Geyser opens UDP 19132 for each player's WebRTC connection as the player joins. The DHCP client on port 68 is the instance's own network setup:
sudo ss -H -tulnp | grep -v -E '127\.0\.0\.5[34]|\[::1\]|127\.0\.0\.1:323' | awk '{print $1, $5, $7}' | sed -E 's/,pid=[0-9]+,fd=[0-9]+//g'udp 172.31.83.103%ens5:68 users:(("systemd-network")) tcp 0.0.0.0:22 users:(("sshd"),("systemd")) tcp [::]:22 users:(("sshd"),("systemd")) tcp *:19132 users:(("java"))Geyser runs as the unprivileged geyser account in a sandboxed unit. The unit denies it access to the instance metadata addresses:
systemctl show geyser -p User -p NoNewPrivileges -p ProtectSystem -p PrivateTmp -p IPAddressDenyIPAddressDeny=169.254.169.254/32 fd00:ec2::254/128 168.63.129.16/32 User=geyser PrivateTmp=yes ProtectSystem=strict NoNewPrivileges=yessudo systemd-analyze security geyser.service --no-pager | tail -1→ Overall exposure level for geyser.service: 1.5 OK 🙂The deny list holds only the metadata addresses, so Geyser still reaches your Java server, Microsoft sign-in and GeyserMC. The rule lives in /etc/systemd/system/geyser.service.d/50-sac-imds-deny.conf. Keep it.
The NetherNet identity key was created on this instance, and only the geyser account can read it:
sudo ls -l /var/lib/geyser/nethernet/total 4 -rw------- 1 geyser geyser 288 Oct 20 00:27 identity.pemSignaling takes the player's address from the connection. It ignores X-Forwarded-For unless you list a reverse proxy in advanced.bedrock.signaling-trusted-proxies, which is empty in this image.
HTTPS for signaling (optional)
To remove the trust prompt, give the server a DNS name, for example a Route 53 record pointing at an Elastic IP. Get a certificate for that name from a public certificate authority, then point built-in signaling at it in /var/lib/geyser/config.yml:
bedrock.signaling.builtin.https.certificate: the path to the certificate chain (PEM), for example/var/lib/geyser/tls/fullchain.pem.bedrock.signaling.builtin.https.private-key: the path to its private key. Keep both files owned bygeyserwith mode 0600.bedrock.signaling.builtin.advertise-addresses: you can leave the IP address here. Players then add the server by its DNS name.
Restart Geyser. Signaling then serves HTTPS on TCP 19132 and refuses plain HTTP, so geyser-selftest, which speaks HTTP, reports a failure. Check with curl -s https://<your-domain>:19132/v1/join instead.
GeyserMC's HTTPS guide covers the options in detail, including a reverse proxy in front of the signaling port.
Configuration you may want to change
All settings live in /var/lib/geyser/config.yml, and each one is documented by a comment above it. Restart Geyser after a change (sudo systemctl restart geyser). The settings you are most likely to change, with the image default in parentheses:
- bedrock.port (19132): signaling (TCP) and NetherNet gameplay (UDP). Change the security group along with it.
- bedrock.transport (nethernet): how players connect. The value both also accepts the old RakNet method, but then needs a separate webrtc-port (another UDP port).
- bedrock.signaling.builtin.advertise-addresses (this instance's public IPv4): the address that players are sent to. First boot sets it. See Step 11.
- java.address, java.port (127.0.0.1, 25565): your Java Edition server (Step 5).
- java.auth-type (online): Microsoft account sign-in. See Step 5 before changing it.
- motd.primary-motd, motd.passthrough-motd (Geyser, true): the server list text. Passthrough shows your Java server's own MOTD.
- log-player-ip-addresses (true): player addresses in Geyser's log. Set it to false if you do not want them recorded.
- enable-metrics (true): anonymous usage statistics to bStats, which is Geyser's default. Set it to false to switch them off. Each instance gets its own random metrics-uuid at first boot.
- advanced.bedrock.use-haproxy-protocol (false): keep false unless Geyser sits behind a proxy that sends the PROXY protocol, or players could fake their address.
Geyser's own logs are in the systemd journal (sudo journalctl -u geyser) and in /var/lib/geyser/logs/.
Upgrade Geyser
Geyser is a single jar, and your config.yml stays as it is. Pick the release and build from GeyserMC's download page, and replace <version> and <build> below. The commands check the jar against the sha256 that GeyserMC publishes before installing it:
V=<version>; B=<build> API="https://download.geysermc.org/v2/projects/geyser/versions/${V}/builds/${B}" SUM="$(curl -fsSL "${API}" | python3 -c 'import json,sys; print(json.load(sys.stdin)["downloads"]["standalone"]["sha256"])')" curl -fsSL -o /tmp/Geyser-Standalone.jar "${API}/downloads/standalone" echo "${SUM} /tmp/Geyser-Standalone.jar" | sha256sum -c - \
&& sudo install -o root -g root -m 0644 /tmp/Geyser-Standalone.jar /opt/geyser/Geyser-Standalone.jar \
&& sudo systemctl restart geyser rm -f /tmp/Geyser-Standalone.jarThen check the new version with the journalctl command in Step 6, and run geyser-selftest.
Server components
The image lays out its components as follows:
- Geyser Standalone 2.12.0 build 1265: /opt/geyser/Geyser-Standalone.jar (root owned)
- OpenJDK 21 (Ubuntu package, with security updates through unattended upgrades): /usr/lib/jvm
- Configuration and state: /var/lib/geyser/ (config.yml, permissions.yml, nethernet/, packs, extensions, logs, cache)
- JVM options -Xms256m -Xmx1024m: /etc/default/geyser
- Self-test: /usr/local/sbin/geyser-selftest
- Advertised address helper: /usr/local/sbin/geyser-set-address
- First boot: geyser-firstboot.service, with a note in /root/geyser-instance-info.txt
- Licence texts: /usr/share/doc/geyser/
If the instance's public address changes, for example after a stop and start without an Elastic IP, run first boot again. It updates the advertised address and the note. Then restart Geyser:
sudo rm -f /var/lib/sac/data/geyser-firstboot.done
sudo systemctl restart geyser-firstboot
sudo grep GEYSER_PUBLIC_IP /root/geyser-instance-info.txt
sudo systemctl restart geyserTo advertise a different address yourself, for example an Elastic IP that you attach later, run sudo geyser-set-address <address> and then sudo systemctl restart geyser.
Security recommendations
- Allow TCP 22 only from your own networks. Only TCP and UDP 19132 need to be open to players.
- Keep
auth-type: online, or use Floodgate with its key kept secret. Offline mode lets anyone impersonate any player. - Keep
/var/lib/geyser/nethernet/identity.pemprivate. If you copy it to another server, both servers share one identity. - Use HTTPS for signaling when you have a domain name (Step 8).
- Protect your Java server too. If it runs elsewhere, allow its Java port only from this instance.
- Upgrade Geyser when Bedrock updates (Step 10). Unattended upgrades keep Ubuntu and OpenJDK patched.
Troubleshooting
- Bedrock players cannot find the server. Check that the security group allows TCP and UDP 19132, then run
curl -s http://<public-ip>:19132/v1/joinfrom your own computer. If that answers but players cannot join, check that the advertised address (Step 4) matches the public address. - Players see "Outdated server" or "Outdated client". Their Bedrock version does not match this Geyser build. See Step 6 and Step 10.
- Players reach the server list but cannot join a world. Geyser cannot reach your Java server. Check
java.addressandjava.port(Step 5), the Java server's own firewall, and thatauth-typematches the Java server's mode.sudo journalctl -u geyser -n 50shows the reason. - The service does not start. Run
systemctl status geyser --no-pagerandsudo journalctl -u geyser -n 50. A YAML mistake inconfig.ymlis the usual cause.
Support and licensing
SecureAnyCloud provides 24/7 technical support for this image by email and live chat at sales@secureanycloud.com. With your request, include the output of geyser-selftest and the last lines of sudo journalctl -u geyser.
Geyser is free software under the MIT License. The jar also bundles the MinecraftAuth library (LGPL-3.0, unmodified), Apache-2.0 and MIT licensed libraries including Bouncy Castle, and a native WebRTC library for NetherNet. That library comprises libdatachannel-java, libdatachannel and libjuice under MPL-2.0, and usrsctp under BSD-3-Clause. NOTICE.native-webrtc lists where to get their source.
Every licence and notice text ships on the image:
ls /usr/share/doc/geyser/ && head -3 /usr/share/doc/geyser/LICENSELICENSE LICENSE.mappings-MIT LICENSE.native-webrtc-MPL-2.0 LICENSE.native-webrtc-usrsctp-BSD-3-Clause LICENSE.third-party-Apache-2.0 LICENSE.third-party-BouncyCastle-MIT LICENSE.third-party-MIT LICENSE.third-party-MIT-2 LICENSE_MinecraftAuth NOTICE.native-webrtc NOTICE.third-party README.sac The MIT License Copyright (c) 2019-2026 GeyserMC. http://geysermc.orgMinecraft is a trademark of Mojang Synergies AB. Geyser is a community project of GeyserMC. SecureAnyCloud is not affiliated with or endorsed by Mojang, Microsoft or GeyserMC.
Deploy on AWS
Launch Geyser 2.12.0 on Ubuntu 24.04 on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com