大约在 Bob 实施攻击一分钟之后,我注意到信息包逐渐占满了上行链路。在查看了 tcpdump 的情况之后,我确定这还是 Bob 实施的另一次攻击,我推算出他用于发起攻击的 IP 地址。现在我已经有了这个信息,我需要做的就是阻止这些 IP 地址,我想这大概能解决问题 -- 很简单的解决方案。
响应攻击
我迅速使用 vi 打开防火墙设置脚本,并开始改动 iptables 规则、修改防火墙,这样它就可以阻止那些 Bob 发出的恶意进入信息包。大约一分钟左右,我找到了添加合适 DROP 规则的确切位置,并添加了这些规则。然后,我启动防火墙,但又马上停止了它……哎,我在添加规则时犯了一个小错。我再次装入防火墙脚本,改正问题,30 秒之后,将已将防火墙调整成阻止这个月内 Bob 发起的所有攻击。起先,它似乎成功地挫败了攻击……直到问讯台的电话铃声响起。显然,Bob 已经中断我的网络大约 10 分钟,现在我的客户打电话来询问究竟发生了什么情况。更遭的是,几分钟后,我发现上行链路又被占满了。看来 Bob 这次使用了一组全新的 IP 地址来实施攻击。我也做出响应,立即开始修改防火墙脚本,只不过这次我有一点惊慌 -- 也许我的解决方案还不那么完美。
ipdrop
如果有一个特别设计的特殊 "ipdrop" 脚本,它可以插入阻止我指定的 IP 地址所需的规则,那么情况会好多了。有了这样的脚本,阻止防火墙就不再是两分钟的折磨;它只需 5 秒钟。由于这个脚本可以让我不必手工编辑防火墙规则,这就消除了出错的主要根源。我所要做的只是确定要阻止的 IP 地址,然后输入:
# ipdrop 129.24.8.1 on
IP 129.24.8.1 drop on.
ipdrop 脚本会立即阻止 129.24.8.1,这是本周 Bob 的当前恶意 IP 地址。这个脚本明显提高了您的防御能力,因为现在阻止 IP 并不是件费神的事。现在,让我们看一下 ipdrop 脚本的实现:
ipdrop bash 脚本
#!/bin/bash
source /usr/local/share/dynfw.sh
args 2 $# "${0} IPADDR {on/off}" "Drops packets to/from IPADDR. Good for obnoxious
networks/hosts/DoS"
if [ "$2" == "on" ]
then
#rules will be appended or inserted as normal
APPEND="-A"
INSERT="-I"
rec_check ipdrop $1 "$1 already blocked" on
record ipdrop $1
elif [ "$2" == "off" ]
then
#rules will be deleted instead
APPEND="-D"
INSERT="-D"
rec_check ipdrop $1 "$1 not currently blocked" off
unrecord ipdrop $1
else
echo "Error: \"off\" or \"on\" expected as second argument"
exit 1
fi
#block outside IP address that's causing problems
#attacker's incoming TCP connections will take a minute or so to time out,
#reducing DoS effectiveness.
iptables $INSERT INPUT -s $1 -j DROP
iptables $INSERT OUTPUT -d $1 -j DROP
iptables $INSERT FORWARD -d $1 -j DROP
iptables $INSERT FORWARD -s $1 -j DROP