存档在 2016年2月

怎样在CentOS上使用iptables自动封IP

2016年2月26日

linux上用iptables自动封ip的bash脚本,这个还是有一定效果的。

CentOS 内置了一个非常强劲的防火墙,统称为 iptables,但更正确的名称是 iptables/netfilter。iptables 是一个用户空间的模块。作为用户,你在命令行就是通过它将防火墙规则放进缺省的表里。netfilter 是一个核心模块,它内置于内核中,进行实际的过滤。iptables 有很多前端图像界面可以让用户新增或定义规则,但它们很多时不及使用命令行般有灵活性,而且限制用户了解实际发生的事情。

参考资料:《linux上用iptables自动封ip的bash脚本》
参考资料:《在 Redhat / CentOS Linux 中安装 iptables 防火墙》
参考资料:《linux下IPTABLES配置详解》
参考资料:《IPTables》

1. 安先装iptables

2. 下面的脚本保存为drop_ips.sh

#!/bin/bash                        
     
    ###########################################
    # 封锁ip 用iptables                 
    # usage:                            
    # 
    # create date 2010-11-11            
    # update date 2010-11-12            
    ###########################################
     
     
    # 定义端口                          
    CHK_PORT="80 25" 
     
    # 定义输出文件                      
    IPTABLE_OUTPUT=/tmp/ip_drop_tables  
    # 定义输出文件备份  
    IPTABLE_OUTPUT_BAK=/tmp/ip_drop_tables.bak  
     
    # 扫描ip的 间隔时间  
    SCAN_HTTP_IP_TIMEOUT=20  
     
    # 处理ip的间隔时间  
    HANDLE_IP_TIMEOUT=120  
     
    # 连接数量最大限制  
    MAX_CONNECT_IP_NUM=100  
     
    # 排除在外的ip  
    ACCEPT_IP="203.95.110.2" 
     
    # 已经封锁的ip   
    DROP_IP_RECORD_FILE=/tmp/drop_ip_record  
     
    #################################################################  
    #定义方法  
    #################################################################  
    # 输出ip到文件  
    output_ip_table()  
    {  
            # 拿到端口号  
            port_num=$1  
            # 查此端口上的连接ip 输出到指定的目录  
            #echo "start scan ......"  
            netstat -na --tcp| grep ESTABLISHED | awk '{ if ( index($4,":"'"$port_num"'"") ) print $5}' | awk -F ':' '{print $1}' | sort  >> $IPTABLE_OUTPUT  
            #echo "scan end ......"  
    }  
     
     
    # 把需要观测端口列出                                 
    check_port()  
    {  
            for port_td in $CHK_PORT  
            do 
            # echo "port : "$port_td  
                # 扫描此端口  
            output_ip_table $port_td  
        done  
    }  
     
     
    # 封杀ip  
    drop_ip_from_table()  
    {  
        iptables -I INPUT -s "$1" -j DROP  
    }  
     
    # 排除ip  
    accept_ip()  
    {  
        for access_ip in $ACCEPT_IP  
        do 
            iptables -I INPUT -s "$access_ip" -j ACCEPT  
        done  
    }  
     
    # 提取需要的ip  
    get_iptable()  
    {  
        # 如果已经存在就删除  
        if [ -e $IPTABLE_OUTPUT_BAK ] ; then  
            rm -rf $IPTABLE_OUTPUT_BAK  
        fi  
        # copy 一份出去   
        cp $IPTABLE_OUTPUT $IPTABLE_OUTPUT_BAK  
        # 排序 数组  
        declare -a ip_array_org=($(cat ${IPTABLE_OUTPUT_BAK} | sort))  
        # 循环  
        # 比对用的ip 初始化  
        tmp_ip=0.0.0.0  
        let "tmp_ip_count=1" 
        for tmp_element in "${ip_array_org[@]}" 
        do            
            # 初始化 没有特殊设置为排除ip  
            is_not_set_accept="true" 
            # 初始化 是否已封杀了  
            is_not_drop="true" 
            # 如果相等  
            if [ "$tmp_ip" = "$tmp_element" ] ; then   
                let "tmp_ip_count+=1" 
            else              
                # 打印  
                echo "ip: $tmp_ip count: $tmp_ip_count"   
                # 如果大于某个数字 就封杀  
                if (( $tmp_ip_count >= $MAX_CONNECT_IP_NUM )) ; then  
                    # 如果没有记录就封杀  
                    if  cat /tmp/drop_ip_record | grep "$tmp_ip" > /dev/null   ; then  
                        echo "this ip $tmp_ip has been mask !" 
                        is_not_drop="false" 
                    else      
                        # 循环 需要排除ip  
                            for tmp_access_ip in $ACCEPT_IP  
                        do 
                            # 如果排除ip里有 就去封锁此ip  
                            if [ "$tmp_access_ip" = "$tmp_ip" ] ; then   
                                echo "this ip $tmp_ip was mark to accept !" 
                                is_not_set_accept="false" 
                            fi  
                        done   
                    fi  
                    if [ $is_not_set_accept = "true" ] && [ $is_not_drop = "true"] ; then  
                        echo "add a new ip to drop : $tmp_ip" 
                        drop_ip_from_table $tmp_ip  
                        # 记录ip  
                        echo "$tmp_ip" >> $DROP_IP_RECORD_FILE  
                    fi  
                fi  
                # 归零  
                let "tmp_ip_count=1" 
                tmp_ip=$tmp_element  
            fi  
        done  
        # 全部处理完了 删除原件  
        rm -rf $IPTABLE_OUTPUT  
        # 排除ip  
        # accept_ip  
          
    }  
     
    # 扫描ip  
    scan_http_access_ip()  
    {  
        # 获取当前时间作为开始时间  
        start_time=`date +%s`  
            # 循环开始    
        while true 
        do 
            # 开始检查 扫描ip  
            check_port  
            # 线程停止  
            sleep $SCAN_HTTP_IP_TIMEOUT  
            # 获取当前时间  
            cur_time=`date +%s`  
            # 时间差  
            let "time_out=$cur_time-$start_time" 
            echo "time_out : "$time_out  
            # 超过2分钟  
            if (( $time_out >= $HANDLE_IP_TIMEOUT )) ; then  
                # 整理一次ip表  
                echo " times up"              
                get_iptable           
                # 重置开始时间  
                start_time=`date +%s`  
            fi  
        done      
    }  
     
    # 程序执行入口  
    main_app()  
    {  
        # 定时扫描ip  
        scan_http_access_ip  
    }  
     
    main_app 

然后执行下面的脚本,让其自动在后台运行

sh ~/scripts/drop_ips.sh &

源码: Proxy List

2016年2月26日

题目:某些WHOIS服务器对于未授权IP的访问次数是有限制的,因此,需要一个代理功能,在一个代理IP池中轮换IP去轮询WHOIS服务器。

同类:Tiny Domain Monitor – Automatic Domain Monitoring Script 中有代理的设想,但是没有付诸开发。

http://tinymonitor.com/domain-monitor

源码:

PHPProxy

官网:https://bitbucket.org/arkadi/phpproxy
介绍:http://blog.goyiyo.com/archives/756

PHPProxy能将一个PHP空间变成一台代理服务器,避免域名劫持和IP禁止,如果有SSL还能绕过它的关键词审查。

ProxyList

介绍:早先找到的代理列表管理程序

Glype Proxy

下载:https://www.glype.com/download.php
介绍:可以通过服务器访问远程网址

FreeSSH

介绍:http://blog.mcncc.com/show-103-1
下载:http://blog.mcncc.com/attachment.php?id=30

如何解决Destoon发布时产生的em标签

2016年2月26日

参考资料:http://www.roysen.com/news/show-7
参考资料:http://www.roysen.com/news/show-8

解决方案:

在Destoon安装目录/include/safe.func.php 第20行 找到:

function dsafe($string) {
	if(is_array($string)) {
		return array_map('dsafe', $string);
	} else {
		$string = preg_replace("/\<\!\-\-([\s\S]*?)\-\-\>/", "", $string);
		$string = preg_replace("/\/\*([\s\S]*?)\*\//", "", $string);
		$string = preg_replace("/&#([a-z0-9]+)([;]*)/i", "", $string);
		if(preg_match("/&#([a-z0-9]+)([;]*)/i", $string)) return nl2br(strip_tags($string));
		$match = array("/s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t/i","/d[\s]*a[\s]*t[\s]*a[\s]*\:/i","/b[\s]*a[\s]*s[\s]*e/i","/e[\\\]*x[\\\]*p[\\\]*r[\\\]*e[\\\]*s[\\\]*s[\\\]*i[\\\]*o[\\\]*n/i","/i[\\\]*m[\\\]*p[\\\]*o[\\\]*r[\\\]*t/i","/on([a-z]{2,})([\(|\=|\s]+)/i","/about/i","/frame/i","/link/i","/meta/i","/textarea/i","/eval/i","/alert/i","/confirm/i","/prompt/i","/cookie/i","/document/i","/newline/i","/colon/i","/<style/i","/\\\x/i");
		$replace = array("s<em></em>cript","da<em></em>ta:","ba<em></em>se","ex<em></em>pression","im<em></em>port","o<em></em>n\\1\\2","a<em></em>bout","f<em></em>rame","l<em></em>ink","me<em></em>ta","text<em></em>area","e<em></em>val","a<em></em>lert","/con<em></em>firm/i","prom<em></em>pt","coo<em></em>kie","docu<em></em>ment","new<em></em>line","co<em></em>lon","<sty1e","\<em></em>x");
		return preg_replace($match, $replace, $string);
	}
}

根据需求增删检测字符串,比如把

f<em></em>rame

改为

frame

即可不会自动添加em标签。

怎样注册.CI域名

2016年2月24日

.CI 域名可以用来做双拼类的Domain Hack。

价格:

怎样使用logrotate对Apache进行日志切割

2016年2月18日

CentOS中编译安装Apache默认日志是不切割的,可以使用工具Cronnolog进行日志切割。

使用logrotate指令,可让你轻松管理系统所产生的记录文件。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc目录下,文件名称为logrotate.conf。

参考资料:http://blog.csdn.net/cjwid/article/details/1690101
参考资料:http://baike.baidu.com/view/4811958.htm
参考资料:https://linuxconfig.org/logrotate

语法:

logrotate [-?dfv][-s <状态文件>][--usage][配置文件]

参数:

-?或–help  在线帮助。
-d或–debug  详细显示指令执行过程,便于排错或了解程序执行的情况。
-f或–force  强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
-s< 状态文件>或–state=< 状态文件>  使用指定的状态文件。
-v或–version  显示指令执行过程。
-usage  显示指令基本用法。

日志文件的管理:
1、logrotate 配置
2、缺省配置 logrotate
3、使用include 选项读取其他配置文件
4、使用include 选项覆盖缺省配置
5、为指定的文件配置转储参数
一、logrotate 配置

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
二、缺省配置 logrotate

logrotate 缺省的配置募?/etc/logrotate.conf。
Red Hat Linux 缺省安装的文件内容是:

# see “man logrotate” for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# send errors to root
errors root
# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress
1
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp –we’ll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

/var/log/lastlog {
monthly
rotate 1
}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第三行weekly 指定所有的日志文件每周转储一次。
第五行 rotate 4 指定转储文件的保留 4份。
第七行 errors root 指定错误信息发送给root。
第九行create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和
原来的文件一样的权限。
第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件
include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个
主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。

典型的应用有:apache, linuxconf, samba, cron 以及syslog。

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。

四、使用include 选项覆盖缺省配置

当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数
/var/log/htmlaccess.log
{ errors jim
notifempty
nocompress
weekly
prerotate
/usr/bin/chattr -a /var/log/htmlaccess.log
endscript
postrotate
/usr/bin/chattr +a /var/log/htmlaccess.log
endscript
}
/var/log/netconf.log
{ nocompress
monthly
}

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。

Notifempty
errors jim

五、为指定的文件配置转储参数
经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释
/full/path/to/file
{
option(s)
}

下面的例子就是每月转储 /var/log/wtmp 一次:
#Use logrotate to rotate wtmp
/var/log/wtmp
{
monthly
rotate 1
}

六、其他需要注意的问题

1、尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

2、使用 prerotate 和 postrotate 选项
下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对
/var/log/messages 有效。

/var/log/messages
{
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
postrotate
/usr/bin/kill -HUP syslogd
/usr/bin/chattr +a /var/log/messages
endscript
}

第一行指定脚本对 /var/log messages 有效
花括号外的/var/log messages

prerotate 命令指定转储以前的动作/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性 endscript 结束 prerotate 部分的脚本postrotate 指定转储后的动作

/usr/bin/killall -HUP syslogd

用来重新初始化系统日志守护程序 syslogd

/usr/bin/chattr +a /var/log/messages

重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。

最后的 endscript 用于结束 postrotate 部分的脚本

3、logrotate 的运行分为三步:

判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。

#/etc/cron.daily/logrotate
#! /bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

4、/var/log/messages 不能产生的原因:
这种情况很少见,但是如果你把/etc/services 中的 514/UDP 端口关掉的话,这个文件就不能产生了。

小结:本文通过对Red Hat 系统上典型的logrotate 配置例子的介绍,详细说明了logrotate 程序的应用方法。希望对所有Linux 系统管理员有所帮助。管理好,分析好日志文件是系统安全的第一步,在以后的文章里FreeLAMP还会介绍另外一个检查日志的好东东 logcheck。