davinc1
声明:本教程需要在您主机的个人计算机上使用Linux(并具备基本的Linux知识)。
在spawnmc.net的群里,我和几个朋友决定在隔离期间创建一个小型的Minecraft服务器来进行游戏。随着服务器的发展,我们意识到我们需要更多的RAM和CPU核心,但托管费用已经有点贵了,于是我决定尝试自己托管服务器。这样我就可以根据我的计算机提供的RAM数量分配任意数量的RAM,并使用我想要的核心数。而且几周前,我了解到我们的ISP将我们的上传速度提高到30Mbps,这应该足够运行一个Minecraft服务器,但由于我们没有公共IP地址,并且位于一个CGNAT后面,我无法从路由器上进行端口转发。我开始研究如何解决这个问题。
我们需要什么?首先,我们需要一台计算机或服务器来托管Minecraft服务器。它必须具备相当不错的配置。我不建议使用少于8GB RAM或少于2个核心的计算机。配置越高,服务器运行得越流畅。
其次,稳定的网络连接。你可以使用5Mbps的上传速度,但我建议至少10Mbps。
最后,需要一台具有公共IP的VPS服务器,对大多数人来说这可能是最简单的解决方案。

我假设我们已经准备好并设置了一个Ubuntu VPS。
设置Minecraft服务器我将使用Docker容器来托管我们的Minecraft服务器。它会为你创建和设置所有必需的东西。所有这些步骤都将在托管服务器的个人计算机上进行,还不需要VPS。让我们从安装Docker开始。
更新软件包索引并安装一些先决条件:
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common复制代码


导入存储库的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -复制代码


将存储库添加到apt中:
sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”复制代码


最后安装软件包:


sudo apt install docker-ce docker-ce-cli复制代码


接下来,我们将创建一个容器,并使用itzg的镜像,该镜像已为我们设置好了一切:
sudo docker run -d -it --restart unless-stopped -p 25565:25565 -e MEMORY=4G -e EULA=TRUE -e TYPE=AIRPLANE -e AIRPLANE_BUILD=lastSuccessfulBuild -e USE_AIKAR_FLAGS=true -v /your/data/folder:/data --name minecraft itzg/minecraft-server
复制代码一些你可以更改的变量:MEMORY:指定你想要为服务器使用的RAM数量。-v /your/data/folder:/data:将“/your/data/folder”更改为你想要服务器位于的文件夹。例如:/home/user/minecraft-server


一些解释:-e TYPE=AIRPLANE:我们将使用一个非常优化的Paper分支,Paper本身是一个Spigot的优化分支。-e USE_AIKAR_FLAGS=true:当连接更多用户时,启用一些可以帮助的JVM标志
该命令将为你准备好一切。你可以使用sudo docker ps查看有关容器的更多信息。现在,如果我想进入控制台,我可以使用sudo docker attach minecraft。这将使我可以直接在控制台中输入命令。要离开控制台,请不要使用CTRL+C。这将停止服务器。而是使用逃逸序列。首先按CTRL+P,然后按CTRL+Q。
为了使其更加用户友好,我将安装portainer-ce。它是一个通过网站管理Docker的UI工具。要安装portainer,请使用以下命令:
sudo docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /your/data/folder:/data portainer/portainer-ce复制代码你需要将/your/data/folder更改为存储portainer相关数据的文件夹。然后转到localhost:9000,创建一个帐户并登录。我们将更改Minecraft服务器的网络设置,因此点击“本地”,然后点击“容器”,再点击“minecraft”。在顶部点击复制/编辑按钮。滚动到高级容器设置并点击网络。现在将网络从bridge更改为host。这将禁用容器在网络上的隔离,并使其可以访问我们本地区域网外的连接。现在点击“部署容器”。如果你想通过图形界面查看控制台,你可以点击日志以查看控制台输出,并附加到控制台输入命令。


我们已经设置好了Minecraft服务器。你可以在多人游戏菜单中使用localhost:25565作为IP地址连接到服务器。你的局域网中的其他人可以使用你的本地IP(使用命令ip a找到你正在使用的接口)以及相同的端口25565进行连接。下一步是设置我们的VPS并创建Wireguard VPN。
设置VPS、Wireguard和路由希望你能自己购买VPS。最低配置的VPS就可以了,因为运行一个VPN并路由一些数据包并不需要太多资源。你还应选择一个距离你较近的服务器,因为如果有人想连接到服务器,他们将连接到VPS,然后VPS将连接到你的个人计算机。购买VPS后,通过SSH登录进入它。
首先,我们将启用数据包路由。如果你没有安装nano,请使用sudo apt install nano进行安装。然后运行以下命令:sudo nano /etc/sysctl.conf,取消注释带有net.ipv4.ip_forward = 1的行。按CTRL+X退出,然后按Y,最后按Enter。这将启用VPS上的IP转发。使用此命令使更改生效,而无需重新启动:sudo sysctl -p。
让我们通过sudo apt install ufw安装uncomplicated firewall(ufw)。然后允许SSH、Wireguard和Minecraft的端口。
sudo ufw allow ssh
sudo ufw allow 51820/udp
sudo ufw allow 25565
sudo ufw enable复制代码


如果注意到重新启动后ufw无效,请尝试使用sudo systemctl enable ufw。
我们准备设置Wireguard。首先,通过sudo apt install wireguard在VPS上安装Wireguard。在你的个人计算机上也进行安装。安装完成后,我们需要创建密钥。在**VPS和个人计算机上都要运行这两个命令,并将公钥保存在某个地方。
(umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey复制代码


现在我们需要更改VPS上的Wireguard配置。首先使用sudo nano /etc/wireguard/wg0.conf。然后按照以下方式更改配置:
[Interface]
PrivateKey = ***(此处将填写上一个命令生成的内容,请不要与任何人共享)***
PostUp = iptables -t nat -A PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.20.4.2:25565
PostUp = iptables -t nat -A POSTROUTING -o ***if*** -j MASQUERADE
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 25565 -j DNAT --to-destination 10.20.4.2:25565
PostDown = iptables -t nat -D POSTROUTING -o ***if*** -j MASQUERADE
ListenPort = 51820
Address = 10.20.4.1/24
[Peer]
PublicKey = ***(将你的个人计算机的公钥放在这里,该公钥由上一个命令生成)***
AllowedIPs = 10.20.4.2/24复制代码


现在你需要用你连接到互联网的接口替换if。你可以使用route命令查看哪个接口。你想要的接口是default destination。


route命令的输出。如你所见,在我的情况下,接口将是enp0s3。

PostUp和PostDown命令设置了路由,使所有到达端口25565的入站流量重定向到我们的个人计算机(VPN中的10.20.4.2)。VPS的IP将是10.20.4.1,如Address条目中所示。
提示:如果你需要进行端口映射或打开另一个端口,只需复制原始的iptables命令并更改IP地址。--dport是VPS上的端口,PC上的端口在命令的--to-destination部分。不要忘记使用ufw启用该端口。举个例子,如果我想在我的个人计算机上打开ssh端口,我会添加PostUp = iptables -t nat -A PREROUTING -p tcp --dport 555 -j DNAT --to-destination 10.20.4.2:22,PostDown命令使用-D而不是-A。然后使用sudo ufw allow 555启用该端口。现在你可以使用ssh -p 555 (VPS的公共IP)@用户名在家中连接到你的个人计算机。
接下来,我们将设置个人计算机的Wireguard。让我们打开配置文件并稍作更改。我们可以再次使用sudo nano /etc/wireguard/wg0.conf来进行更改。配置文件应该如下所示:
[Interface]
PrivateKey = ***(这将填写上一个命令生成的内容,请不要与任何人共享)***
Address = 10.20.4.2/24
Table = 1
PostUp = ip rule add pref 500 from 10.20.4.2 lookup 1
PostDown = ip rule del pref 500
[Peer]
PublicKey = ***(将VPS的公钥放在这里)***
AllowedIPs = 0.0.0.0/0
Endpoint = ***(VPS的公共IP-例如用于ssh的IP)***:51820
PersistentKeepalive = 25复制代码


它几乎相同,但我们设置了使用特定表的路由。当你设置AllowedIPs时,Wireguard会设置你的个人计算机在向该IP发送流量时不应该使用广域网(WAN),而应该使用wg0接口,即我们的VPN隧道。我们将AllowedIPs设置为0.0.0.0/0以允许所有IP的连接通过我们的VPN。如果我们不这样做,并将其设置为VPS的IP,我们将在日志中得到VPS的IP而不是玩家的IP(我们还需要稍微更改VPS的配置)。但是当我们将其设置为0.0.0.0/0时,我们告诉Wireguard所有的IP都应通过wg0接口进行路由。这样所有的流量都将通过你的VPN路由到VPS,然后从那里连接到互联网。如果你的VPS上有限的每月带宽(大多数VPS都有),这可能不是你想要的。大多数VPS提供商的最低配置至少提供1TB的每月带宽。因此,如果你想将所有流量路由到VPN,删除Table = 1以及两个PostUp和PostDown。ip rule add pref 500 from 10.20.4.2 lookup 1确保来自10.20.4.2(你的PC的VPN地址)的所有流量都使用“1”表来进行路由。我们使用PC的VPN IP,因为我们要路由PC创建的数据包。这意味着从VPN出来的数据将通过VPN返回,而不是通过广域网。
现在我们所要做的就是使用我们的配置启用Wireguard,一切应该可以正常工作。
要启用Wireguard,请在VPS和个人计算机上使用systemctl使用此命令:sudo systemctl enable wg-quick@wg0。如果你需要快速重新启动VPN,请使用sudo systemctl restart wg-quick@wg0。你应该先重新启动VPS的连接,然后再重新启动个人计算机的连接。你还可以使用sudo wg检查连接是否正常。如果你看到握手信息,你就通过VPN连接了。
如果这对你不起作用,我会在评论中尽力帮助你。