• 400-123-4567

    工作时间

    周一至周五:9:00-21:00

    周末及节日:9:00-18:00

  • 手机版二维码

    微信公众号

  • 扫描二维码

    关注官方公众号

Close

防火墙Mod-Linux(实验性)

0
回复
164
查看
[复制链接]
  • 打卡等级:殷海萨
  • 打卡总天数:765
  • 打卡月天数:17
  • 打卡总奖励:5193
发表于 2024-9-17 18:31:12 | 显示全部楼层 |阅读模式

防火墙Mod-Linux(实验性)

作者:LordPanic

操作系统:Linux-Debian 12


防火墙Mod-Linux(实验性)

简介(作者原文简译):

警告:此mod仍处于试验阶段,不要在LIVE服务器上使用它。



这是我的一个旧mod,我放弃了它,因为它有很多风险,但我决定出于“教育”目的分享它,希望你们能提供一些见解和帮助,使其能够正常运行和安全运行。
这个mod背后的想法是为主机提供额外的保护层,以防止DDOS攻击。
当DDOS发生--->触发锁定机制只允许在游戏(玩家)IP中并阻止所有未知流量。
将所有游戏玩家置于“隔离区”将导致问题“在封锁期间不在线的玩家如何将他们的IP添加到白名单中?”。我的临时解决方案是通过添加机器人命令将其与不和谐机器人结合起来,例如:!addIP127.0.0.1或在您的网站(用户CP)中添加选项“允许我的ip”,它可以是按钮或其他任何东西。如果不和谐,机器人命令必须发送到机器人本身,而不是在频道中(显然)。仍然提供您的IP对许多人来说是很重要的(我不怪他们)。如果你们有更好的想法,非常欢迎在这里分享。

显然这是我想法背后的理论。我甚至不确定这是否可能,但这就是为什么我和你们分享了它。它可能对许多服务器所有者有用。





  1. package net.sf.l2j.gameserver.mods.firewall;

  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.concurrent.ConcurrentHashMap;

  8. import net.sf.l2j.commons.logging.CLogger;

  9. import net.sf.l2j.gameserver.model.World;
  10. import net.sf.l2j.gameserver.model.actor.Player;

  11. /**
  12. * @author LordPanic
  13. */
  14. public class FirewallManager
  15. {
  16.     private static final CLogger LOGGER = new CLogger(FirewallManager.class.getName());
  17.    
  18.     private Map<Integer, String> _playerIps = new ConcurrentHashMap<>();
  19.     private boolean islocdownActive = false;
  20.    
  21.     private static final String IPTABLES_PATH = "/usr/sbin/iptables";
  22.    
  23.     public static void allowIP(String ipAddress)
  24.     {
  25.         runCommand("-A INPUT -s " + ipAddress + " -j ACCEPT");
  26.     }
  27.    
  28.     public static void allowIPRange(String ipRange)
  29.     {
  30.         runCommand("-A INPUT -s " + ipRange + " -j ACCEPT");
  31.     }
  32.    
  33.     public static void allowOutputToIP(String ipAddress)
  34.     {
  35.         runCommand("-A OUTPUT -d " + ipAddress + " -p tcp -m multiport --dports 2106,7777,9014 -j ACCEPT");
  36.     }
  37.    
  38.     public static void allowInputFromIP(String ipAddress)
  39.     {
  40.         runCommand("-A INPUT -s " + ipAddress + " -p tcp -m multiport --sports 2106,7777,9014 -m state --state ESTABLISHED -j ACCEPT");
  41.     }
  42.    
  43.     public static void limitUnknownConnections()
  44.     {
  45.         runCommand("-I INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit " + 3 + "/second --limit-burst " + 3 + " -j DROP");
  46.         runCommand("-I INPUT -p udp -m limit --limit " + 3 + "/second --limit-burst " + 3 + " -j DROP");
  47.     }
  48.    
  49.     public static void dropAllIncoming()
  50.     {
  51.         runCommand("-A INPUT -j DROP");
  52.     }
  53.    
  54.     public void clearRules()
  55.     {
  56.         runCommand("-F");
  57.         runCommand("-P INPUT ACCEPT");
  58.         runCommand("-P OUTPUT ACCEPT");
  59.         runCommand("-P FORWARD ACCEPT");
  60.         runCommand("-D INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit " + 3 + "/second --limit-burst " + 3 + " -j ACCEPT");
  61.         runCommand("-D INPUT -p udp -m limit --limit " + 3 + "/second --limit-burst " + 3 + " -j ACCEPT");
  62.         
  63.         setIsLocdown(false);
  64.     }
  65.    
  66.     public void startLocDown()
  67.     {
  68.         for (Player player : World.getInstance().getPlayers())
  69.         {
  70.             String ip = player.getClient().getConnection().getInetAddress().getHostAddress();
  71.             allowIP(ip);
  72.             _playerIps.put(player.getObjectId(), ip);
  73.         }
  74.         setIsLocdown(true);
  75.         limitUnknownConnections();
  76.         dropAllIncoming();
  77.     }
  78.    
  79.     private static void runCommand(String command)
  80.     {
  81.         try
  82.         {
  83.             List<String> cmd = new ArrayList<>();
  84.             cmd.add("sudo");
  85.             cmd.add(IPTABLES_PATH);
  86.             String[] parts = command.split(" ");
  87.             for (String part : parts)
  88.             {
  89.                 cmd.add(part);
  90.             }
  91.             
  92.             ProcessBuilder pb = new ProcessBuilder(cmd);
  93.             Process process = pb.start();
  94.             
  95.             int exitCode = process.waitFor();
  96.             if (exitCode == 0)
  97.             {
  98.                 LOGGER.info("Command executed successfully.");
  99.             }
  100.             else
  101.             {
  102.                 LOGGER.error("Command execution failed with exit code: " + exitCode);
  103.             }
  104.         }
  105.         catch (Exception e)
  106.         {
  107.             LOGGER.error("Something else (error).", e);
  108.         }
  109.     }
  110.    
  111.     public void checkSudoPermissions()
  112.     {
  113.         try
  114.         {
  115.             String[] cmd =
  116.             {
  117.                 "/bin/sh",
  118.                 "-c",
  119.                 "sudo ls /tmp"
  120.             };
  121.             Process p = Runtime.getRuntime().exec(cmd);
  122.             
  123.             BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
  124.             String line;
  125.             while ((line = reader.readLine()) != null)
  126.             {
  127.                 LOGGER.info(line);
  128.             }
  129.         }
  130.         catch (Exception e)
  131.         {
  132.             LOGGER.info(e);
  133.         }
  134.     }
  135.    
  136.     public static FirewallManager getInstance()
  137.     {
  138.         return SingletonHolder.INSTANCE;
  139.     }
  140.    
  141.     public boolean isIslocdownActive()
  142.     {
  143.         return islocdownActive;
  144.     }
  145.    
  146.     public void setIsLocdown(boolean islocdownActive)
  147.     {
  148.         this.islocdownActive = islocdownActive;
  149.     }
  150.    
  151.     private static class SingletonHolder
  152.     {
  153.         protected static final FirewallManager INSTANCE = new FirewallManager();
  154.     }
  155.    
  156. }
复制代码
代码网盘免费下载
https://l2fater.lanzouj.com/iRD2n2a6mxcb
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

全国统一客服电话
400-1234-7788

24x7小时免费咨询

  • 官方在线客服

    QQ客服:杀气丶

    点击交谈
  • 上海市虹口区海伦中心B座4F4055-4056室

  • 手机扫码查看公众号

    手机查找资源更方便

  • 扫一扫官方微信公众号

    关注官方微信公众号

血玫瑰游戏社区制作( 吉ICP备2022002542号 )营业执照|网站地图