A Minecraft proxy server for Steel server instances, allowing players to switch between multiple backend servers using the /server command.
- Multi-Server Support: Connect multiple Steel backend servers
- Server Switching: Use
/server <name>to switch between servers - Transfer Packet: Uses Minecraft 1.20.5+ Transfer packet for seamless switching
- Offline Mode: Currently supports offline mode (online mode coming soon)
- Bidirectional Packet Forwarding: Minimal latency with immediate forwarding
[Minecraft Client] <---> [Steel Proxy] <---> [Backend Server 1]
|
+-----------> [Backend Server 2]
- Client connects to proxy (appears as normal Minecraft server)
- Proxy authenticates player (offline mode - uses client-provided UUID)
- Proxy connects to default backend server (offline mode)
- Bidirectional packet forwarding begins
- When player types
/server <name>:- Proxy intercepts the command
- Sends Transfer packet to client with proxy's own address
- Client disconnects and reconnects to proxy
- Proxy connects to new backend server
- Forwarding resumes with new server
Create proxy-config.toml:
# Address to bind the proxy to
bind_address = "0.0.0.0"
# Port to listen on
bind_port = 25565
# Enable online mode (currently only offline mode supported)
online_mode = false
# Default server for new connections
default_server = "survival"
# Backend servers
[backends.survival]
address = "127.0.0.1"
port = 25566
description = "Survival Server"
[backends.creative]
address = "127.0.0.1"
port = 25567
description = "Creative Server"cargo build --release- Start your backend Steel servers in offline mode on their configured ports
- Run the proxy:
cargo run --release
- Connect your Minecraft client to the proxy address (localhost:25565)
Once connected:
- You start on the default server (configured in
proxy-config.toml) - Type
/server survivalto switch to the survival server - Type
/server creativeto switch to the creative server
- CTransfer packet added to steel-protocol
- Proxy crate structure created
- Configuration system (TOML-based)
- Client connection handler (offline mode)
- Backend server connector (offline mode)
- Bidirectional packet forwarding framework
-
/servercommand interception - Transfer packet server switching logic
- Fix remaining compilation errors (packet encoding issues)
- Test with actual Steel backend servers
- Handle server switch state persistence
- Online mode support (Mojang authentication)
- Player state caching between servers
- Connection pooling to backend servers
- Tab completion for
/servercommand - Permission system (which servers players can access)
- MOTD/Player list from all backend servers
- Fallback server on disconnect
- Metrics and monitoring
- Compilation errors: Some packet encoding methods need adjustment for ServerPackets vs ClientPackets
- Server switch persistence: Need to store which server player wants after Transfer packet
- No compression/encryption: Offline mode only, no packet compression or AES encryption
steel-protocol: Minecraft protocol implementationsteel-utils: Utility functions and codecssteel-crypto: Cryptographic operations (not fully utilized yet)tokio: Async runtimeserde/toml: Configuration parsinganyhow: Error handling
Client → Proxy → Backend:
- Proxy receives encrypted packet from client (if online mode)
- Proxy decrypts packet
- Check for
/servercommand - Forward all other packets unchanged to backend
Backend → Proxy → Client:
- Proxy receives packet from backend (unencrypted, offline mode)
- Forward packet unchanged to client
- Re-encrypt for client (if online mode)
When /server <name> is detected:
- Validate server exists in config
- Send
CTransferpacket with proxy's address/port - Client disconnects
- Client reconnects to proxy
- New
ClientHandlercreated - Connect to requested backend server (TODO: need state storage)
- Resume packet forwarding
Part of the SteelMC project.