天空 Blond - SSH
type: channel
link: https://skyblond.info/tag/SSH/
items: 【歪门邪道】想办法让朋友连上我家里的Minecraft服务器

【歪门邪道】想办法让朋友连上我家里的Minecraft服务器
type: item
date: 2024-10-01T08:17:00+08:00
description: 最近和朋友联机Minecraft，用的Tailscale，但有时对方需要使用蜂窝网络，这个时候Tailscale的穿墙打洞就不太行了。怎么办呢？开个国外的服务器便宜配置高，但是延迟大；开个国内的服务器网络好但是配置贵。我灵机一动：开个服务器做流量转发吧！因为服务器只有两个人联机，所以不需要24小时在线运行，我这边的策略是在我的NUC上运行Minecraft，然后我来开局域网共享。在Tailscale能穿墙打洞的情况下，我们可以通过家宽的IPv6直连，所以延迟很低。但有时对方需要在单位值班，这个时候就要自己的手机开热点给电脑用，而这种情况下Tailscale无法穿墙打洞，这是因为运营商对于蜂窝网络使用的是一种NAT，这种情况下Tailscale会走国外的中继，这样一来不光延迟大增，有时候还会丢包。为了解决这个问题，我决定租用一台云服务器。上云？家境贫寒，告辞！一开始原本打算把服务器搬到云上，但最主要的问题无外乎成本和延迟，后者也可以归进成本。由于我使用国外服务器比较多，因此对国外的价格比较熟悉。像是我常用的云服务供应商Hetzner，他们家一台8核心16GB内存的机器大约是这个价格：共享Intel机型CX42：每月20欧元（不到160元人民币）共享AMD机型CPX41：每月30欧元（不到240元人民币）共享Ampere机型CAX31：每月15欧元（不到120元人民币）独享机型CCX33：8核32GB内存每月60欧元（不到480元人民币）这些价格还包含了至少为160GB的NVMe硬盘、万兆共享网络接口、20TB上传以及下载不计费。对应地，阿里云的服务器（北京区，以下价格为1个月包月价格，按量付费会更贵）：Intel系列最便宜的ecs.e-c1m2.xlarge：每月216元AMD系列最便宜的ecs.c8a.xlarge：每月371.71元Arm系列最便宜的ecs.c8y.xlarge：每月256.26元阿里云的价格只是配置费，不包含硬盘和按流量计费的百兆共享网络。再来看看腾讯云（同样北京区，1个月包月价格）：Intel系列最便宜的S5.LARGE8：每月288.14元AMD系列最便宜的SA3.LARGE8：每月241.6元Arm系列最便宜的SR1.LARGE8：每月262.8元同样，这个价格只有配置费，不包含硬盘和按流量计费的宽带。我一直以来使用Hetzner的服务器就是因为便宜量大还管饱，但唯一不好的一点就是网络延迟很高。Minecraft作为一个需要操作的游戏，它对于延迟还是很敏感的。一般人的情况下（高ping战士不在此列），ping值在100毫秒以下就算是可以接受的，超过120毫秒就有些难受了，最好还是在70毫秒以下。而Hetzner的服务器呢？刚刚ping了一下，肉眼平均在350毫秒左右。我平时部署的服务都是基于HTTP的，像是什么wikijs这种个人知识库，他们对延迟不敏感，我也没什么体感。但这个延迟肯定是玩不了Minecraft。但是国内服务器这么贵，我真的用不起。这里其实还可以考虑按时租用，比如说晚上要和朋友玩了，就把服务器打开，不用就关掉。阿里云和腾讯云都能够在关机时做到不收取实例配置费，你只需要支付硬盘的价格就行了。但是这也有一个弊端：你要是一不小心忘了，那就自求多福吧。当然，你也可以考虑使用各家的产品来组合一套解决方案，例如通过一个HTTP请求或者一封邮件在触发服务器启动，然后在服务器内通过脚本检测游戏人数，如果半小时内玩家数量一直为0则触发自动关机。但这种解决方案通常不具有通用性，所以这里就不多介绍了，因为我确实没有这个需求。等之后有这个需求的，可以考虑研究研究。其实我有公网IP，只不过是v6由于v4地址日渐枯竭，我搬到昆明之后，发现这边的电信用的是CGNAT，它是一种无感知的技术，旨在提供一个Full-cone NAT让多个用户共享一个IPv4地址。这也就是为什么基于UDP协议的Tailscale能够穿墙打洞成功，因为它是对称的NAT。当然了，我也有IPv6，实际上Tailscale穿墙打洞之后用的也是IPv6地址直连。但关于IPv6地址有很多系列，比如我现在一个ip addr下去：3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 【我的网卡MAC】 brd ff:ff:ff:ff:ff:ff altname wlp0s20f3 inet 192.168.X.X/8 brd 192.168.X.255 scope global noprefixroute wlo1 valid_lft forever preferred_lft foreve…