一台服务器被攻击了,几个ip拼命的刷首页,一小时服务14W个请求,平均占用带宽到12M多,CPU持续100%占用,但据说当地访问者还能打开网站。
解决办法,毙掉这几个IP
服务器是Freebsd系统的,先前没有启动防火墙,顺便就熟悉一遍Freebsd下面的pf防火墙吧。
Freebsd里面有三个各有特点的防火墙
Freebsd自己的ipfw ,跨Unix平台的ipfilter ,移植自Openbsd的pf ,
任意一个都能满足要求,但个人对pf颇有好感,就用他了。
开始了:
第一步,启用PF模块
# kldload pf
# kldstat
Id Refs Address Size Name
1 7 0xc0400000 5465fc kernel
2 1 0xc0947000 16418 geom_mirror.ko
3 1 0xc095e000 191c accf_data.ko
4 1 0xc0960000 2354 accf_http.ko
5 1 0xc0963000 69174 acpi.ko
6 1 0xcb4f7000 33000 pf.ko
并放入引导中,下次自动加载
#vi /boot/loader.conf
pf_load="YES"
第二步,允许PF功能
#vi /etc/rc.conf
增加下面一行
pf_enable="YES"
/etc/rc.conf: 17 lines, 596 characters.
第三步, 打开pf
# pfctl -e
No ALTQ support in kernel
ALTQ related functions disabled
pf enabled
ALTQ 是pf的流量×××,默认没有编译到内核中,所以有不支持ALTQ的提示
启用完成
#####################
编辑 防火墙规则文件,增加一些简单的防火墙规则
#vi /etc/rc.conf
增加/编辑一个 table表 表名 bad 把你看得不爽的IP放进去, 注意:规则中的bad要用尖括号括起来,下面因为编辑器的原因,我把尖括号去掉了
ext_if="em0"
table bad { 219.136.52.xx, 218.168.162.xx, 221.210.65.xx }
pass in all
pass out all
pass in quick on $ext_if proto tcp from any to $ext_if port 22 keep state
block in quick on $ext_if from bad #这行规则就是拒绝所有bad表中的IP访问服务器
###########
让规则文件生效
#pfctl -f /etc/rc.conf
如果需要临时更改bad表的内容,一条命令就让你迅速毙掉此IP
#pfctl -t bad -T add 202.201.98.10
顺便说一句table中的内容可以是单个IP,也可以是一个网段 202.201.98.0/24
也可以删除掉bad表中的ip定义
#pfctl -t bad -T delete 202.201.98.10
#pfctl -t bad -T show -v
可以查看这个表中,各个IP的被处理的情况,block /pass的packet数、byte数 等等......
做完,世界清静了,cpu idle恢复到80-90%左右
http://www.zmoon.org/read.php/539.htm