From 42818e9218a7c3d3c24bca792e7697dd2dae575c Mon Sep 17 00:00:00 2001 From: kahzerx Date: Tue, 4 Feb 2025 19:00:30 +0100 Subject: [PATCH 1/2] forward-client-virtual-host forward-client-virtual-host --- README.md | 2 + .../proxy/config/VelocityConfiguration.java | 13 +++++++ .../backend/VelocityServerConnection.java | 39 ++++++++++++++----- .../src/main/resources/default-velocity.toml | 5 +++ 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 232099ceca..47a90ba447 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ A list of small tweaks I made: - Mapping between online / offline uuid will be updated on player connected - The sqlite database file can be shared between multiple velocity instances - UUID rewrite can be disabled by setting `enabled = false` +- Added advanced proxy setting to forward client virtual host + - setting to overwrite handshake packet host and port between virtual host or backend server # Velocity diff --git a/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java b/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java index df60a5886c..18e9a541e4 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java @@ -460,6 +460,11 @@ public boolean isForceKeyAuthentication() { return forceKeyAuthentication; } + // [kahzerx's fork] forward client virtual host + public boolean isForwardClientVirtualHost() { + return this.advanced.forwardClientVirtualHost; + } + @Override public String toString() { return MoreObjects.toStringHelper(this) @@ -773,6 +778,8 @@ private static class Advanced { private boolean logPlayerConnections = true; @Expose private boolean acceptTransfers = false; + @Expose + private boolean forwardClientVirtualHost = true; // [kahzerx's fork] forward client virtual host private Advanced() { } @@ -798,6 +805,7 @@ private Advanced(CommentedConfig config) { this.logCommandExecutions = config.getOrElse("log-command-executions", false); this.logPlayerConnections = config.getOrElse("log-player-connections", true); this.acceptTransfers = config.getOrElse("accepts-transfers", false); + this.forwardClientVirtualHost = config.getOrElse("forward-client-virtual-host", true); } } @@ -861,6 +869,10 @@ public boolean isAcceptTransfers() { return this.acceptTransfers; } + public boolean isForwardClientVirtualHost() { + return forwardClientVirtualHost; + } + @Override public String toString() { return "Advanced{" @@ -878,6 +890,7 @@ public String toString() { + ", logCommandExecutions=" + logCommandExecutions + ", logPlayerConnections=" + logPlayerConnections + ", acceptTransfers=" + acceptTransfers + + ", forwardClientVirtualHost=" + forwardClientVirtualHost + '}'; } } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java index af3f817966..90f632c7f5 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java @@ -140,18 +140,28 @@ String getPlayerRemoteAddressAsString() { } private String createLegacyForwardingAddress() { + String host; + if (server.getConfiguration().isForwardClientVirtualHost()) { + host = proxyPlayer.getVirtualHost().orElseGet(() -> registeredServer.getServerInfo().getAddress()).getHostString(); + } else { + host = registeredServer.getServerInfo().getAddress().getHostString(); + } return PlayerDataForwarding.createLegacyForwardingAddress( - proxyPlayer.getVirtualHost().orElseGet(() -> - registeredServer.getServerInfo().getAddress()).getHostString(), + host, getPlayerRemoteAddressAsString(), proxyPlayer.getGameProfile() ); } private String createBungeeGuardForwardingAddress(byte[] forwardingSecret) { + String host; + if (server.getConfiguration().isForwardClientVirtualHost()) { + host = proxyPlayer.getVirtualHost().orElseGet(() -> registeredServer.getServerInfo().getAddress()).getHostString(); + } else { + host = registeredServer.getServerInfo().getAddress().getHostString(); + } return PlayerDataForwarding.createBungeeGuardForwardingAddress( - proxyPlayer.getVirtualHost().orElseGet(() -> - registeredServer.getServerInfo().getAddress()).getHostString(), + host, getPlayerRemoteAddressAsString(), proxyPlayer.getGameProfile(), forwardingSecret @@ -164,9 +174,14 @@ private void startHandshake() { // Initiate the handshake. ProtocolVersion protocolVersion = proxyPlayer.getConnection().getProtocolVersion(); - String playerVhost = proxyPlayer.getVirtualHost() - .orElseGet(() -> registeredServer.getServerInfo().getAddress()) - .getHostString(); + String playerVhost; + if (server.getConfiguration().isForwardClientVirtualHost()) { + playerVhost = proxyPlayer.getVirtualHost() + .orElseGet(() -> registeredServer.getServerInfo().getAddress()) + .getHostString(); + } else { + playerVhost = registeredServer.getServerInfo().getAddress().getHostString(); + } HandshakePacket handshake = new HandshakePacket(); handshake.setIntent(HandshakeIntent.LOGIN); @@ -185,9 +200,13 @@ private void startHandshake() { handshake.setServerAddress(playerVhost); } - handshake.setPort(proxyPlayer.getVirtualHost() - .orElseGet(() -> registeredServer.getServerInfo().getAddress()) - .getPort()); + if (server.getConfiguration().isForwardClientVirtualHost()) { + handshake.setPort(proxyPlayer.getVirtualHost() + .orElseGet(() -> registeredServer.getServerInfo().getAddress()) + .getPort()); + } else { + handshake.setPort(registeredServer.getServerInfo().getAddress().getPort()); + } mc.delayedWrite(handshake); mc.setProtocolVersion(protocolVersion); diff --git a/proxy/src/main/resources/default-velocity.toml b/proxy/src/main/resources/default-velocity.toml index 6c599b220b..b10af4a6cc 100644 --- a/proxy/src/main/resources/default-velocity.toml +++ b/proxy/src/main/resources/default-velocity.toml @@ -145,6 +145,11 @@ log-player-connections = true # Transfer packet (Minecraft 1.20.5) to be received. accepts-transfers = false +# [kahzerx's fork] +# If set to false, modifies the virtual host to match the server address in the handshake. +# Useful when backends require players to connect with a specific dns. +forward-client-virtual-host = true + # [fallen's fork] mojang auth proxy # See readme for more information [auth-proxy] From f5a6f479b06058ce94223fda1b26e4a78a883599 Mon Sep 17 00:00:00 2001 From: kahzerx Date: Tue, 4 Feb 2025 19:12:58 +0100 Subject: [PATCH 2/2] kek --- .../proxy/connection/backend/VelocityServerConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java index 90f632c7f5..527caca0d1 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java @@ -170,7 +170,6 @@ private String createBungeeGuardForwardingAddress(byte[] forwardingSecret) { private void startHandshake() { final MinecraftConnection mc = ensureConnected(); - PlayerInfoForwarding forwardingMode = server.getConfiguration().getPlayerInfoForwardingMode(); // Initiate the handshake. ProtocolVersion protocolVersion = proxyPlayer.getConnection().getProtocolVersion(); @@ -183,6 +182,7 @@ private void startHandshake() { playerVhost = registeredServer.getServerInfo().getAddress().getHostString(); } + PlayerInfoForwarding forwardingMode = server.getConfiguration().getPlayerInfoForwardingMode(); HandshakePacket handshake = new HandshakePacket(); handshake.setIntent(HandshakeIntent.LOGIN); handshake.setProtocolVersion(protocolVersion);