`

防火墙

阅读更多
2006-06-12

http://forum.iteye.com/viewtopic.php?t=20177&postdays=0&postorder=asc&start=15

防火墙

不是什么防火墙,其实就是用Java写了一个脚本,定期扫描netstat状态,检测80端口的连接IP数量和状态,当超过一个阀值,就调用iptables ban掉它,30分钟之后才解除封锁。其实这种脚本用perl/python/ruby去写可能更好,但是我比较熟悉Java,就用Java写了一个,主要是为了解决对网站的恶意访问的,例如使用webzip之类工具抓网站,非IP伪装类的DOS攻击,都有比较好的效果。当然有时候也会误杀一些IP(例如公司里面很多人访问javaeye,都喜欢一下点开很多页面导致超过阀值)。

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
 * 
 */
public class IPBanner {

	public static final String NETSTAT = "netstat -nt";

	public static final String IP_INSERT = "iptables -I INPUT -i eth0 -j DROP -p tcp --dport 80 -s ";

	public static final String IP_DEL = "iptables -D INPUT -i eth0 -j DROP -p tcp --dport 80 -s ";

	public static final String HOST_IP = "61.129.70.239:80";

	public static final long BAN_TIMEOUT = 30 * 60 * 1000L;

	public static final long BAN_INTERVAL = 30 * 1000L;

	public static final int CONCURRENT = 80;

	public static final int SYN_CONCURRENT = 8;

	public static final Map banMap = new HashMap();

	
	public static void ban() throws Exception {

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

		List expiredIPList = new ArrayList();
		
		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, new Long(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);
		}
	}

	public static Set dynamicBanIP() throws Exception {
		String ipstat = null;
		Set banList = new HashSet();
		List ipList = new ArrayList();
		List countList = new ArrayList();
		List synCountList = new ArrayList();
		List finCountList = new ArrayList();

		Runtime runtime = Runtime.getRuntime();
		Process process = runtime.exec(NETSTAT);
		InputStream input = process.getInputStream();
		InputStreamReader inputReader = new InputStreamReader(input);
		BufferedReader reader = new BufferedReader(inputReader);
		reader.readLine();
		reader.readLine();
		while ((ipstat = reader.readLine()) != null) {
			StringTokenizer token = new StringTokenizer(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(new Integer(1));
						if ("SYN_RECV".equals(status)) {
							synCountList.add(new Integer(1));
						} else {
							synCountList.add(new Integer(0));
						}
						if ("FIN_WAIT1".equals(status)) {
							finCountList.add(new Integer(1));
						} else {
							finCountList.add(new Integer(0));
						}
					} else {
						int index = ipList.indexOf(ip);
						countList.set(index, new Integer(((Integer) countList.get(index)).intValue() + 1));
						if ("SYN_RECV".equals(status)) {
							synCountList.set(index, new Integer(((Integer) synCountList.get(index)).intValue() + 1));
						}
						if ("FIN_WAIT1".equals(status)) {
							finCountList.set(index, new Integer(((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;
	}

	public static void main(String[] args) throws Exception {
		while (true) {
			ban();
			Thread.sleep(BAN_INTERVAL);
		}
	}
}



控制服务的脚本ban.sh

#!/bin/sh

cd /root/bin

case "$1" in 

  start)         
		nohup /usr/local/jdk1.5.0_05/bin/java -client IPBanner > ban.log 2>&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 
分享到:
评论

相关推荐

    天融信防火墙安装调试配置演示(上)

    天融信防火墙安装调试配置演示(上)的内容包括: 天融信防火墙4000在线升级 如何查询防火墙4000的版本信息 如何配置防火墙4000http过滤规则 如何配置防火墙4000ip规则(ftp only) 如何配置防火墙4000长连接配置 如何...

    天融信防火墙NGFW4000快速配置手册

    天融信防火墙NGFW4000快速配置手册 本手册介绍了天融信防火墙NGFW4000的快速配置方法,涵盖了防火墙的五种管理方式:串口管理、TELNET管理、SSH管理、WEB管理和GUI管理。每种管理方式都提供了详细的步骤和配置参数...

    防火墙技术防火墙原理

     防火墙原理  防火墙主要技术  防火墙体系结构  堡垒主机的作用及部署 数据包过滤规则  状态检测数据包过滤原理 防火墙原理 .1 防火墙的概念 防火墙的功能 边界保护机制 潜在的攻击和可能的对象 4 互操作...

    彩影arp防火墙 6.0.2 单机版 破解版

    彩影arp防火墙 特色功能: 1.ARP病毒专杀,发现本机有对外攻击行为时,自动定位本机所感染的恶意程序。 2.拦截外部ARP攻击,在系统内核层拦截接收到的虚假ARP数据包,保障本机ARP缓存表的正确性。 3.拦截对外ARP攻击...

    Checkpoint防火墙命令行维护手册.pdf

    Checkpoint 防火墙命令行维护手册 Checkpoint 防火墙命令行维护手册是关于Checkpoint 防火墙的命令行维护指南,旨在帮助管理员快速掌握Checkpoint 防火墙的基本配置、系统状态查看、路由管理等知识点。 基本配置...

    防火墙安全策略巡检报告.pdf

    防火墙安全策略巡检报告 防火墙安全策略巡检报告是信息安全中的重要组成部分,该报告旨在对防火墙的安全策略进行评估和分析,以确保防火墙的安全策略符合信息安全的要求。下面是该报告的详细知识点: 第一章 概述 ...

    包过滤主机防火墙技术的研究

    由于传统的内部防火墙信任内网防御外网,在制定安全策略 的时候会针对内部网络和外部网络确定不同的过滤规则。而近些 年,来自内部网络的攻击数量明显增加,边界防火墙却无法抵御 这种攻击,因而主机防火墙显得非常...

    明御WEB应用防火墙-用户操作手册V3.0.4.3.3.doc

    "明御WEB应用防火墙用户操作手册V3.0.4.3.3" 知识点: 1. 明御WEB应用防火墙简介 明御WEB应用防火墙(简称:WAF,WEB Application Firewall)是安恒信息结合多年应用安全的攻防理论和应急响应实践经验积累的基础上...

    等级保护测评-出口防火墙安全策略检查及加固建议.pdf

    等级保护测评-出口防火墙安全策略检查及加固建议.pdf等级保护测评-出口防火墙安全策略检查及加固建议.pdf等级保护测评-出口防火墙安全策略检查及加固建议.pdf等级保护测评-出口防火墙安全策略检查及加固建议.pdf等级...

    cisco防火墙配置SNMP

    cisco防火墙配置SNMPcisco防火墙配置SNMPcisco防火墙配置SNMPcisco防火墙配置SNMPcisco防火墙配置SNMPcisco防火墙配置SNMPcisco防火墙配置SNMP

    Juniper SRX 系列防火墙配置管理手册 资料汇总

    Juniper SRX 系列防火墙配置管理手册 资料汇总: Juniper SRX Branch系列防火墙配置管理手册.pdf Juniper_SRX3600_产品配置维护培训.pdf Juniper_SRX低端系列防火墙配置手册.pdf Juniper_SRX基本配置手册.pdf ...

    神州数码防火墙解决方案

    DCFW-1800是典型的多功能防火墙,涵盖了防火墙的技术和特性,具有防止黑客攻击的能力。用户根据其网络应用的需求和安全级别的要求(如网络层安全或应用层安全,可以灵活选择包过滤或应用代理等)选择功能特性。

    选择商业化防火墙需要参考的性能指标

    吞吐量测试用来确定防火墙在接收和发送数据包而没有丢失情况下的最大数据传输速率,是测试防火墙在正常工作时的数据传输处理能力,是其它指标的基础。它反映的是防火墙的数据包转发能力。因为数据流中一帧的丢失会...

    迪普防火墙FW1000-MA-N调试文档—20180823.docx

    迪普FW1000-MA-N防火墙,该型号防火墙前面板共有8个以太网口,以太网口0~6一般做为业务口,7口做为以太网配置口,CONSOLE口为串口调试口,CONSOLE口需要通过串口线和超级终端进行调试,当以太网配置口的ip被修改或者...

    防火墙在网络安全中的功能和作用

    目前防火墙已经在Internet上得到了广泛的应用,而且由于防火墙不限于TCP/IP协议的特点,也使其逐步在Internet之外更具生命力。客观的讲,防火墙并不是解决网络安全问题的万能药方,而只是网络安全政策和策略中的一个...

    防火墙基础配置1_ensp防火墙配置_ensp华为防火墙配置_

    这是我自己制作的关于ensp防火墙的基本配置文件

    防火墙源码.rar_firewall_windows防火墙_包过滤_源码_防火墙源代码

    一个防火墙的源码,比较适合学习包过滤

    防火墙技术指南.pdf

    防火墙技术指南.pdf 防火墙技术指南 防火墙技术指南

    防火墙相关知识讲解图示

    用图解的形式,生动的讲解了以下几点: 防火墙是保证网络安全的一种... 从工作原理角度看,防火墙主要可以分为网络层防火墙和应用层防火墙。 防火墙产品固有的安全脆弱点和管理配置上的不当使防火墙有“隙”可寻。

    网络防火墙 设计源码

    网络防火墙就是一个位于计算机和它所连接的网络之间的软件。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还...

Global site tag (gtag.js) - Google Analytics