Minecraft服务器被境外黑客/熊孩子入侵——开启IP验证

👴的房子又被烧了

重新总结一下吧,我搞了一个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/这个网站获取的信息。

posted @ 2024-06-11 21:01  拾一贰叁  阅读(55)  评论(0编辑  收藏  举报