cat /usr/lib/systemd/system/eisc-anfang.service [Unit] # 服务描述 Description=eisc anfang # 在网络初始化之后启动 #After=network.target remote-fs.target nss-lookup.target After=auditd.service systemd-user-sessions.service time-sync.target [Service] #Type=forking # 保留一个守护进程,持续运行,会报错,不加这个参数。 #PrivateTmp=true # 工作目录 WoringDirectory=/eisc/anfang # 启动命令 ExecStart=/eisc/anfang/ip.sh RestartSec=30s # 重启服务, 无效, # 需要在脚本里面自己加 无限循环,保持运行生命 [Install] # 当系统以多用户方式启动时,这个服务需要被自动运行 WantedBy=multi-user.target nano /eisc/anfang/ip.sh #!/bin/bash # 小绿叶技术博客扫段攻击拦截系统 #抓包监控tcp攻击ip进行拦截。 zhuabao(){ echo "eisc 安防系统启动扫描,时间 :" `date +%Y-%m-%d-%H:%M:%y` >> /root/eisc-anfang.txt # 将firewalld 防火墙加入开机启动 folder="/anfang/ip" mkdir -p $folder # 抓包等待30s 杀掉进程,符号 & 并列执行 zdyljs=1800 timetcp=300 tcpdump -nn > $folder/ipfwyuan.txt & sleep $timetcp ; killall -9 tcpdump ; sleep 3 echo "访问限制tcp连接数;$zdyljs 抓包时长为 $timetcp" rm -rf $folder/ipfw.txt cat $folder/ipfwyuan.txt | awk -F" " '{print $3}' | awk -F"." '{print $1 "." $2 "." $3 "." $4}' |sort | uniq -c > $folder/ipfw.txt #sed -nr 's/(^|.*[^0-9])(([0-9]+\.){3}[0-9]+).*/\2/p' $folder/ipfwyuan.txt |sort | uniq -c > $folder/ipfw.txt #筛选出日志的ip 记录 #sed -i "s/\[/ /g" $folder/ipfw.txt;sed -i "s/\]/ /g" $folder/ipfw.txt ; sed -i "s/>/ /g" $folder/ipfw.txt ; sed -i '/[a-zA-Z]/d' $folder/ipfw.txt ; #sed -i '/.../d' $folder/ipfw.txt ; sed -i '/:/d' $folder/ipfw.txt ; sed -i "/^$/d" $folder/ipfw.txt # 清除文件特殊字符和空格 sed -i "/^$/d" $folder/ipfw.txt cat $folder/ipfw.txt #-------------------------------- 防火墙 ------------------------------------------# echo "查询数据库白名单:" mysql -h 10.111.111.2 -uenchantment -peisccn -e "use enchantment;select * from setip" mysql -h 10.111.111.2 -uenchantment -peisccn@eisc -e "use enchantment;select * from setip" > /anfang/ip/bmd-ip.txt #查询数据库白名单,脚本每次执行查询一次数据库 #---------- 白名单:判断是否拦截 -------# } # zhuabao bmd(){ file="/anfang/ip/bmd-ip.txt" # 白名单文件 pd=`cat $file | awk -F" " '{print $3}' | grep $ip` # 白名单文件打印第三列为ip地址 # 没有数据库可以删除查询数据库,可以直接写入 if [ ${#pd} -lt 7 ] # ${#} 符号标识字符串长度 then echo "查询匹配 ip: $ip 的长度小于7 没有白名单,将被禁止访问 " else echo "ip: $ip 不小于7查询到数据有白名单,ip 不会被拦截" ip="" fi } #安全防火墙拦截规则执行firewalld firewalldjz(){ iptables -I INPUT -s $ip -j DROP } #------------ ip 白名单:被封禁后解除限制 ------------# bmdIP(){ # 小绿叶结界-解除ip限制,由ip白名单库放行 ip=(`cat /anfang/ip/bmd-ip.txt | awk -F" " '{print $3}' `) for((i>0;i<${#ip[*]};i++)) do ip=${ip[$i] } ipd=$(echo $ip | awk -F"." '{print $1 "." $2 "." $3 "." "0/24"}') echo "解除ip:$ip 解除ip网段:$ipd" ID=`iptables -L -n --line-number | grep $ip | awk -F" " '{print $1}'` ; echo "ID : $ID ip: $ip 将被解除限制访问" && iptables -D INPUT $ID ID=`iptables -L -n --line-number | grep $ipd | awk -F" " '{print $1}'` ; echo "ID : $ID ipd: $ipd 将被解除限制访问" && iptables -D INPUT $ID iptables -I INPUT -s $ip -p TCP --dport 1:65535 -j ACCEPT done } #--------- 安防监控异常 ip ---------# anfangip(){ NR=$(cat $folder/ipfw.txt | wc -l); echo $NR ipfw=(`cat $folder/ipfw.txt | awk -F" " '{print $2}'`) ; echo $ipfw for((i=0;i<$NR;i++)) do ljs=`cat $folder/ipfw.txt | grep ${ipfw[$i]} | awk -F" " '{print $1}'` ; echo "${ipfw[$i]} 连接数为: $ljs" if [ $ljs -gt $zdyljs ] then ip=${ipfw[$i]} iphc=$ip bmd firewalldjz if [ ${#ip} -lt 7 ] then echo `date +%Y-%m-%d-%H:%M:%y` " $iphc 存在白名单, 连接次数:$ljs " >> $folder/jinzhiip.txt else echo `date +%Y-%m-%d-%H:%M:%y` "$ip 连接数为: $ljs 超过法制:$zdyljs 连接数" >> $folder/jinzhiip.txt fi fi done } #anfangip #--------- 安防日志文件 ---------# filelog(){ cat $folder/ipfw.txt >> $folder/rizhi.txt echo `date` >> $folder/rizhi.txt # 实时监控日志ipfw.txt存入长期保存ip地址库 rizhi.txt # cat $folder/rizhi.txt > /root/rizhi.txt } filelog # #--------- 安防监控异常 ip 网段 ---------# anfangipd(){ cat /dev/null > $folder/saoduanrun.txt # 情况实时计算网段库,重新计量记录 cat $folder/ipfwyuan.txt| awk -F" " '{print $3}' | awk -F"." '{print $1 "." $2 "." $3}' |sort | uniq -c > $folder/saoduanrun.txt ; echo "--------- 获得实时日志 saoduanrun.txt 开始判断 -------------- " cat $folder/saoduanrun.txt >> $folder/saoduan.txt ; cat $folder/saoduan.txt > /root/saoduan.txt # 获得网段:实时日志 rizhi.txt 过滤ip段; 存入实时 saoduanrun.txt 扫段日志 ; 扫段日志长期保留ip网段库 saoduan.txt wdk=(`cat $folder/saoduanrun.txt | awk -F" " '{print $2 }'`) # 定义ip段数组:打印第二列为ip NR=${#wdk[*]} # 数组的所有个数为个数 for((i=0;i<$NR;i++)) do wdsa=`cat $folder/saoduanrun.txt | grep ${wdk[$i]} | awk -F" " '{print $1}'` # 查看文本,过滤ip,打印第一列为 并发数量 ip=${wdk[$i]} if [ $wdsa -gt $zdyljs ] then bmd ip=`echo "$ip.0/24"` iphc=$ip firewalldjz if [ $ip -lt 7 ] then echo `date +%Y-%m-%d-%H:%M:%y` "存在白名单:$iphc 连接次数:$wdsa " >> $folder/saoduan.txt else echo `date +%Y-%m-%d-%H:%M:%y` "禁止访问: $ip 网段连接数为: $wdsa 超过法制:$zdyljs 连接数 " >> $folder/saoduan.txt fi else echo "$ip.0/24 没有违反规定并发:$zdyljs ,不进行限制 当前并发: $wdsa " fi done } # anfangipd && bmdIP ; iptables -L -n --line-number | grep DROP # 拦截ip 与 ip 白名单解除限制 # export eisc # 全局变量 eisc # set unset eisc # 取消全局变量 eisc # /etc/profile ~/bashrc 环境变量 #您在 /var/spool/mail/root 中有邮件 function main(){ while : do zhuabao && anfangip && anfangipd && bmdIP && iptables -L -n --line-number | grep DROP sleep 3 # 由于tcpdump 抓包,会占用5分钟,抓完流程走完,在受到循环流程,持续运行 done echo `date` "程序已经间隔 360 秒,继续运行" echo `date` "程序已经间隔 360 秒,继续运行" >> /root/eisc-anfang.txt } main