爪哇之家

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            35 隨筆 :: 29 文章 :: 8 評(píng)論 :: 0 Trackbacks
          java代碼:?

          import java.io.BufferedReader;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.util.ArrayList;
          import java.util.Date;
          import java.util.HashMap;
          import java.util.HashSet;
          import java.util.Iterator;
          import java.util.List;
          import java.util.Map;
          import java.util.Set;
          import java.util.StringTokenizer;

          /**
          * @author Robbin Fan
          *
          */

          publicclass IPBanner {

          ? ? ? ? publicstaticfinalString NETSTAT = "netstat -nt";

          ? ? ? ? publicstaticfinalString IP_INSERT = "iptables -I INPUT -i eth0 -j DROP -p tcp --dport 80 -s ";

          ? ? ? ? publicstaticfinalString IP_DEL = "iptables -D INPUT -i eth0 -j DROP -p tcp --dport 80 -s ";

          ? ? ? ? publicstaticfinalString HOST_IP = "61.129.70.239:80";

          ? ? ? ? publicstaticfinal long BAN_TIMEOUT = 30 * 60 * 1000L;

          ? ? ? ? publicstaticfinal long BAN_INTERVAL = 30 * 1000L;

          ? ? ? ? publicstaticfinalint CONCURRENT = 80;

          ? ? ? ? publicstaticfinalint SYN_CONCURRENT = 8;

          ? ? ? ? publicstaticfinalMap banMap = newHashMap();

          ? ? ? ?
          ? ? ? ? publicstaticvoid ban()throwsException{

          ? ? ? ? ? ? ? ? Set banList = dynamicBanIP();
          ? ? ? ? ? ? ? ? System.out.println();
          ? ? ? ? ? ? ? ? System.out.println("Time: " + newDate());
          ? ? ? ? ? ? ? ? Runtime runtime = Runtime.getRuntime();

          ? ? ? ? ? ? ? ? List expiredIPList = newArrayList();
          ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? for(Iterator iter = banMap.entrySet().iterator(); iter.hasNext();){
          ? ? ? ? ? ? ? ? ? ? ? ? Map.Entry entry = (Map.Entry) iter.next();
          ? ? ? ? ? ? ? ? ? ? ? ? if((System.currentTimeMillis() - ((Long) entry.getValue()).longValue()) > BAN_TIMEOUT){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? expiredIPList.add(entry.getKey());
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? for(int i = 0; i <expiredIPList.size(); i++){
          ? ? ? ? ? ? ? ? ? ? ? ? runtime.exec(IP_DEL + expiredIPList.get(i));
          ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("DEL IP: " + expiredIPList.get(i));
          ? ? ? ? ? ? ? ? ? ? ? ? banMap.remove(expiredIPList.get(i));
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? for(Iterator iter = banList.iterator(); iter.hasNext();){
          ? ? ? ? ? ? ? ? ? ? ? ? String ip = (String) iter.next();
          ? ? ? ? ? ? ? ? ? ? ? ? if(!banMap.containsKey(ip)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? runtime.exec(IP_INSERT + ip);
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? banMap.put(ip, newLong(System.currentTimeMillis()));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("BAN IP:" + ip);
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? }

          ? ? ? ? ? ? ? ? System.out.println("---ban ip list---");
          ? ? ? ? ? ? ? ? for(Iterator iter = banMap.keySet().iterator(); iter.hasNext();){
          ? ? ? ? ? ? ? ? ? ? ? ? String ip = (String) iter.next();
          ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(ip);
          ? ? ? ? ? ? ? ? }
          ? ? ? ? }

          ? ? ? ? publicstaticSet dynamicBanIP()throwsException{
          ? ? ? ? ? ? ? ? String ipstat = null;
          ? ? ? ? ? ? ? ? Set banList = newHashSet();
          ? ? ? ? ? ? ? ? List ipList = newArrayList();
          ? ? ? ? ? ? ? ? List countList = newArrayList();
          ? ? ? ? ? ? ? ? List synCountList = newArrayList();
          ? ? ? ? ? ? ? ? List finCountList = newArrayList();

          ? ? ? ? ? ? ? ? Runtime runtime = Runtime.getRuntime();
          ? ? ? ? ? ? ? ? Process process = runtime.exec(NETSTAT);
          ? ? ? ? ? ? ? ? InputStream input = process.getInputStream();
          ? ? ? ? ? ? ? ? InputStreamReader inputReader = newInputStreamReader(input);
          ? ? ? ? ? ? ? ? BufferedReader reader = newBufferedReader(inputReader);
          ? ? ? ? ? ? ? ? reader.readLine();
          ? ? ? ? ? ? ? ? reader.readLine();
          ? ? ? ? ? ? ? ? while((ipstat = reader.readLine()) != null){
          ? ? ? ? ? ? ? ? ? ? ? ? StringTokenizer token = newStringTokenizer(ipstat);
          ? ? ? ? ? ? ? ? ? ? ? ? while(token.hasMoreTokens()){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? token.nextToken();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? token.nextToken();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? token.nextToken();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String originalIP = token.nextToken();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String ip = token.nextToken().split(":")[0];
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String status = token.nextToken();

          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(HOST_IP.equals(originalIP)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if(!ipList.contains(ip)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ipList.add(ip);
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? countList.add(newInteger(1));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if("SYN_RECV".equals(status)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? synCountList.add(newInteger(1));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? synCountList.add(newInteger(0));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if("FIN_WAIT1".equals(status)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? finCountList.add(newInteger(1));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? finCountList.add(newInteger(0));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int index = ipList.indexOf(ip);
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? countList.set(index, newInteger(((Integer) countList.get(index)).intValue() + 1));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if("SYN_RECV".equals(status)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? synCountList.set(index, newInteger(((Integer) synCountList.get(index)).intValue() + 1));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if("FIN_WAIT1".equals(status)){
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? finCountList.set(index, newInteger(((Integer) finCountList.get(index)).intValue() + 1));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? reader.close();
          ? ? ? ? ? ? ? ? inputReader.close();
          ? ? ? ? ? ? ? ? input.close();
          ? ? ? ? ? ? ? ? process.destroy();
          ? ? ? ? ? ? ? ? for(int i = 0; i < ipList.size(); i++){
          ? ? ? ? ? ? ? ? ? ? ? ? if(((Integer) countList.get(i)).intValue() > CONCURRENT)
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? banList.add(ipList.get(i));
          ? ? ? ? ? ? ? ? ? ? ? ? if(((Integer) synCountList.get(i)).intValue() > SYN_CONCURRENT)
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? banList.add(ipList.get(i));
          ? ? ? ? ? ? ? ? ? ? ? ? if(((Integer) finCountList.get(i)).intValue() > SYN_CONCURRENT)
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? banList.add(ipList.get(i));
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? return banList;
          ? ? ? ? }

          ? ? ? ? publicstaticvoid main(String[] args)throwsException{
          ? ? ? ? ? ? ? ? while(true){
          ? ? ? ? ? ? ? ? ? ? ? ? ban();
          ? ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(BAN_INTERVAL);
          ? ? ? ? ? ? ? ? }
          ? ? ? ? }
          }

          控制服務(wù)的腳本ban.sh

          java代碼:?

          #!/bin/sh

          cd /root/bin

          case "$1" in

          ? start)? ? ? ? ?
          ? ? ? ? ? ? ? ? nohup /usr/local/jdk1.5.0_05/bin/java -client IPBanner > ban.log2>&1 &
          ? ? ? ? ? ? ? ? echo $! > ban.pid
          ? ? ? ? ;;

          ? stop)
          ? ? ? ? kill `cat ban.pid`
          ? ? ? ? rm -rf ban.pid
          ? ? ? ? ;;

          ? restart)
          ? ? ? ? ? ? ? ? ? $0 stop
          ? ? ? ? ? ? ? ? ? sleep 1
          ? ? ? ? ? ? ? ? ? $0 start
          ? ? ? ? ? ? ? ? ? ;;
          ?
          ? *)
          ? ? ? ? ? ? ? ? ? echo "Usage: ban.sh{start|stop|restart}"
          ? ? ? ? ? ? ? ? ? ;;
          ?
          esac

          exit 0
          posted on 2006-06-12 22:04 爪哇之家 閱讀(3581) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): linux

          評(píng)論

          # re: 簡(jiǎn)單的JAVA防火墻 2009-01-31 18:49 heyang
          加點(diǎn)中文說(shuō)明就好了!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 新泰市| 墨江| 安西县| 波密县| 涞水县| 屏山县| 海城市| 德阳市| 黑龙江省| 广河县| 商河县| 丰顺县| 桃园县| 军事| 建平县| 永泰县| 潞城市| 哈尔滨市| 南昌市| 图们市| 双辽市| 文安县| 洞头县| 阿鲁科尔沁旗| 白水县| 太康县| 武平县| 剑川县| 岳池县| 开化县| 昌宁县| 浙江省| 开远市| 四平市| 肥城市| 通山县| 双柏县| 云林县| 漾濞| 类乌齐县| 宁波市|