~Ge0rge~ Posted December 30, 2010 Posted December 30, 2010 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?
0 ~Ge0rge~ Posted December 30, 2010 Author Posted December 30, 2010 can you make a pic? ofc.here is the error on gameserver. http://img573.imageshack.us/i/snapshotr.png/
0 `Rοmeο Posted December 30, 2010 Posted December 30, 2010 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 ~Ge0rge~ Posted December 30, 2010 Author Posted December 30, 2010 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 ~Ge0rge~ Posted December 30, 2010 Author Posted December 30, 2010 use linux pfff men i dont have a server to use a linux ...i am just wondering!
0 j1maras2@ Posted December 30, 2010 Posted December 30, 2010 maybe ipv4filter is not for localhost attacks.
0 Tw3ty Posted December 31, 2010 Posted December 31, 2010 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 ~Ge0rge~ Posted December 31, 2010 Author Posted December 31, 2010 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 Fanky Posted December 31, 2010 Posted December 31, 2010 oO Maybe you cant see that the Code its not for localhost?:o :o :o getInetAddress(); >.>
0 Tw3ty Posted December 31, 2010 Posted December 31, 2010 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());
Question
~Ge0rge~
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