Jump to content
  • 0

[HELP]IPVP4 Filter


Question

Posted

i put IPv4 filter in java side...i compile all ok..but when someone attacks...in gameserver still the i see the packets logs that attack.it didnt fixed? or it send empty packets? can someone explain it?

12 answers to this question

Recommended Posts

  • 0
Posted

ofc.here is the error on gameserver.

http://img573.imageshack.us/i/snapshotr.png/

Someone attacking your server with packets...

as i can see on your title you are L2J Developer so fix it ;)

  • 0
Posted

Someone attacking your server with packets...

as i can see on your title you are L2J Developer so fix it ;)

no one attacks :). i just attack myself to test it...

i have puted ipvp4filter what else should i do -_-

  • 0
Posted

pfff men i dont have a server to use a linux ...i am just wondering!

and did you change this ? :D

 

net/sf/l2j/gameserver/GameServer.java

-      _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);
+      _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, new IPv4Filter());

 

net/sf/l2j/loginserver/SelectorHelper.java

package net.sf.l2j.loginserver;

-import java.net.InetAddress;
import java.nio.channels.SocketChannel;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map.Entry;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import net.sf.l2j.loginserver.serverpackets.Init;
+import net.sf.l2j.util.IPv4Filter;

import org.mmocore.network.IAcceptFilter;
import org.mmocore.network.IClientFactory;
@@ -33,18 +30,15 @@
  * 
  * @author KenM
  */
-public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>,
+public class SelectorHelper implements IMMOExecutor<L2LoginClient>,
         IClientFactory<L2LoginClient>, IAcceptFilter
{
-   private HashMap<Integer, Flood> _ipFloodMap;
    private ThreadPoolExecutor _generalPacketsThreadPool;
+   private IPv4Filter _ipv4filter;

    public SelectorHelper()
    {
-      _generalPacketsThreadPool = new ThreadPoolExecutor(4, 6, 15L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
-      _ipFloodMap = new HashMap<Integer, Flood>();
-      super.setDaemon(true);
-      super.start();
+      _ipv4filter = new IPv4Filter();
    }

    /**
@@ -73,110 +67,6 @@
     */
    public boolean accept(SocketChannel sc)
    {
-      InetAddress addr = sc.socket().getInetAddress();
-      int h = hash(addr.getAddress());
-      
-      long current = System.currentTimeMillis();
-      Flood f;
-      synchronized (_ipFloodMap)
-      {
-         f = _ipFloodMap.get(h);
-      }
-      if (f != null)
-      {
-         if (f.trys == -1)
-         {
-            f.lastAccess = current;
-            return false;
-         }
-         
-         if (f.lastAccess + 1000 > current)
-         {
-            f.lastAccess = current;
-            
-            if (f.trys >= 3)
-            {
-               f.trys = -1;
-               return false;
-            }
-            
-            f.trys++;
-         }
-         else
-         {
-            f.lastAccess = current;
-         }
-      }
-      else
-      {
-         synchronized (_ipFloodMap)
-         {
-            _ipFloodMap.put(h, new Flood());
-         }
-      }
-      return !LoginController.getInstance().isBannedAddress(addr);
+      return _ipv4filter.accept(sc) && !LoginController.getInstance().isBannedAddress(sc.socket().getInetAddress());
    }
-   
-   /**
-    * 
-    * @param ip
-    * @return
-    */
-   private int hash(byte[] ip)
-   {
-      return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24
-              & 0xFF000000;
-   }
-   
-   private class Flood
-   {
-      long lastAccess;
-      int trys;
-      
-      Flood()
-      {
-         lastAccess = System.currentTimeMillis();
-         trys = 0;
-      }
-   }
-   
-   /**
-    * 
-    * @see java.lang.Thread#run()
-    */
-   @Override
-   public void run()
-   {
-      while (true)
-      {
-         long reference = System.currentTimeMillis() - (1000 * 300);
-         ArrayList<Integer> toRemove = new ArrayList<Integer>(50);
-         synchronized (_ipFloodMap)
-         {
-            for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())
-            {
-               Flood f = e.getValue();
-               if (f.lastAccess < reference)
-                  toRemove.add(e.getKey());
-            }
-         }
-         
-         synchronized (_ipFloodMap)
-         {
-            for (Integer i : toRemove)
-            {
-               _ipFloodMap.remove(i);
-            }
-         }
-         
-         try
-         {
-            Thread.sleep(5000);
-         }
-         catch (InterruptedException e)
-         {
-            
-         }
-      }
-   }
}

  • 0
Posted

Index: java/net/sf/l2j/gameserver/GameServer.java
===================================================================
--- java/net/sf/l2j/gameserver/GameServer.java	(revision 3898)
+++ java/net/sf/l2j/gameserver/GameServer.java	(working copy)
@@ -59,7 +59,6 @@
import net.sf.l2j.gameserver.datatables.SummonItemsData;
import net.sf.l2j.gameserver.datatables.TeleportLocationTable;
import net.sf.l2j.gameserver.datatables.ZoneData;
-
import net.sf.l2j.gameserver.geoeditorcon.GeoEditorListener;
import net.sf.l2j.gameserver.handler.AdminCommandHandler;
import net.sf.l2j.gameserver.handler.ItemHandler;
@@ -134,6 +133,7 @@
import net.sf.l2j.gameserver.handler.itemhandlers.Firework;
import net.sf.l2j.gameserver.handler.itemhandlers.FishShots;
import net.sf.l2j.gameserver.handler.itemhandlers.Harvester;
+import net.sf.l2j.gameserver.handler.itemhandlers.Maps;
import net.sf.l2j.gameserver.handler.itemhandlers.MercTicket;
import net.sf.l2j.gameserver.handler.itemhandlers.MysteryPotion;
import net.sf.l2j.gameserver.handler.itemhandlers.PaganKeys;
@@ -151,7 +151,6 @@
import net.sf.l2j.gameserver.handler.itemhandlers.SpecialXMas;
import net.sf.l2j.gameserver.handler.itemhandlers.SpiritShot;
import net.sf.l2j.gameserver.handler.itemhandlers.SummonItems;
-import net.sf.l2j.gameserver.handler.itemhandlers.Maps;
import net.sf.l2j.gameserver.handler.skillhandlers.BalanceLife;
import net.sf.l2j.gameserver.handler.skillhandlers.BeastFeed;
import net.sf.l2j.gameserver.handler.skillhandlers.Blow;
@@ -229,6 +228,7 @@
import net.sf.l2j.gameserver.util.DynamicExtension;
import net.sf.l2j.gameserver.util.FloodProtector;
import net.sf.l2j.status.Status;
+import net.sf.l2j.util.IPv4Filter;

import com.l2jserver.mmocore.network.SelectorServerConfig;
import com.l2jserver.mmocore.network.SelectorThread;
@@ -660,6 +660,7 @@
		SelectorServerConfig ssc = new SelectorServerConfig(Config.PORT_GAME);
		L2GamePacketHandler gph = new L2GamePacketHandler();
		_selectorThread = new SelectorThread<L2GameClient>(ssc, gph, gph, gph);
+		_selectorThread.setAcceptFilter(new IPv4Filter());
		_selectorThread.openServerSocket();
		_selectorThread.start();
		_log.config("Maximum Numbers of Connected Players: " + Config.MAXIMUM_ONLINE_USERS);
Index: java/net/sf/l2j/loginserver/SelectorHelper.java
===================================================================
--- java/net/sf/l2j/loginserver/SelectorHelper.java	(revision 3898)
+++ java/net/sf/l2j/loginserver/SelectorHelper.java	(working copy)
@@ -23,6 +23,7 @@
import java.util.concurrent.TimeUnit;

import net.sf.l2j.loginserver.serverpackets.Init;
+import net.sf.l2j.util.IPv4Filter;

import com.l2jserver.mmocore.network.IAcceptFilter;
import com.l2jserver.mmocore.network.IClientFactory;
@@ -37,10 +38,12 @@
public class SelectorHelper implements IMMOExecutor<L2LoginClient>, IClientFactory<L2LoginClient>, IAcceptFilter
{
	private ThreadPoolExecutor _generalPacketsThreadPool;
+	private IPv4Filter _ipv4filter;

	public SelectorHelper()
	{
		_generalPacketsThreadPool = new ThreadPoolExecutor(4, 6, 15L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
+		_ipv4filter = new IPv4Filter();
	}

	/**
@@ -66,7 +69,7 @@
	 */
	public boolean accept(SocketChannel sc)
	{
-		return !LoginController.getInstance().isBannedAddress(sc.socket().getInetAddress());
+		return _ipv4filter.accept(sc) && !LoginController.getInstance().isBannedAddress(sc.socket().getInetAddress());
	}

}
Index: java/net/sf/l2j/util/IPv4Filter.java
===================================================================
--- java/net/sf/l2j/util/IPv4Filter.java	(revision 0)
+++ java/net/sf/l2j/util/IPv4Filter.java	(revision 0)
@@ -0,0 +1,149 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.sf.l2j.util;
+
+import java.net.InetAddress;
+import java.nio.channels.SocketChannel;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map.Entry;
+
+import com.l2jserver.mmocore.network.IAcceptFilter;
+
+/**
+ * Formatted Forsaiken's IPv4 filter [DrHouse]
+ * 
+ * @author Forsaiken
+ *
+ */
+public class IPv4Filter implements IAcceptFilter, Runnable
+{
+	private HashMap<Integer, Flood> _ipFloodMap;
+
+	private static final long SLEEP_TIME = 5000;
+
+	public IPv4Filter()
+	{
+		_ipFloodMap = new HashMap<Integer, Flood>();
+		Thread t = new Thread(this);
+		t.setDaemon(true);
+		t.start();
+	}
+
+	/**
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	private static final int hash(byte[] ip)
+	{
+		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000
+				| ip[3] << 24 & 0xFF000000;
+	}
+
+	protected static final class Flood
+	{
+		long lastAccess;
+
+		int trys;
+
+		Flood()
+		{
+			lastAccess = System.currentTimeMillis();
+			trys = 0;
+		}
+	}
+
+	public boolean accept(SocketChannel arg0)
+	{
+		InetAddress addr = arg0.socket().getInetAddress();
+		int h = hash(addr.getAddress());
+
+		long current = System.currentTimeMillis();
+		Flood f;
+		synchronized (_ipFloodMap)
+		{
+			f = _ipFloodMap.get(h);
+		}
+		if (f != null)
+		{
+			if (f.trys == -1)
+			{
+				f.lastAccess = current;
+				return false;
+			}
+
+			if (f.lastAccess + 1000 > current)
+			{
+				f.lastAccess = current;
+
+				if (f.trys >= 3)
+				{
+					f.trys = -1;
+					return false;
+				}
+
+				f.trys++;
+			} else
+			{
+				f.lastAccess = current;
+			}
+		} else
+		{
+			synchronized (_ipFloodMap)
+			{
+				_ipFloodMap.put(h, new Flood());
+			}
+		}
+
+		return true;
+	}
+
+	public void run()
+	{
+		while (true)
+		{
+			long reference = System.currentTimeMillis() - (1000 * 300);
+			ArrayList<Integer> toRemove = new ArrayList<Integer>(50);
+
+			synchronized (_ipFloodMap)
+			{
+				for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())
+				{
+					Flood f = e.getValue();
+					if (f.lastAccess < reference)
+						toRemove.add(e.getKey());
+				}
+			}
+
+			synchronized (_ipFloodMap)
+			{
+				for (Integer i : toRemove)
+				{
+					_ipFloodMap.remove(i);
+				}
+			}
+
+			try
+			{
+				Thread.sleep(SLEEP_TIME);
+			} catch (InterruptedException e)
+			{
+
+			}
+		}
+	}
+}
\ No newline at end of file

 

That is the patch.help!

  • 0
Posted

I think that the first is better ;)

-      _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);
+      _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, new IPv4Filter());

 

		_selectorThread = new SelectorThread<L2GameClient>(ssc, gph, gph, gph);
+		_selectorThread.setAcceptFilter(new IPv4Filter());

Guest
This topic is now closed to further replies.


×
×
  • Create New...