利用iptables的recent模块来抵御DOS攻击

作者:linux120 发布时间:July 3, 2014 分类:服务器配置

防范DOS攻击用iptables就可以简单的实现,不过对CC攻击还是无效的,接下来我会再写关于抵御CC攻击和DDOS攻击的文章。
在《用iptables的connlimit模块限制并发连接数》一文中我们讲了利用iptables的connlimit模块来限制单IP的并发连接数,效果还是很不错的。后来我发现再加上recent模块更加灵活。

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP

iptables -I INPUT 2 -p tcp --dport 80 -m state --state NEW -m recent --set --name DOS

iptables -I INPUT 3 -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 30 --name DOS -j DROP

1.利用connlimit模块将单IP的并发设置为30;会误杀使用NAT上网的用户,可以根据实际情况增大该值;

2.利用recent和state模块限制单IP在60s内只能与本机建立30个新连接。被限制一分钟后即可恢复访问。

下面对最后两句做一个说明:

1.第一句是记录访问tcp 80端口的新连接,记录名称为DOS
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

2.第二句是指DOS记录中的IP,60s内发起超过20次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用

3.iptables的记录:/proc/net/ipt_recent/DOS

关于recent更多更详细的用法请查看iptables手册。

另外iptables还有日志记录功能,我们可以把达到过滤要求的IP输出到系统日志中,然后把这些IP筛选出来封掉。
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --name DOS --second 60 --hitcount 30 -j LOG --log-prefix "Dos Attack"

这样一来,当某IP访问tcp 80端口的新连接在60秒内超过30的时候,该IP将会被记录/var/log/messages当中。

用iptables的connlimit模块限制并发连接数

作者:linux120 发布时间:June 3, 2014 分类:服务器配置

iptables的--connlimit匹配项可以限制ip并发连接数。然而并没有以静态方式编译进内核,故我们使用此选项时会提示错误。
网上绝大部分的解决方案均是重新编译内核,其实有更简单的方法。
对于linux的模块,没有静态编译进内核的,其实大部分已经编译成动态模块,我们其实只要找出是哪个模块问题便解决了,而此匹配项对应的模块是ipt_connlimit,下面便是详细解决方法。

# depmod -a

此命令的作用便是找出所有可用的动态模块,这个命令是必须的,它不会有输出。
下一步是将模块插入内核
modprobe ipt_connlimit

同样不会有输出,没提示出错便表示成功了。(注意:insmod也是将模块插入内核,但是它不会自动清理模块的依赖关系,若依赖模块没先插入,便直接报错,不推荐使用)

这时我们可以使用connlimit匹配项了:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT

示例写得有些简单,我们可根据连接状态来匹配,甚至可以根据某一次DOS攻击,包的特征来匹配。这里,各位自由发挥了。

这里再例出对connlimit两个参数的研究:
--connlimit-above x 限定并发连接的最大数目
--connlimit-mask x 限定某个网络的最大并发连接数,x为32时,代表具体的主机,为默认值。x的值一般是代表A,B,C三类网络的8,16,24。至于支不支持变长子网,待研究。

mysqlcheck自动优化数据表

作者:linux120 发布时间:June 1, 2014 分类:服务器配置

运行一段时间以后mysql数据表会产生很多碎片,需要优化,可以手工执行以下命令:
mysqlcheck -Aos -u USER -pPASS

也可以每天早上4点自动执行优化:
0 4 * * * mysqlcheck -Aos -u USER -pPASS > /dev/null 2>&1

innodb是不支持碎片整理的,所以我们绕过他:
for i in `mysql -e 'select concat(table_schema,".",table_name) from information_schema.tables where engine="MyISAM"'`; do mysql -e "optimize table $i"; done

让mysql用上高大上的tmpfs

作者:linux120 发布时间:April 2, 2014 分类:服务器配置

mysql中最让人头疼的莫过于IO,当数据量达到一定程度时候,一般都会选择SSD作为载体,今天的小技巧就是通过tmpfs来提高mysql 排序、分组等创建临时表时的IO性能。

使用Ubuntu的童鞋请先做以下动作:
vim /etc/apparmor.d/usr.sbin.mysqld 添加 /run/mysqld/tmp/** rwk,
而后重启Apparmor
service apparmor restart

创建临时目录并修改属主权限:
mkdir /run/mysqld/tmp/
chown -R mysql:mysql /run/mysqld/tmp/
chmod 1777 /run/mysqld/tmp/

更改Mysql配置:
vim /etc/mysql/my.cnf
添加或修改tmpdir = /run/mysqld/tmp
重启,大功告成。
service mysql restart

开启PHP-FPM状态页

作者:linux120 发布时间:April 1, 2014 分类:服务器配置

PHP-FPM 内置了一个非常有用的状态页,开启该功能后,你可以通过web访问或者脚本来查看统计php-fpm的健康状况。
在php-fpm.conf中找到或者添加pm.status_path项目,pm.status_path = /fpmstatus
在nginx.conf中添加
location ~ ^/fpmstatus$ {
access_log off;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
分别重启php和nginx后即可通过ip/fpmstatus来查看fpm的运行状况。
例如:
pool: www
process manager: static
start time: 01/Apr/2014:12:07:44 +0800
start since: 595
accepted conn: 18224
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 238
active processes: 18
total processes: 256
max active processes: 136
max children reached: 0

上图表明当前使用了名为www的静态应用池,共有256个进程提供服务,当前有18个fpm处于活跃状态,历史上最高使用到136个fpm进程,通过该页面你可以很清楚的看到是否该增加fpm进程了。
另外通过?ip/fpmstatus?full 可以看到每个fpm当前正在处理的数据例如:
************************
pid: 11067
state: Idle
start time: 01/Apr/2014:12:07:44 +0800
start since: 752
requests: 92
request duration: 105268
request method: GET
request URI: /index.php?controller=jsinfo/navigation
content length: 0
user: -
script: /home/wwwroot/xxxxx.com/index.php
last request cpu: 95.00
last request memory: 15204352