Servidor Minecraft en Oracle Cloud

Si eres padre o simplemente te gustan los videojuegos en red sin duda conocerás Minecraft. Mi hijo de 8 años y muchos compañeros de su colegio son jugadores habituales. Si tienes hijos pequeños te gustará controlar a que servidores y con quien juegan en red. No hay mejor manera que crear uno mismo el servidor y enterarse de todo lo que pasa dentro. Para crear un servidor Minecraft necesitamos contratar un VPS con IP pública y descargar el software gratuito del servidor Minecraft.

Este tutorial está hecho para Oracle Cloud Infrastructure. Si prefieres Azure o algún otro gigante de servicios Cloud el proceso será muy parecido ya que también cuentan con una Virtual Cloud Network sobre donde corren los VPS. Otro tipo de proveedores mas sencillos nos alquilan una máquina virtual a la que te conectas por SSH o un panel web. En estos solo hay que hacer los ajustes de firewall del lado VPS, ya que no existe o no tenemos control alguno de la VCN.

Abrir puertos

El servidor de Minecraft requiere tener abierto el puerto 25565 para protocolo tcp y udp. Cómo esto es una instancia de servidor Ubuntu que corre en Oracle Cloud Infrastucture debemos abrir puertos desde la web para la propia infraesctructura y también desde el propio VPS Ubuntu.

Abrir puertos en OCI ya lo hemos visto en otras ocasiones en esta serie de artículos. Debemos ir al portal de Oracle Cloud y dentro de nuestra insfraestructura en el menú Networking->Virtual Cloud Networks->miVCN->Security List Details en la sección Resources picamos la opción de Ingress Rules para crear nuevas reglas de entrada. Se han de crear 2 reglas de entrada para el puerto 25565 en tcp y udp para todas las fuentes de origen 0.0.0.0/0
Si no queda claro repasa el artículo Configuración de OCI, parte 2, dedicado al Firewall en OCI que encontrarás en esta web.

También necesitamos crear las reglas de entrada desde el propio firewall del VPS. En mi caso es un VPS con Ubuntu 20.04 y trae predeterminado el firewall iptables. Aunque el firewall ufw viene instalado está sin activar. Sin duda ufw es más sencillo de configurar pero para practicar un poco iptables lo haremos un "poco más difícil".
Si también decides usar iptables introduce estas líneas:

# Cambio a usuario root
sudo su
# Regla avanzada de seguridad. Limitar ataques sencillos DoS para que desde una misma IP no se hagan
mas de 10 conexiones. Esto no vale para ataques DDoS que usan miles de IP

iptables -I 1 INPUT -p tcp --syn --dport 25565 -m connlimit --connlimit-above 10 -j DROP
# Abrir puerto tcp
iptables -I 2 INPUT -p tcp --dport 25565 -j ACCEPT
# Abrir puerto udp
iptables -I 3 INPUT -p udp --dport 25565 -j ACCEPT
# Hacer los cambios persistentes
/sbin/iptables-save > /etc/iptables/rules.v4

Software del servidor Minecraft

El software original para crear el servidor lo encontramos en: https://www.minecraft.net/es-es/download/server
Desde esta web copiamos la ruta al archivo de la última versión.

Desde la terminal nos situamos en el directorio donde queremos descargarlo. En este ejemplo guiado escogeré el directorio /opt que recuerdo que es el indicado para alojar programas de terceras partes que no se instalan de la manera estándar. Dentro crearemos un directorio llamado servidorminecraft.

root@ubuntusrv1:/home/ubuntu# cd /opt
root@ubuntusrv1:/opt# mkdir minecraftserver
root@ubuntusrv1:/opt# cd minecraftserver
root@ubuntusrv1:/opt/minecraftserver#

La descarga la hacemos con el comando wget pegando la ruta a continuación.

root@ubuntusrv1:/opt/minecraftserver# wget https://launcher.mojang.com/v1/objects/e00c4052dac1d59a1188b2aa9d5a87113aaf1122/server.jar
--2022-07-19 15:24:52-- https://launcher.mojang.com/v1/objects/e00c4052dac1d59a1188b2aa9d5a87113aaf1122/server.jar
Resolving launcher.mojang.com (launcher.mojang.com)... 152.199.21.175, 2606:2800:233:1cb7:261b:1f9c:2074:3c
Connecting to launcher.mojang.com (launcher.mojang.com)|152.199.21.175|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45538778 (43M) [application/zip]
Saving to: ‘server.jar’

server.jar 100%[==================================================================>] 43.43M 80.5MB/s in 0.5s

2022-07-19 15:24:52 (80.5 MB/s) - ‘server.jar’ saved [45538778/45538778]

El comando wget es muy transparente informando de todo el proceso de la descarga: resolución de nombres de dominio, estado de la conexión con el servidor de destino, tamaño del archivo solicitado y otros datos. Me llama la atención la velocidad de descarga que hay entre servidores. Una transferencia de 80.5MB/s es mucho más rápido de lo que estoy acostumbrado a ver cuando descargo un archivo a mi portátil o al móvil.

Ahora ya tenemos el programa de servidor Minecraft. El siguiente paso es arrancarlo. Los archivos con extensión .jar son ejecutables Java que requieren tener instalado la plataforma de desarrollo para Java, conocida como OpenJDK (Java Development Kit). OpenJDK incluye entre muchas herramientas Java Runtime Environment, pieza necesaria para ejecutar archivos .jar. Existe también OracleJDK pero es con licencia de pago incluso para servidores sin fines de lucro.
Un servidor Minecraft vainilla(original sin complementos) podría funcionar únicamente instalando JRE pero como podemos tener problemas si decidimos añadir módulos optaremos por la versión JDK.
Para comprobar que tenemos en nuestro VPS Java instalado desde la terminal entramos java -version.

ubuntu@ubuntusrv2:~$ java -version

Command 'java' not found, but can be installed with:

sudo apt install default-jre # version 2:1.11-72, or
sudo apt install openjdk-11-jre-headless # version 11.0.15+10-0ubuntu0.20.04.1
sudo apt install openjdk-16-jre-headless # version 16.0.1+9-1~20.04
sudo apt install openjdk-17-jre-headless # version 17.0.3+7-0ubuntu0.20.04.1
sudo apt install openjdk-8-jre-headless # version 8u312-b07-0ubuntu1~20.04
sudo apt install openjdk-13-jre-headless # version 13.0.7+5-0ubuntu1~20.04

Como ves me responde que no lo tengo instalado y me sugiere como instalarlo según la versión. He marcado en naranja la más nueva de las disponibles.
No olvides que es recomendable antes de instalar nada actualizar el sistema. Podemos en una sola línea ejecutar el update y upgrade

La secuencia de comandos sería la siguiente:

#actualizar sistema
sudo apt update && sudo apt upgrade -y
#instalar java
sudo apt install openjdk-17-jre-headless

Tras la instalación, si consultamos la versión de Java la respuesta es OpenJDK 17.

ubuntu@ubuntusrv1:~$ java -version
openjdk version "17.0.3" 2022-04-19
OpenJDK Runtime Environment (build 17.0.3+7-Ubuntu-0ubuntu0.20.04.1)
OpenJDK 64-Bit Server VM (build 17.0.3+7-Ubuntu-0ubuntu0.20.04.1, mixed mode, sharing)

Ahora el VPS ya es capaz de ejecutar archivos .jar. Para arrancar el servidor debemos estar situados sobre el directorio donde descargamos el archivo server.jar. Recuerda que en esta guía es en el directorio /opt/minecraftserver.
Aunque el prompt ya nos indica en que directorio estamos también podemos usar el comando pwd por si no nos aparece esta información.

Por comodidad, para no tener que poner sudo en cada instrucción me cambio a root con la orden sudo su

root@ubuntusrv1:/opt/minecraftserver# pwd
/opt/minecraftserver

Si listamos el directorio debemos tener el archivo server.jar

root@ubuntusrv1:/opt/minecraftserver# ls
server.jar

Comando screen

Llegó el momento de ejecutar el servidor. Como interesa que el software del servidor Minecraft se quede en ejecución aunque cerremos sesión usaremos el comando screen para crear multiples sesiones en una terminal. Este comando es fundamental para entrar y salir de la sesión sin que se altere nada de lo que se está ejecutando. Si arrancas el servidor Minecraft sin hacer uso de las sesiones de screen se detendrá el programa al abandonar la sesión SSH.

Para crear una instancia de screen simplemente desde la terminal entramos screen. En Ubuntu viene instalado por defecto. Si no estuviera daría error y lo podriamos instalar con sudo apt install screen

root@ubuntusrv1:/opt/minecraftserver# screen

Nos saldrá un texto informativo de 2 páginas. Pulsamos la tecla "Espacio" 2 veces y ya estamos en otra sesión dentro de la sesión de terminal que teníamos inicialmente. Para listar las sesiones de screen usamos el parámetro -ls

root@ubuntusrv1:/opt/minecraftserver# screen -ls
There is a screen on:
7838.pts-1.ubuntusrv1 (07/20/22 18:16:44) (Attached)
1 Socket in /run/screen/S-root.
root@ubuntusrv1:/opt/minecraftserver#

El número de 4 cifras creado al azar nos sirve para identificar la sesión y poder asociarnos, salir, borrarla, etc

Podemos practicar con las sesiones haciendo algún cambio, entrando y saliendo para ver los cambios. Como ejemplo vamos a cambiar de directorio, salimos de esta sesión screen y si todo va bien volveremos a estar en el último directorio que tenía la sesión inicial.

root@ubuntusrv1:/# cd /home
root@ubuntusrv1:/home#

Ahora nos separamos con:

root@ubuntusrv1:/home# screen -d 7838

[remote detached from 7838.pts-1.ubuntusrv1]
root@ubuntusrv1:/opt/minecraftserver#

Volvemos a estar fuera de la sesión de Screen pero ésta todavía existe. Para eliminarlo podemos hacerlo con:

root@ubuntusrv1:/opt/minecraftserver# screen -X -S 7838 quit

# Listar posibles sesiones
root@ubuntusrv1:/opt/minecraftserver# screen -ls
No Sockets found in /run/screen/S-root.

Otras formas de eliminar sesiones con screen kill xxxx siendo xxxx el número prefijo de la sesión y también con exit que cerraría la sesión actual y saltaría a la sesión padre. Aquí solo comento un poco por encima algunas posibilidades de este potente comando en este tutorial de servidor Minecraft para entender lo que hace y porqué se usa. Realmente el servidor Minecraft funcionaría sin screen pero estaría limitado el servidor a esa tarea y no podriamos cerrar sesión. Buscando un poco por internet encontrarás mas usos de este comando. Puede ser interesante la opción de crear multiples ventanas para cada sesión o los atajos de teclado para moverse entre sesiones. Por el momento no profundizo más en este tema.

Este comando no es nada intuitivo y requiere un poco de práctica. De los comandos mínimos para defenderse a destacar que pulsando de manera continua "ctrl + a" cambiamos entre pantallas. Mejor aún es pulsar "ctrl + a" y a continuación "shift + 2" mostrará una lista de las pantallas existentes. Con los cursores y la tecla "ENTRAR" cambiamos a la pantalla que nos interese.

Ejecutar archivos .jar

Cerramos el paréntesis de screen y retomamos la ejecución del servidor. En estos momentos el VPS no tiene ninguna sesión abierta. (Hemos eliminado todas las creadas durante la explicación de screen. Se puede comprobar listando sesiones con screen -ls). Vamos otra vez a ejecutar screen en la terminal y sobre la nueva sesión ejecutamos server.jar. Recuerda situarte en el directorio /opt/minecraftserver previamente creado.

root@ubuntusrv1:/opt/minecraftserver$ screen
root@ubuntusrv1:/opt/minecraftserver$
# En el directorio actual se encuentra el software Minecraft Server
root@ubuntusrv1:/opt/minecraftserver$ ls
server.jar

Para ejecutar el archivo .jar usaremos el comando java:

java -Xms1024M -Xmx1024M -jar server.jar nogui

Los parámetros usados son:

  • Xms1024M: Memoria máxima que tomará la máquina virtual Java donde correrá el programa.
  • Xmx1024M: Es el valor máximo de memoria que puede usar el programa a ejecutar.
  • -jar server.jar: El programa a ejecutar encapsulado en un único archivo de formato .jar.
  • nogui: Para arrancar el servidor sin GUI (interfaz gráfica de usuario) osea en modo terminal sin ventanas.

Si tu VPS lo permite y quieres tener un servidor multijudador de muchos jugadores puedes plantearte subir la memoria a 2048 o 4096MB.

La primera vez que se ejecuta el servidor saldrá un error porque no hemos aceptado la licencia.

[12:09:57] [ServerMain/WARN]: Failed to load eula.txt
[12:09:57] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

Haciendo un ls vemos que eula.txt se encuantra en la raiz del directorio donde se ejecutó el servidor. Fácilmente lo solucionamos con nano eula.txt cambiando la línea donde dice "eula=false" para que diga "eula=true".

root@ubuntusrv1:/opt/minecraftserver$ ls
eula.txt libraries logs server.jar server.properties versions

Tras esto ya podemos ejecutar el servidor y ahora sí que arrancará pero antes vamos a personilizar algunos detalles del juego.

Las posibilidades de configuraciones de un servidor Minecraft son casi infinitas. Existen webs especializadas para crear gran variedad de mundos de diferentes tamaños, materiales, peligros, etc. Como iniciación a una pequeña parte de lo que se puede hacer vamos a editar el archivo server.properties. Buscaremos algunas variables y los cambiaremos a nuestro gusto. Para saber que hacen y que valores puedes poner en server.properties puedes consultar https://minecraft.fandom.com/es/wiki/Server.properties

  • gamemode=survival
  • difficulty=easy
  • pvp=true
  • level-name=El servidor de Iv\u00e1n
  • motd=\u00a76Para ni\u00f1os de 8 a\u00f1os (Nota: aunque no lo parezca pone "Para niños de 8 años en letras" en color naranja
  • level-type=minecraft\:flat

Las variables que contienen cadenas si usan caracteres latinos como ñ o acentos se debe romper con \u y el código unicode. De la misma forma hay unos códigos para poner colores. Lo más cómodo es usar alguno de los muchos editores online que existen. En este ejemplo usé https://minecraft.tools/en/motd.php para picar el texto en castellano con acentos, ñ, colores, etc y desde allí me copio la conversión con unicode.

Tras los cambios ahora sí que ejecutamos el servidor con la misma sentencia de antes:

java -Xms1024M -Xmx1024M -jar server.jar nogui

En unos segundos tendremos el servidor en ejecución. Para unirse a una partida en red desde el juego seleccionamos Multijugador y en la nueva pantalla Conexión directa o Añadir Servidor. Deberemos entrar la IP o dominio del VPS.

Cuando un jugador se une al mundo desde la consola del servidor nos aparece su nombre. Nosotros como administradores del servidor podemos controlar muchos detalles del mundo y de los jugadores: enviar mensajes, hacer que llueva o se haga de noche, eliminar un jugador si no se comporta, etc. Pero todo esto ya son temas que deberás investigar en las páginas dedicadadas a administrar servidores Minecraft.

Esta guía es solo un punto de entrada al universo Minecraft.