首页 > 其他分享 >遇到CC攻击你会怎么做

遇到CC攻击你会怎么做

时间:2023-04-14 10:14:09浏览次数:21  
标签:iptables 遇到 CC ip 攻击 awk IP INPUT txt

在我的运维生涯里,出现最普遍的问题就是网站访问慢甚至访问不到,到服务器上查看后得出的结论是,这个网站被CC攻击了。有的朋友可能不知道什么叫CC攻击,在这里我简单介绍一下。CC攻击属于DDos攻击的一种,攻击者会利用大量“肉鸡”对攻击目标网站发起请求,并且频率很快,这样会导致目标网站的服务器承受不住而瘫痪。CC攻击虽然看起来跟正常的访问几乎没有什么区别,但如果我们仔细分析访问日志还是可以找到一些线索,比如某个IP访问频次很高,或者某几个IP的user_agent是固定的等等特性,有的甚至会去模仿正规的搜索引擎,比如,把自己伪装为百度的“蜘蛛爬虫”。当遇到CC攻击时,只要你肯花费一些精力来分析访问日志,终究是可以找出发起CC攻击的真凶,然后我们只要封掉它们的IP就万事大吉了。本案例的需求是这样的:1)每分钟分析一次访问日志/data/logs/access_log,日志片段如下:

180.98.113.151 - [19/Sep/2018:09:30:07 +0800]  "/uc_server/avatar.php?uid=1145811&size=middle" 301 "GET  HTTP/1.1" "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13D15 MAGAPPX|4.1.2-4.1.0-41|iPhone OS 9.2.1 iPhone 6|wenyou|C6C25422-279C-4337-8E10-F588D577B9D7|da97ede5be797f79b96d6761bf858632|426ef86c3fc2359dc90468f7bdd0f5e9|c64f2225ec641231cd612bbe08f2b40d" 61.227.224.229 - [19/Sep/2018:09:30:07 +0800]  "/misc.php?mod=ranklist&type=member&view=post" 200 "GET  HTTP/1.1" "http://www.wenyou.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0" 183.207.95.145  [19/Sep/2018:09:30:07 +0800]  "/uc_server/avatar.php?uid=1323875&size=middle" 301 "GET  HTTP/1.1" "http://app.yikaidai.com/mag/circle/v1/forum/threadViewPage?tid=3446714&circle_id=&themecolor=1aadfa" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_3 like Mac OS X) AppleWebKit/604.1.38 "114.230.251.50 - [19/Sep/2018:09:30:07 +0800]  "/core/attachment/attachment/img?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg" 302 "GET HTTP/1.1" "https://app.yikai.com/mag/info/v1/info/infoView?id=55855&themecolor=1aadfa" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) "61.227.224.229 - [19/Sep/2018:09:30:07 +0800]  "/misc.php?mod=ranklist&type=member&view=onlinetime" 200 "GET HTTP/1.1" "http://www.wenyou.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0" 
2)把访问量高于100的IP给封掉3)封过的IP都要记录到一个日志中4)每隔30分钟检查一次被封的IP,把没有访问量或者访问量很少的IP解封5)解封的IP记录到另外一个日志中知识点一:awk用法在shell脚本中,awk出现概率是极高的,因为它在处理字符串上有很强的能力。先来看一个小例子:
# awk -F ':' '$3>500 {print $1,$3}' /etc/passwdsystemd-bus-proxy 999polkitd 998chrony 997user1 1000
说明:awk最核心的功能是分段,可以用-F选项指定一个分隔符,然后针对某一段字符进行处理,本例中用':'作为分隔符,去找第3段大于500的行,然后把第1段和第3段打印出来。在awk中可以使用>, <, >=, <=, ==, !=等逻辑判断的符号,这和shell是有差异的。本例中>后面的500一定不要加双引号,否则它就不以数字作为比较对象了,而是把500当成是字符串,结果自然就不一样了。如下:
# awk -F ':' '$3>"500" {print $1,$3}' /etc/passwdshutdown 6halt 7mail 8nobody 99systemd-bus-proxy 999dbus 81polkitd 998tss 59postfix 89sshd 74chrony 997

awk的功能不止于此,它实际上跟shell一样属于一门脚本语言,可以写脚本。它的作者设计它的初衷是为了去格式化输出文本,它可以满足各种复杂的格式需求,不过我们平时写shell脚本时,仅仅把它作为一个命令来处理字符串,下面我列几个常见的用法(以下所有演示文件都使用1.txt)。

1)截取指定段

# awk -F ':|#' '{print $2}' 1.txt

说明:分隔符可以是一个正则表达式,本例中的分隔符可以是':'也可以是'#'。

2)匹配字符后字符串

# awk -F ':' '$1 ~ "abc"' 1.txt
说明:过滤出第一段包含abc的行,其中这里的abc可以是一个正则表达式,例如:
# awk -F ':' '$1 ~ "^ro+"' 1.txt

说明:^表示开头,+表示+前面的字符至少有1个,所以"^ro+"可以匹配的字符串有:ro, roo, rooo...

3)多个语句同时使用

# awk -F ':' '$1 ~ "root" {print $1,$3}; $3>100 {print $1,$2}' 1.txt
4)多个条件
# awk '$3<100 && $7 ~ "bash" {print $0}'  1.txt

说明:如果不指定分隔符,则以空白字符作为分割符,在awk中可以用&&表示并且,用||表示或者。$0会输出整行。

5)内置变量

# awk -F ':' '{print NF,NR}' 1.txt

说明:NF为段数,NR为行数

6)数学运算

# awk -F ':' '$7=$3+$4 {print $0}' 1.txt
因为$7的值被重新定义了,所以打印$0时,并不会包含分隔符,当然也可以定义分隔符:
# awk -F ':' -v OFS='#' '$7=$3+$4 {print $0}' 1.txt
说明:用-v定义变量,这个OFS也是一个内置变量,它表示输出的结果的分隔符。计算某一段的总和,这种用法也比较常见,例如:
# awk -F ':' '{(tot=tot+$3)}; END {print tot}' 1.txt
知识点二:sort排序语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2-t 分隔符 :作用跟cut的-d一个意思-n :使用纯数字排序-r :反向排序-u :去重复-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序如果sort不加任何选项,则从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出,如下:
# head -n5 /etc/passwd |sortadm:x:3:4:adm:/var/adm:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinroot:x:0:0:root:/root:/bin/bash
-t 后面跟分隔符,-k后面跟数字,表示对第几个区域的字符串排序,-n 则表示使用纯数字排序,示例如下:
# head -n5 /etc/passwd |sort -t: -k3 -nroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-k3,5 表示从第3到第5区域间的字符串排序,-r表示反向排序,示例如下:
# head -n5 /etc/passwd |sort -t: -k3,5 -rlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologinroot:x:0:0:root:/root:/bin/bash
知识点三:uniq去重复这个命令我经常用的选项只有一个,-c :统计重复的行数,并把行数写在前面请把下面的内容写入testb.txt, 保存。
111222111333
使用uniq 的前提是需要先给文件排序,否则不管用,如下所示:
# uniq testb.txt111222111333# sort testb.txt |uniq111222333
以下是-c选项的作用:
# sort testb.txt |uniq -c      2 111      1 222      1 333

知识点四:用iptables工具封/解封IP在CentOS系统中有一个叫做netfilter的防火墙,它可以对进入或者即将离开网卡的数据包进行处理。最常见的用法就封IP,即限制某些IP或者某些IP的某个port的数据包进入Linux系统。很多人把iptables叫做防火墙,其实不然,iptables是CentOS6系统里的一个服务,当然它也是一个命令,而在CentOS7系统里也有iptables命令,服务名不再是iptables,而是firewalld。

1)查看filter表的iptables规则

# iptables -nvL -t filter

说明:在CentOS7上netfilter有5个表,分别是:filter、nat、mangle、raw、secuirty。而我们用的比较多的是前两个,本案例中的封ip用的就是filter表。该命令中的-t filter可以省略,默认就是filter表。

2)增加规则

# iptables -A INPUT -p tcp --dport 80 -s 1.1.1.1 -j DROP

说明:-A表示增加规则,INPUT为filter表里的一个链,除此之外,filter表还有OUTPUT链和FORWARD链。这里我引用网上的一张图片帮助大家理解netfilter的表和链。

 

 

数据包的流向是这样的:

a. 当一个数据进入网卡时,他首先进入PREOUTING链(数据包进入路由之前),然后判断目标IP是否本机。

b. 如果数据包是进入本机的,他会到达INPUT链(通过路由表后目的地为本机),数据包到达INPUT链后进入本机内核,然后内核进行处理,处理完到OUTPUT链(由本机产生,向外转变),最后到POSTROUTING(发送到网卡接口之前)。

c. 如果不是进入本机的,他会到FORWARDING链(通过路由表后,目的地不为本机)最后POSTROUTING链(发送到网卡接口之前)。搞清楚了数据包流向就很容易理解INPUT、OUTPUT链的作用了,其实我们更关心的是INPUT和OUTPUT链,而其他几个链可以先不用理会。用INPUT控制进入本机的数据包,而用OUTPUT控制出去的数据包,这两个几乎可以满足我们绝大多数的运维场景了。-A选项是增加一条规则,更准确地说是追加一条规则,因为iptables的规则是分前后的,用iptables -nvL查看规则时,越靠上的规则就越先生效,也就是说优先级越高。所以,使用-A追加的规则只能排在最后面,但如果想增加一条优先级最高的规则怎么办?用-I选项(插入规则的意思)即可,示例命令如下:

# iptables -I INPUT -p tcp --dport 80 -s 2.2.2.2 -j DROP
也可以不针对端口,只写IP,同时也可以指定目标IP地址,如下:
# iptables -I INPUT -s 3.3.3.3 -d 4.4.4.4 -j DROP
删除规则有两个方法,一是全部清空,另外一个就是删除一条:
# iptables -t filter -F
删除一条规则,比较麻烦,因为你需要记得当时创建这条规则的命令,把-I或者-A换成-D即可,如下:
# iptables -D INPUT -s 3.3.3.3 -d 4.4.4.4 -j DROP
当然,也有比较简单的做法,首先要列出规则的序号,如下:
# iptables -nvL --line-numbers
最左边第一列的"num"就是规则的序号了,每个链的规则都是从1开始,假如要删除INPUT链的第2条规则,只需要执行:
# iptables -D INPUT 2
这样就会把INPUT链下的第2条规则删除掉。删除规则后,重新列出规则序号,会发现序号依然是从1开始。当我们执行iptables -nvL时,列出的结果中第一列'pkts'表示被iptables规则作用的数据包个数,而第二列'bytes'表示被iptables规则作用的数据量大小。这个数字会不断变化,如果重启iptables或者firewalld服务这两列数字会清零,当然也有一个选项可以让它清零,如下:
# iptables -Z
也可以指定某个链,比如:
# iptables -Z INPUT
以上我介绍的知识点主要是针对本案例的,其实iptables的用法还挺多,限于篇幅暂时先讲这么多吧,后续案例中有涉及到咱们再近一步学习。知识点五:shell脚本中的函数在shell脚本中如果某一段代码出现1次以上,应该把这段代码封装到一个函数里,这样后续调用它会很方便,而且代码看起来也非常美观。下面我用一个实际的例子来说明函数的好处。需求是,检查系统中是否安装vim-enhanced、expect、wget包,如果没有安装则安装一下,传统的shell代码是这样写的:
if ! rpm -q vim-enhanced &>/dev/null  //说明,在shell中可以把一条命令作为if的判断条件,命令前面加!表示取反then     yum install -y vim-enhancedfiif ! rpm -q expect &>/dev/nullthen    yum install -y expectfiif ! rpm -q wget &>/dev/nullthen    yum install -y wgetfi
试问,如果让你去检查100个包,难道你要写100遍这段代码吗?用函数就简洁多了,如下:
## 定义if_install函数if_install() {  if ! rpm -q $1 &>/dev/null    then        yum install -y $1    fi}## 用for循环把所有rpm包逐一检查一遍for pkg in vim-enhanced expect wgetdo    if_install $pkgdone
知识点六:sed用法sed和grep、awk一样频繁地出现在shell脚本中,它们三个经常被叫做“正则三剑客”,可见这三个工具和正则表达式之间的关系非同一般。对于sed工具的用法,我列几个常见的。1)打印指定行
sed -n '10p' 1.txt
说明:10指的是行号,p表示print(打印),加上-n后只显示第10行,否则会把1.txt所有行都显示出来,这里的单引号是我的习惯,你可以不加也可以加双引号。另外,可以指定多行,示例命令如下:
sed -n '1,5p' 1.txt  
说明:打印1到5行,如果是不连续的行,可以这样:
sed -n '1p;5p' 1.txt
sed也有和grep类似的过滤指定行的功能,如下:
sed -n '/abc/p' 1.txt
说明://为一个固定写法,里面就是要匹配的字符串,可以是正则,例如:
sed -n '/[a-z0-9]/p' 1.txt
在正则表达式中,有几个特殊符号属于扩展正则范畴,它们是+, ?, |, (), {}。在grep中要使用它们需要加上-E选项,而在sed中要使用它们,需要加上-r选项,比如:
sed -nr '/abc|123/p' 1.txt
2)删除指定行
sed '10d' 1.txt
说明:会删除第10行,但并不会真正操作1.txt内容,而是屏幕上显示的内容少了第10行,要想直接在文件内生效,可以加上-i选项,如下:
sed -i '10d' 1.txt
删除包含'abc'或者'linux'字符串的行
sed -ir '/abc|linux/d' 1.txt
3)查找替换把1.txt中的出现的全部'aming'替换为'linux'
sed 's/aming/linux/g' 1.txt
说明:这里的s表示替换,g表示全局替换,如果不加g则只替换每行中出现的第一个'aming'。本案例参考脚本如下是我写的参考脚本,请过目:
#! /bin/bash## 把访问量比较大的IP封掉,如果30分钟内被封的IP没有请求或者请求很少,需要解封## 作者:阿铭## 日期:2022-07-20## 版本:v1.1#定义1分钟以前的时间,用于过滤1分钟以前的日志t1=`date -d "-1 min" +%Y:%H:%M`log=/data/logs/access_logblock_ip(){    egrep "$t1:[0-5]+" $log > /tmp/tmp_last_min.log    #把1分钟内访问量高于100的ip记录到一个临时文件中    awk '{print $1}' /tmp/tmp_last_min.log |sort -n |uniq -c|sort -n |awk '$1>100 {print $2}' > /tmp/bad_ip.list    #计算ip的数量    n=`wc -l /tmp/bad_ip.list|awk '{print $1}'`    #当ip数大于0时,才会用iptables封掉它    if [ $n -ne 0 ]    then        for ip in `cat /tmp/bad_ip.list`        do            iptables -I INPUT -s $ip -j REJECT        done        #将这些被封的IP记录到日志里        echo "`date` 封掉的IP有:" >> /tmp/block_ip.log        cat /tmp/bad_ip.list >> /tmp/block_ip.log    fi}unblock_ip(){    #首先将包个数小于5的ip记录到一个临时文件里,把它们标记为白名单IP    iptables -nvL INPUT|sed '1d' |awk '$1<5 {print $8}' > /tmp/good_ip.list    n=`wc -l /tmp/good_ip.list|awk '{print $1}'`    if [ $n -ne 0 ]    then        for ip in `cat /tmp/good_ip.list`        do            iptables -D INPUT -s $ip -j REJECT        done        echo "`date` 解封的IP有:" >> /tmp/unblock_ip.log        cat /tmp/good_ip.list >> /tmp/unblock_ip.log    fi    #当解封完白名单IP后,将计数器清零,进入下一个计数周期    iptables -Z}#取当前时间的分钟数t=`date +%M`#当分钟数为00或者30时(即每隔30分钟),执行解封IP的函数,其他时间只执行封IP的函数if [ $t == "00" ] || [ $t == "30" ]then   unblock_ip   block_ipelse   block_ipfi

标签:iptables,遇到,CC,ip,攻击,awk,IP,INPUT,txt
From: https://www.cnblogs.com/msjhw/p/17317409.html

相关文章

  • 什么是CCRC信息安全服务资质?
    一、什么是CCRC?CCRC就是从前ISCCC的新名,也是就信息安全服务资质,规定了信息安全服务提供者在提供服务时应具备的服务安全通用要求和专业服务能力要求。今天,小编恒标知产就CCRC详细地说一说。二、CCRC的级别CCRC信息安全服务资质每一大类有一、二、三共三个级别,一级为最高级,三级为最......
  • (CCPC F题)UESTC 1220 The Battle of Guandu (最短路)
    题目地址:UESTC1220比赛的时候翻译完想了一小会就没再管。结果K题也没调试出来。。这题是很神奇的图论题,建图方式是从y[i]到x[i]连一条有向边,权值为c[i]。然后将所有重要性为0的设为源点,然后跑最短路,结果就是所有重要性为2的点的最短距离。实在是不好解释和证明这种建图的正......
  • 综合能源耦合微网优化程序matlab 程序基于冷热电联供综合能源耦合模型,采用cchp
    综合能源耦合微网优化程序matlab程序基于冷热电联供综合能源耦合模型,采用cchp,并且含有压缩空气储能,采用粒子群优化求解ID:4690639187575931......
  • 两阶段鲁棒优化模型 多场景 采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列
    两阶段鲁棒优化模型多场景采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列与约束生成(CCG)算法进行求解,场景分布的概率置信区间由1-范数和∞-范数约束,程序含拉丁超立方抽样+kmeans数据处理程序,程序运行可靠,有详细资料YID:69120677501311622......
  • HDU 1588 Gauss Fibonacci(矩阵快速幂)
    题目地址:HDU1588用于构造斐波那契的矩阵为1,11,0设这个矩阵为A。sum=f(b)+f(k+b)+f(2*k+b)+f(3*k+b)+........+f((n-1)*k+b)<=>sum=A^b+A^(k+b)+A^(2*k+b)+A^(3*k+b)+........+A^((n-1)*k+b)<=>sum=A^b+A^b*(A^k+A^2*k+A^3*k+.......+A^((n-1)*k))(1)设矩阵B为A^k;那么(1......
  • HDU 3306 Another kind of Fibonacci(矩阵快速幂)
    题目地址:HDU3306没什么智商的题目,只要把构造矩阵硬算出来就行。代码如下:#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<queue>#include<......
  • 热电联产选址定容程序matlab cchp 采用遗传算法编写matlab程序,实现热电联产设备的选址
    热电联产选址定容程序matlabcchp采用遗传算法编写matlab程序,实现热电联产设备的选址定容,考虑热网和电网的潮流计算,程序运行可靠ID:3860661447951290......
  • 微网两阶段鲁棒优化matlab版 采用CCG和kkt条件编制两阶段鲁棒优化程序,以储能、发电、
    微网两阶段鲁棒优化matlab版采用CCG和kkt条件编制两阶段鲁棒优化程序,以储能、发电、风电和光伏容量作为第一阶段变量,以主体出力作为第二阶段变量,以负荷、风电和光伏出力作为不确定性变量,实现微网两阶段优化模型ID:2190641653026839......
  • 使用MultipartFile遇到的坑
    java使用MultipartFile上传文件时,转换流的时候,遇到java.io.ByteArrayInputStreamcannotbecasttojava.io.FileInputStream错误FileInputStreamfileInputStream=(FileInputStream)file.getInputStream();正常情况下应该返回FileInputStream,但我遇到返回ByteArrayInpu......
  • CCITT G3/G4 1D/2D编码
    CCITTG3/G41D/2D指:CCITTGroup3(T.4)1D(纯1维);CCITTGroup3(T.4)2D(至少一行1维(第一行开始连续行),剩余行2维);CCITTGroup4(T.6)2D(纯2维);针对纯黑色(0)和白色(1)的位图编码方案;   CCITTGroup3(T.4)1D:1维编码;每行以12位EOL(000000000001)码字开头;最......