宝塔LNMP环境 防CC攻击

前言

老被cc的福利来了,群里一些朋友天天被攻击,老夫也遭殃,坐不住了,直接上教程。

本教程只防CC攻击,不能防DDOS,防DDOS请麻溜买高防秒解。

实测:1核1G内存撑住700多代理IP持续攻击,屹立不倒,且CPU在45%左右徘徊。

本教程借助根据CPU/内存大小 优化LNMP环境配置,且使用了类似cfCDN的防CC攻击特点并做了一些优化

什么是CC攻击

攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。 CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。 一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。 CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。

你是否受到了CC攻击

1.网站访问缓慢,报503错误(nginx拒绝连接),502错误(php挂逼)

2.服务器CPU 100%;

基本上确诊被C了。

LNMP环境优化

1.nginx优化:nginx没有过多的优化,一般nginx都死被php拖死的。简称:扶不起来

2.宝塔中nginx的过滤器测试效果并不理想,如果各位不打算回复的话(不打算看接下来的核心内容)可以开启“防CC攻击模块”并设置为频率100,周期60。能有效防止一些恶意访问,比如小学生找不到代理,就几个代理。如果打算支持一下,请直接关掉它。

3.php优化:服务器挂壁基本都是php进程太多导致的了。nginx是个传菜的,php就是真正花时间吃饭的。

4.如图:简单理解,最少15个人在厂里,最多50个人同时干活,如果有35个人以上没干活就开除掉。

5.根据CPU核数设定起始进程数和最小空闲,这样可以发挥正常状态的最大优势,加快处理速度 设置为15*核数 ,即1核15进程,双核30进程。

6.根据内存设置最大进程,防止出现内存爆炸,导致fpm挂起或者mysql等其他服务挂逼。设置为1G*(40-50),即1G内存40-50,2G内存80-100。

7.设置上面两项可以更有效率的使用服务器。

8.如上设置并不能防止CC攻击,但是为我接下来需要说的提供了前提。

redis + 验证码 + 策略 防CC

采用redis高性能数据库,合理的访问策略验证并在超大攻击时开启验证码访问。让网站远离CC

1.安装redis,在宝塔软件管理找到,安装;

2.安装php redis扩展,你用哪个php就安装哪个php的扩展,别装错了;

3.在网站入口,如Wordpress的index.php 头部加入如下代码:

header('Content-Type: text/html; charset=UTF-8'); //emlog原有代码,复制下列代码放在下面
 //CC攻击停止后会尽快解除验证码,回到正常状态
 //防CC配置$IPmax = 30; //开启验证码条件 值>=php最大进程数,适当设置更大会降低验证码触发条件,但会增大502错误几率(php挂起) 
 $IPfor = 60; //周期 这个值基本不用动
 $IPban = 60; //扔入黑名单 60秒内访问超过60次即拉黑IP
 $banTime = 3600*24; //黑名单时长 扔小黑屋时长,这种代理IP放一天感觉都少了 = =!
 $ip = ip();
 //连接本地的 Redis 服务$redis = new Redis();$redis->connect('127.0.0.1', 6379);
 //拦截黑名单if($redis->exists($ip.'ban')){
	exit('您被关进了小黑屋,黑白网丨HeiBai.Org');}
 //扔黑名单检测if($redis->get($ip.'ok') >= $IPban){
	$redis->setex($ip.'ban', $banTime, '1');}
 if($redis->exists($ip.'ok')){
	$redis->incrby($ip.'ok',1); //记录IP 自增1}else{
	$redis->setex($ip.'ok',$IPfor,1);}
 //按需开启防CC 小黑屋IP不会触发该条件,所以当一段时间以后就会解除验证码。除非攻击者换一批代理继续攻击。如此往复if(count($redis->keys("*ok")) > $IPmax){
	//验证
	if($_COOKIE['key'] == ''){
		if($_GET['cc']){
			$key = md5($ip.$_GET['cc']);
			setcookie("key",$key);
		}
	}
	//拦截代码
	if($_COOKIE['key'] && $_COOKIE['cc'] && $_COOKIE['key'] == md5($ip.$_COOKIE['cc'])){
		//通过
	}else{
		if($_GET['cc']){
			$key = md5($ip.$_GET['cc']);
			setcookie("key",$key);
		}else{
			$cc = rand(1000,9999);
			setcookie("cc",$cc);
			//这里只是简单的构造了一下验证码,有能力可以自己更改的更安全和完美。
			echo '<!DOCTYPE html>
			<html>
			<body>
			<form action="">请输入:'.$cc.' :<input type="text" name="cc" value=""><input type="submit" value="继续访问"></form> 
			<p>访问异常,请输入验证码。</p>
			</body>
			</html>';
		}
		exit();
	}}function ip() {
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    $res =  preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
    return $res;}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏醉程序

配置nginx + php7 + mongodb的centos服务器环境

23320
来自专栏Python数据科学

Python爬虫之模拟登录京东商城

首先感谢大家的大力支持,博主会持续更新精彩文章,分享更多技术干货。另外,最近在新建的QQ群中结识了一些朋友,气氛很好,大家互相分享技术内容,博主也从中收获了不少...

44720
来自专栏数据和云

安全预警:独立发布的Oracle严重 CVE-2018-3110 公告

在 2018年8月10日,Oracle 独立的发送了一封"安全警告"邮件给所有的 Oracle 用户,这封邮件的标题是:Oracle Security Aler...

15620
来自专栏Android开发指南

genymotion常见问题解答

685100
来自专栏沃趣科技

PostgreSQL中删除的数据能否恢复

问题的提出 有人问PostgreSQL数据库中刚刚删除的数据能否被恢复? 或更进一步,如果如要在一个事务中做了一系列的更新、删除、插入的操作后,把这个事务提交之...

63870
来自专栏jianhuicode

蓝牙门禁系统

最近准备春招,把项目整理下,项目分为EF为核心的后台程序与移动客户端,以及蓝牙锁。我呢?负责Android客户端与后台程序开发,开锁人员通过移动客户端申请开锁任...

25080
来自专栏javathings

数据库中的并发控制

任何时候当有多个查询想要操作相同的数据的时候便会产生并发问题,而这很有可能会导致数据库陷入一种不一致的状态。如果恰好出现问题的数据是一批关键数据,那这个后果往往...

84320
来自专栏肖洒的博客

DO部署Python爬虫应用

DigitalOcean里面还有60美金,可以用一下,部署了服务器,我可能就不会再去折腾这个爬虫应用了。

13030
来自专栏漏斗社区

代码审计| APPCMS SQL-XSS-CSRF-SHELL

0x01 背景 由若水师傅提供的一个素材,想要复现CNVD上披露的一个APPCMS的漏洞,由CNVD上的描述可以知道存在漏洞的地方是comment.php这个...

461110
来自专栏飞雪无情的博客

Android Gradle实用技巧(四) | 自动瘦身APK文件

随着工程越来越大,功能越来越多,开发人员越来越多,代码越来越复杂,不可避免的会产生一些不在使用的资源,这类资源如果没有清理的话,会增加我们Apk的包大小,也会增...

7320

扫码关注云+社区

领取腾讯云代金券