从上面的脚本源代码中最后四行内容可以看到实际的命令是在防火墙表中插入适当的规则。可以看到$INSERT变量的值取决于在命令行参数中是使用"on"还是"off"模式。当iptables行被执行时特定的规则将被适当的插入或删除。

现在我们看看这些规则本身的功能,它们能和任何类型的防火墙一起发挥作用,甚至在没有部署防火墙的系统上。需要的条件仅仅是支持iptables的 Linux2.4版本的内核。我们阻塞来自恶意IP的攻击数据报(第一条iptables语句),阻塞发向恶意攻击IP的数据报(第二条iptables 语句),并且对该IP关闭任意方向的数据转发(最后两条iptables工具)。一旦这些规则发挥作用系统将丢弃满足这些条件的任何数据报。

另外一个需要注意的是:脚本中调用了"rec_check", "unrecord", "record",和"args"。这些都是定义在"dynfw.sh"中的特殊的bash函数。"record"函数实现将被阻塞的IP记录在文件 /root/.dynfw-ipdrop文件中,而"unrecord"则是将其从文件/root/.dynfw-ipdrop中去除。 "rec_check"函数是在发现试图重新阻塞某个已经阻塞的IP地址或取消某个没有被阻塞的IP地址时输出错误信息并停止脚本执行。"args"函数实现确保命令行参数的正确性,并实现打印脚本帮助命令。文件dynfw-1.0.tar.gz包含所有的这些工具,具体情况请见文章最后的资源部分。

tcplimit

如果你需要对某个特殊的基于TCP的网络服务的使用进行限制(例如在端系统上产生严重负载时),则tcplimit脚本则可以帮助你达到这个目的,该脚本使用TCP端口、一个率值和"on"或"off"作为参数:

# tcplimit 873 5 minute on

Port 873 new connection limit (5/minute, burst=5) on.

tcplimit使用iptables的"state"模块(应确保在内核中打开该选项或加载模块)来实现在某段时间内只允许特定数目的连接请求通过。在本例中防火墙将限制每分钟只允许5个新连接到我的rsync服务器(port 873)。当然你可以根据需要选择时间单位为秒钟/分钟/小时。

tcplimit提供了一个限制对非关键服务的使用的非常好的方法-这样大量到非关键服务的数据不会破坏服务器。在上面的例子中使用tcplimit 来设置使用rsync的限制,以防止tsync数据占用了Internet连接的所有带宽。其中连接服务限制信息记录在文件/root/.dynfw- tcplimit中。若想关闭该限制只需要键入如下命令:

# tcplimit 873 5 minute off

Port 873 new connection limit off.

tcplimit通过在"filter"表中创建一个新的规则链来实现。这个新的规则链将拒绝所有超过指定限制的数据报,同时将一个规则插入到 INPUT规则链中,其将所有的到目标端口(在本例中是873端口)的新连接数据报定向到这个新的规则链。新规则链只会影响新的超过限制的连接而不会影响已经建立的连接。

当tcplimit定义的规则被关闭,INPUT规则和新规则链则会被删除。象ipdrop一样其tcplimit可以和任何类型的防火墙一起工作。

host-tcplimit

host-tcplimit和tcplimit非常类似,但是它是限制来自一个特定的IP的到服务器上某个特定端口的TCP连接数量。host -tcplimit在防止某个特定的人滥用你的网络资源时非常有用处。例如你维护有一个CVS服务器,有一天突然发现一个特殊的新开发者出现了,他好像建立了一个脚本每十分钟更新它的资源。占用了大量的网络资源。然后你就给他发送信件说明他的行为的错误之处。但是你收到他如下的回信:

Hi guys!

Im really excited to be part of your development project. I just set up a

script to update my local copy of the code every ten minutes. Im about to

leave on a two-week cruise, but when I get back, my sources will be totally

up-to-date and Ill be ready to help out! Im heading out the door now...see

you in two weeks!

Sincerely,

Mr. Newbie

对于这种情况,使用host-tcplimit可以非常容易的解决问题:

# host-tcplimit 1.1.1.1 2401 1 day on

现在Newbie先生(IP地址为1.1.1.1)被限制为每天只能进行一次CVS连接从而节省了网络带宽。

user-outblock

最后一个,也是这几个防火墙脚本中最有趣的是user-outblock。这个脚本提供了一种实现允许某个用户通过SSH或telnet登录到系统上但是不允许它通过命令行命令建立向外连接去的一个很理想的方法。下面是一个应用user-outblock的一个示例场合。假设一个特殊的家庭在我们的ISP拥有一个账号。妈妈和爸爸使用图形化的email客户端程序阅读自己的信件,偶尔会冲浪Internet,但是他们的儿子却是一个热衷的 hacker分子,他常常使用它的shell访问权限来对其他的机器做一些淘气的事情。

通过文章,我们可以清楚的知道动态iptables防火墙dynfw,希望对大家有用!


相关内容