爪哇之家

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            35 隨筆 :: 29 文章 :: 8 評論 :: 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);
          ? ? ? ? ? ? ? ? }
          ? ? ? ? }
          }

          控制服務的腳本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) 評論(1)  編輯  收藏 所屬分類: linux

          評論

          # re: 簡單的JAVA防火墻 2009-01-31 18:49 heyang
          加點中文說明就好了!  回復  更多評論
            

          主站蜘蛛池模板: 金寨县| 铜鼓县| 淄博市| 静海县| 繁峙县| 同仁县| 东丽区| 东乡县| 武定县| 开鲁县| 丰镇市| 大安市| 海盐县| 呼伦贝尔市| 平昌县| 龙口市| 白沙| 独山县| 温宿县| 自治县| 罗平县| 邵武市| 东乌| 潍坊市| 房产| 福清市| 云林县| 蒙阴县| 南开区| 黄浦区| 峨眉山市| 余干县| 壤塘县| 沙湾县| 漠河县| 崇州市| 台北县| 高平市| 邵阳市| 茶陵县| 凌云县|