科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网网络频道构筑Linux防火墙之为个人用户设置防火墙

构筑Linux防火墙之为个人用户设置防火墙

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

应用级防火墙可以被用作网络地址翻译器,因为传输流通过有效地屏蔽掉起始接入原址的应用程序后,从一面进来,从另一面出去。

作者:51cto 2007年10月18日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

目标(target)
我们已经知道,目标是由规则指定的操作,那些与规则匹配的信息包执行这些操作。除了允许用户定义的目标之外,还有许多可用的目标选项。用于建立高级规则的目标,如LOG、REDIRECT、MARK、MIRROR 和MASQUERADE等。
状态机制
状态机制是iptables中特殊的一部分,其实它不应该叫状态机制,因为它只是一种连接跟踪机制。但是,很多人都认可状态机制这个名字。连接跟踪可以让 netfilter知道某个特定连接的状态。运行连接跟踪的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。
在iptables里,包是和被跟踪连接的四种不同状态有关的。它们是NEW、ESTABLISHED、RELATED和INVALID。使用--state匹配操作,我们能很容易地控制“谁或什么能发起新的会话”。
所有在内核中由netfilter的特定框架做的连接跟踪称作conntrack(就是connection tracking的首字母缩写)。conntrack可以作为模块安装,也可以作为内核的一部分。大部分情况下,我们需要更详细的连接跟踪。因此, conntrack中有许多用来处理TCP、UDP或ICMP协议的部件。这些模块从数据包中提取详细的、唯一的信息,因此能保持对每一个数据流的跟踪。这些信息也告知conntrack流当前的状态。例如,UDP流一般由他们的目的地址、源地址、目的端口和源端口唯一确定。
在以前的内核里,我们可以打开或关闭重组功能。然而,自从iptables和netfilter,尤其是连接跟踪被引入内核,这个选项就被取消了。因为没有包的重组,连接跟踪就不能正常工作。现在重组已经整合入conntrack,并且在conntrack启动时自动启动。不要关闭重组功能,除非你要关闭连接跟踪。
除了本地产生的包由OUTPUT链处理外,所有连接跟踪都是在PREROUTING链里进行处理的,意思就是说iptables会在PREROUTING 链里重新计算所有的状态。如果我们发送一个流的初始化包,状态就会在OUTPUT链里被设置为NEW,当我们收到回应的包时,状态就会在 PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状态。综上所述,所有状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。
正如前面说的,包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种状态:NEW、ESTABLISHED、RELATED和INVALID。它们主要是和状态匹配一起使用。
NEW
NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。

 ESTABLISHED
ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。
RELATED
RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是 RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。
INVALID
INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西。
这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。

用iptables搭建防火墙规则

前面介绍了iptables的基本概念和用法,下面我们就开始正式使用iptables来创建我们的防火墙。启动和停止iptables的方法取决于所使用的Linux发行版,你可以查看所使用Linux版本的文档。在Red Hat中,启动iptables用:

#service iptables start


一般情况下,iptables已经包含在了Linux发行版中,可以运行iptables --version来查看系统是否安装了iptables。在我使用的Fedora Core 1中,安装的版本是iptables v1.2.8。如果你的系统确实没有安装iptables,那么可以从以下地址下载:
http://www.netfilter.org/
查看规则集
虽然上文对iptables的用法作一个简单介绍,但现实中我们可能需要知道更完整的信息,这时我们可以运行man iptables来查看所有命令和选项的完整介绍,也可以运行iptables help来查看一个快速帮助。要查看系统中现有的iptables规划集,可以运行以下命令:

iptables list


下面是没有定义规划时iptables的样子:

Chain INPUT (policy ACCEPT)
target   prot opt source               destination

Chain FORWARD (policy ACCEPT)
target   prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target   prot opt source               destination   

如上面的例子所示,每一个数据包都要通过三个内建的链(INPUT、OUTPUT和FORWARD)中的一个。 filter是最常用的表,上文所示设置所有的表规则的基本语法:iptables [-t table] command [match] [target]。
现实中,不一定要用到这里所列出的所有选项,也不一定是以这个顺序。当然,这是一种惯例,因为规则一般都比较长,为了清晰起见,最好能够按照这个顺序。
在没有指定规则表的情况下,缺省时使用的filter表。在filter表中最常用的三个目标是ACCEPT、DROP和REJECT。DROP会丢弃数据包,不再对其进行任何处理。REJECT会把出错信息传送至发送数据包的主机。虽然有时会有一些预想不到的影响,但在很多时候它还是非常有用。
增加规则
本例中的规则将会阻止来自某一特定IP范围内的数据包,因为该IP地址范围被管理员怀疑有大量恶意的攻击者在活动:

# iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP


要了解有关iptables详细的参数和命令格式,请使用man iptables查看。可以说,现在我们对于网络上的恶意攻击者已经深恶痛绝,但不管怎么说,我们也不能因为憎恨它们就以同样的方法对其实行简单的报复,至少这种事情不能在你的网络里发生。因此,我们也可以很轻易地阻止所有流向攻击者IP地址的数据包,该命令也只是稍有不同:

# iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP


注意这里的A选项,如前所述,使用它说明是给现有的链添加规则。
删除规则
网络上的恶意攻击者总是在变化着的,因此我们也要不断改变IP。假设我们了解的一个网上攻击者转移到了新的IP地址,而其老的IP地址被分配给了一些清白的用户,那么这时这些用户的数据包就无法通过你的网络了。这种情况下,我们可以使用带-D选项的命令来删除现有的规则:

# iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP

缺省的策略
创建一个具有很好灵活性,可以抵御各种意外事件的规则需要花大量的时间。对于那些不想这样做的人,最基本的原则就是“先拒绝所有的数据包,然后再允许需要的”。下面我们来为每一个链设置缺省的规则:

# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT


这里选项-P用于设置链的策略,只有三个内建的链才有策略。这些策略可以让信息毫无限制地流出,但不允许信息流入。但很多时候,我们还是需要接收外部信息的。这时可使用以下命令:

# iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT
 


SYN的使用
我们不能关闭所有的端口,那将会把我们自己完全“与世隔绝”。我们也不能只指定某些端口处于打开状态,因为我们无法预见哪一个端口将会被使用。事实上,只简单地允许目的地为某一特定端口的数据流通过将对阻止恶意的攻击毫无意义。那么我们怎样才能设置一个有效的规则,即可以允许普通用户正常通过,又可以阻止恶意攻击者访问我们的网络呢?
对于刚开始使用iptables的人,我们可以充分利用syn标识来阻止那些未经授权的访问。因为iptables只检测数据包的报头,所以不会增加有效负荷。事实上,除iptables以外,很多其它有用的数据包分析都是基于报头的。
比如,在进行Web冲浪时,一个请求从你的PC发送至其它某一个地方的Web服务器之上,接着该服务器就会响应请求并且向你发回一个数据包,并且得到你的系统上的一个临时端口。与响应请求不同的是,服务器并不关心你所传送的内容。这们可以利用这种特点,来设置一个规则,让它阻止所有没有经过你的系统授权的TCP连接:

# iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP


 这里的-i指的是网卡,-p则是指协议,--syn则表示带有syn标识设置的TCP数据包。从中我们可以看出,对TCP/IP的了解将非常有利于维护网络安全。SYN用于初始化一个TCP连接,如果你在自己的机器上没有运行任何服务器,别人自然也就不会向你发送SYN数据包了。
就这点而言,有人会说:何必如此麻烦?的确,我们有更简单的创建防火墙的方法,也有很多不错的软件也可以帮助我们来构建自己的规则集,但是我们应该清楚,最简单的办法,往往不是最好的方法。既然我们有更好的方法,为什么不使用呢?

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章