How can I join servers in PS4 Bedrock?

Is possible! You just need a PC running Windows, macOS or Linux and an app called phantom for creating a LAN Server that the PS4 can join from the Friends tab.

To use phantom, you need to:

  • Download the correct file for your system from GitHub Releases
  • Look for the location of the file that you just downloaded
  • Copy the path of the file
    • Windows: Press Shift and Right Click the file, then select "Copy as path"
    • macOS: Select the file, go to the top bar and click "Edit" and then select "Copy "phantom-macos" as Pathname"
  • Open a terminal or command line for your Operating System
    • Windows: Press Win + R, write cmd and press Enter
    • macOS: Press + Space, write "Terminal" and press Enter
  • Enter the path that you just copied on the terminal
    • Windows: Right Click on the black area or press CTRL + V (Windows 10 only)
    • macOS: First you need write a dot (.), then go to "Edit" on the top bar and select "Paste"
  • After the path of the file, add a space and -server <server-ip-and-port> (for example, -server example.com:19132)
  • You should have something like
C:\Users\lemon>"E:\phantom-windows.exe" -server example.com:19132
  • Press Enter, you should see something like
Starting up with remote server IP: example:19132
INFO: 2020/02/02 20:48:00 proxy.go:75: Binding ping server to: 0.0.0.0:19132
INFO: 2020/02/02 20:48:00 clientmap.go:66: Starting idle connection handler
INFO: 2020/02/02 20:48:00 proxy.go:84: Binding proxy server to: 0.0.0.0:51237
INFO: 2020/02/02 20:48:00 proxy.go:91: Proxy server listening!
  • On your PS4, you should be able to see the server on the Friends tab as a LAN Game

enter image description here

Just connect and you are done! Remember that phantom needs to be running when you want to play on the server from your PS4.


For creating shareable configurations, I will add to this answer:

On Windows, you can create the batch (.bat) file shown below in the same folder as the executable (.exe) file to start the process by right-clicking → Run As Administrator on the .bat file (x = IP Address, # = Port Number):

cd %~dp0
phantom-windows-32bit.exe -server x.x.x.x:#

The same can be done on MacOS by creating the script below with no file extension in the same folder as phantom-macos:

#!/bin/bash
LAUNCH_DIRECTORY=$(cd "$(dirname "$0")"; pwd -P)
"$LAUNCH_DIRECTORY/phantom-macos" -server x.x.x.x:#

However, MacOs requires a few extra steps for setup and packaging to set permissions so that it will run. You will need to right-click on (not inside) the containing folder → New Terminal at Folder and then type the following two commands:

chmod +x nameofscript
chmod +x phantom-macos

Alternatively, you can manually open a terminal window and type "chmod +x " and just drag the files into the terminal.

This will make both files executable and the files should retain those settings if you zip up the folder and send to a friend so that they don't have to manually run these commands.

From here you just need to right-click both files (the script and phantom-macos) and → Open → Open Anyway to allow them to run. (*If you followed the steps above, this step is the only extra configuration someone else will need to do on their Mac if you send them a zipped package as described.)

Once this is done, you can double-click nameofscript to launch phantom-macos from then on.

*Depending on your version of MacOS you may also need to disable the firewall for this to work.


For the admins that want people who dont own computers to be able to join their server, you can set this PHP script on a web server behind the same public IP as your minecraft server :

EDIT: there is also another option, see at the end

EDIT: I made the script a little more explicit with less hardcoded hex strings

$remote_address = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) // used when behind a reverse proxy
{
    $remote_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

$server_type = 'MCPE'; // minecraft pocket edition
$server_name = 'Dedicated Server';
$dont_know_1 = ''; // 390 in captured packets
$server_version = '1.14.60';
$players_connected = '0';
$max_players_allowed = '10';
$dont_know_2 = ''; // 13763012933581449452 in captured packet
$world_name = 'Bedrock level';
$server_mode = 'Survival';
$server_status = '1';
$ipv4_port = '19132';
$ipv6_port = '19133';

$server_id = '';
$server_id .= $server_type . ';';
$server_id .= $server_name . ';';
$server_id .= $dont_know_1 . ';';
$server_id .= $server_version . ';';
$server_id .= $players_connected . ';';
$server_id .= $max_players_allowed . ';';
$server_id .= $dont_know_2 . ';';
$server_id .= $world_name . ';';
$server_id .= $server_mode . ';';
$server_id .= $server_status . ';';
$server_id .= $ipv4_port . ';';
$server_id .= $ipv6_port . ';';

$server_id_bytes = $server_id;

$raknet_packet_type = '1c'; // unconnected pong raknet packet
$raknet_time_since_state = '0000000000000000'; // time since service start in ms, ignore by Minecraft so we can put 0
$raknet_server_guid = 'cafecafecafecafe'; // server GUID, set whatever you want
$raknet_offline_message_id = '00ffff00fefefefefdfdfdfd12345678'; // message id, must match the ping one, which is this hardcoded value
$raknet_server_id_size = sprintf('%04X', strlen($server_id_bytes)); // server id size in bytes

$headers = '';
$headers .= $raknet_packet_type;
$headers .= $raknet_time_since_state;
$headers .= $raknet_server_guid;
$headers .= $raknet_offline_message_id;
$headers .= $raknet_server_id_size;

$message = pack('H*', $headers);
$message .= $server_id_bytes;
$length = strlen($message);

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

$r = socket_bind($sock, '0.0.0.0', 19132);

for ($t = 0; $t < 10; ++$t)
{
    for ($i = 30000; $i < 65535; ++$i)
    {
        socket_sendto($sock, $message, $length, 0, $remote_address, $i);
        usleep(10);
    }
    sleep(1);
}

print('sent a batch of raknet pong to ' . $remote_address);

?>

Then here are the steps for the users :

  1. froward UDP ports 30000-65535 to their console
  2. go to the server list in the game
  3. start a web browser (on the console or on their smartphone if they are on the same network) and go to your web server hosting the above script
  4. immediatly switch back to the server list on the game
  5. your server will appear as a LAN server for few seconds, they can connect to it

Basically the game will add any server that sends it a raknet unconnected pong UDP packet using the source IP address of the UDP packet. If you manage to send such a packet from the internet to the console and on the right port your server will show up.

EDIT: one of my users had a very poor router and could'nt set a range port redirect. We managed to make him join by setting an Unbound DNS server as a simple DNS relay but intercepting DNS for the registered minecraft servers "mco.lbsg.net" to redirect him to our actual server (we used some data from here). Now when he tries to join the LifeBoat server he actually connects to our own server. From an user perspective, setting a custom DNS server is easier but requires more trust.