宝塔面板LNMP环境 防CC教程

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

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

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

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

什么是 CC 攻击

以为我要跟你讲?自己不会百度搜索

你是否受到了 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 个人以上没干活就开除掉。

宝塔面板 LNMP 环境 防 CC 教程

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.在网站入口,如 emlog 的 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('您被关进了小黑屋,么么哒!如有疑问,请联系站长');
}
 
//扔黑名单检测
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;
}

4.整个教程就完啦~,赶快找个 CC 软件 C 自己一波试下吧~

 


如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:宝塔面板 LNMP 环境 防 CC 教程
本文短地址:
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址