时间线
朋友看了TIS的视频心潮澎湃,打算拉着我和几个小伙伴开个Minecraft服务器玩玩,于是有了这个计划;
一开始打算采用Zerotier建立虚拟局域网连接,但无奈对方校园网络环境太差,NAT层层套娃,体验极其差,最终只得选择云服务器进行搭建。
2019/12/19 初代
阿里云学生机 X2
具体配置:1核2G1M(自然是Mbps),9元/月,一台开服一台转发流量缓解带宽压力
初代人数:6人
服务器核心:原版1.14.4
体验:极差
2020/01/13 二代目
百度云服务器 X3
具体配置:乘着年终采购活动买到了1折的云服务器,分别为
2核4G1M,238元/年
1核2G2M,151元/年
1核1G1M,84元/年
一台开服,另外两台作转发缓解带宽压力
二代目人数:9人
服务器核心:Spigot1.14.4
体验:一般
2020/02/15 三代目
阿里云服务器 X7
具体配置:因疫情肆虐,阿里助力上云,白嫖6个月ECS(可免费延期至1年),发动小伙伴一人一台。2核4G1M带宽,1台开服,剩下全作转发缓解带宽压力
三代目人数:11人
服务器核心:PaperSpigot1.14.4
体验:一般
动手过程
这里以阿里云ECS为例,百度云配置方式太过傻瓜
购买云服务器
- 注册登录阿里云/百度云,进行实名认证(和学生认证);
- 购买(白嫖)2核4G的云服务器,年末年初优惠力度较大。选择地域杭州,操作系统Centos7.5,其他默认;
- 初始化,设置密码(
一开始忘记设置,死活登录不上); - 安全组规则修改,放行25565端口(MC默认端口,没打算改)入站流量;
- 安装Xshell&Xftp软件,连接云服务器;
准备工作
- 安装 Screen 和 Java:
Note:Screen 可以保持本地和服务器断开后,程序继续在服务器上运行,防止退出shell会话后mc服务端进程自动结束。yum -y install screen yum -y install java-1.8.0-openjdk
- 由于服务器网络原因,本地下载Minecraft原版服务器端,用xftp丢进云服务器里;
- 添加新用户minecraftserver(其实只是搭建私人小服的话不添加直接用root账户也可以):
adduser minecraftserver
- 设置密码:
passwd minecraftserver
正式搭建
-
由于服务器网络原因,在本地下载完服务端再用Xftp丢进服务器。
Mojang原版
下载链接可以在 中文Minecraft WiKi 内找到(Gamepedia速度过慢可以换用部署在Bilibili的 中文Minecraft WiKi 镜像站 )
单独版本的WiKi地址:https://wiki.biligame.com/mc/版本号
比如1.14.4就为:https://wiki.biligame.com/mc/1.14.4
Spigot
官网:https://spigotmc.org
下载地址:https://hub.spigotmc.org/jenkins/job/BuildTools/
PaperSpigot
官网:https://papermc.io
Github:https://github.com/PaperMC/Paper
下载地址:https://papermc.io/downloads -
如果是原版,直接打开Xftp,连接服务器,进入新建用户minecraftserver的目录
/home/minecraftserver/
,把下载下来的文件server.jar
丢进去;
如果是Spigot/Paperspigot,下载下来的是buildtools.jar
或paper.jar
,要先进行本地构建。构建完后把构建好的jar改个名字,改为server.jar
,和原版一样丢进服务器。 -
服务器同目录下新建脚本
start.sh
,填写如下的玄学内容:#!/bin/sh screen -dmS mc java -Xms2G -Xmx2G -XX:+AggressiveOpts -XX:+UseCompressedOops -jar /home/minecraftserver/server.jar
Note 1:关于screen
Note 2:-Xms初始内存 -Xms最大内存 -XX:+AggressiveOpts引入实验性的优化 -XX:+UseCompressedOops压缩指针 -
如果是在Windows下编辑,需要确保文档格式为Unix:
Notepad++修改文档格式:编辑 -> 文档格式转换 -> 转为Unix (LF)
Vim修改文档格式:cd /home/minecraftserver vim start.sh
进入修改界面,键入
:set ff
,最底下显示fileformat=unix
则正常,若显示fileformat=dos
,则需要进一步输入:set ff=unix
,完事后再输入:set ff
确认文档格式已为Unix,最后:wq
保存退出;
Note:关于Vim -
第一次启动,用用户minecraftserver登入,运行刚刚整好的脚本:
cd /home/minecraftserver ./start.sh
-
第一次会报错,同目录下找到eula.txt并修改
eula=false
为eula=true
;又为了允许盗版玩家加入,找到server.properties并修改online-mode=true
为online-mode=false
,完事后重新启动; -
作为一个盗版玩家心怀惭愧和感激,加入游戏。
端口转发-打通内网
单个云服务器的带宽属实不够,网络压缩得太狠服务器vCPU又顶不住,又因为阿里云内网流量带宽上限够大,且不计入外网流量内,同区域内VPC内网连接即使是跨账号也不花钱,于是下定决心找服里的小伙伴各自创建账号再买(嫖)一台云服务器做转发。
下面以MAIN-ECS和NAT-ECS代指两个阿里云ECS实例(实际上是7个…):
注:百度云同账号同地域服务器默认内网互通,无需以下操作;而跨账号内网默认不通,即使是同地域也不行,必须充钱才能变得更强。
- 进入阿里云Main服务器控制台,进入其所在的专有网络(VPC),创建 云企业网(CEN) 并将同账号下MAIN-ECS实例加载进该云企业网,并记录下账号ID、专有网络(VPC)实例ID、云企业网(CEN)实例ID;
- 登新号,购买(白嫖)新ECS,选择相同地域,初始化,安全组内开放25565端口(或自行设置其他端口),并记录下账号ID、专有网络(VPC)实例ID;
- 跨账号VPC授权,将NAT-ECS所在VPC 授权给 MAIN-ECS所在VPC加入的CEN;
- 加载跨账号VPC实例,将NAT-ECS所在VPC 加载到 MAIN-ECS所在VPC加入的CEN 中,也就是让NAT-ECS和MAIN-ECS各自所在的VPC网络实例处于同一个CEN实例内,CEN会自动配置路由规则;
- Xshell分别打开两个云服务器,互相ping对方的内网ip,ping通说明成功;
小插曲-网段冲突
在把所有VPC加入云企业网时,出现有一个VPC下的云服务器无法ping通的故障,刚开始还以为是加入云企业网的VPC实例数量达到上限了,查找过相关帮助文档后发现并没有超过限额。最后在云企业网下的路由表发现冲突项,原来是这个VPC和已经在云企业网内的另外一个VPC发生了网段冲突。
解决方法:
- 记录一下所有VPC的网段,然后在发生冲突的其中一个VPC内新建同地域交换机,网段要避开已有的;
- 停止ECS实例,在网络与安全组下点选修改私网ip;
- 交换机选择刚刚新建的交换机,然后修改私网ip;
- 重启实例,重新将该ECS实例所在VPC加入云企业网。
参考链接:https://yq.aliyun.com/articles/710358
端口转发-配置转发
做TCP端口转发有很多方法,可以用nginx,可以用iptables,可以用firewall,鉴于iptables配置起来比较麻烦,在Centos7下还被阉割掉了,而nginx还得装,所以这里选择用自带的firewall来做TCP端口转发。
Note:用firewall做TCP端口转发会导致Minecraft服务器无法获得玩家真实ip,如果有这方面需求的话需要使用nginx。
- Xshell打开NAT-ECS,查看firewalld服务状态:
如果是dead状态,需要先开启firewalld服务:systemctl status firewalld
systemctl start firewalld
- 让firewalld服务开机启动,以防止服务器意外宕机后需要重新配置:
systemctl enable firewalld.service
- 开启ip伪装功能,zone可以改:
检查是否成功:firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --query-masquerade
- 开放Minecraft默认使用的25565端口,如果改为其他的话服务端也需要要改:
firewall-cmd --zone=public --add-port=25565/tcp --permanent
- 端口转发:
举个例子,开服用的MAIN-ECS的内网ip是111.111.111.111,公网ip为222.222.222.1,开服时设置的端口为25565;转发用的NAT-ECS公网ip为222.222.222.2,开启的端口是12345,则输入firewall-cmd --add-forward-port=port=NAT-ECS端口(本机端口):proto=tcp:toaddr=MAIN-ECS内网ip地址(要把流量转发到的地址):toport=MAIN-ECS端口(要转发到的端口)
firewall-cmd --add-forward-port=port=12345:proto=tcp:toaddr=111.111.111.111:toport=25565
- 继续用上面的例子:
客户端输入222.222.222.1
(因为:25565是MC默认端口所以不用输入,会自动填充) 就可以直接连接到MAIN-ECS上的服务器;
客户端输入222.222.222.2:12345
(因为:12345不是MC默认端口,所以要自行输入) 就可以通过NAT-ECS间接连接到MAIN-ECS上的服务器。 - 补充
如果想要关闭firewalld服务,输入systemctl stop firewalld
即可;
如果想禁用firewalld服务开机启动,输入systemctl disable firewalld.service
即可。
服务器优化
略