👴的房子又被烧了
重新总结一下吧,我搞了一个minecraft小服务器,paper服务端,纯原版生存,没有加任何插件,也没开正版验证和白名单验证。
隔三岔五有陌生人进来搞破坏甚至开挂满地图拉💩,时间以凌晨居多,用http://www.cip.cc/查询ip归属地也确实都是些外国ip。
不知道陌生人是如何得知服务器的公网ip的,不过这个也好理解,就算挂着脚本一个一个试也有可能把ip试出来,虽然实在不能理解怎么会有人这么闲。
最初的解决方法是开白名单,结果破坏者直接顶着白名单上的ID进来了,至今也不知道它们是如何获取白名单上的ID的。
相似案例还是得看这个:个人Minecraft服务器被境外黑客/熊孩子攻击的事例分享 - 哔哩哔哩 (bilibili.com)
通过安装管理插件可以解决绝大多数问题:Minecraft服务器管理之EssentialsX、Residence插件 - 拾一贰叁 - 博客园 (cnblogs.com),最主要还是要用Authme这个登录插件,把正版验证打开更保险。
但是亲朋好友没多少是买了正版的,多亏了微软那糟糕的启动器,导致有时候我也不想用正版启动器🤬所以没法开onlinemode,至于登录插件,总感觉每次进入游戏还得输密码很难受。
所以尝试一下能否搞一个简单的IP验证插件,发现是国内IP就放进来,发现是境外的就踢出去。
开发环境和一些基本配置看之前写的:IntellIJ开发简单Minecraft插件(利用paper API) - 拾一贰叁 - 博客园 (cnblogs.com)
主要代码:
package com.mc.ipvalidate.ipvalidate;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.entity.Player;
import java.io.IOException;
public class MyPaperPlugin extends JavaPlugin implements Listener {
private final OkHttpClient httpClient = new OkHttpClient();
@Override
public void onEnable() {
// 注册事件监听器
Bukkit.getPluginManager().registerEvents(this, this);
getLogger().info("MyPaperPlugin 已启用");
}
@Override
public void onDisable() {
getLogger().info("MyPaperPlugin 已禁用");
}
@EventHandler
public void onPlayerLogin(PlayerLoginEvent event) {
String playerIP = event.getAddress().getHostAddress();
String location = getIPLocation(playerIP);
Player player = event.getPlayer();
if (location == null || location.startsWith("中国")) {
String message ="玩家 " + event.getPlayer().getName() + " 进入游戏。IP: " + playerIP + " 位置: " + location;
player.sendMessage(message);
Bukkit.broadcastMessage(message);
getLogger().info(message);
} else {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You bastard are not welcomed");
String broadcastMessage="拒绝玩家 " + event.getPlayer().getName() + " 进入游戏。IP: " + playerIP + " 位置: " + location;
Bukkit.broadcastMessage(broadcastMessage);
getLogger().info(broadcastMessage);
}
}
private String getIPLocation(String ip) {
String url = "http://www.cip.cc/" + ip;
Request request = new Request.Builder().url(url).build();
try (Response response = httpClient.newCall(request).execute()) {
if (!response.isSuccessful()) {
getLogger().warning("IP查询失败: " + response);
return null;
}
String responseBody = response.body().string();
String[] lines = responseBody.split("\n");
for (String line : lines) {
if (line.startsWith("地址")) {
return line.split(":")[1].trim();
}
}
} catch (IOException e) {
getLogger().severe("IP查询过程中发生错误: " + e.getMessage());
}
return null;
}
}
这里的IP归属地查询还是从http://www.cip.cc/这个网站获取的信息。