如何使用netfilter/iptables构建防火墙

对于Internet上的系统,不论是什么状况都要明确一点:网络是不安全的。所以,虽然建立一 个防火墙并不能保证系统100%安全,但倒是绝对必要的。Linux提供了一个很是优秀的防火墙工具—netfilter/iptables。它彻底免 费、功能强大、使用灵活、能够对流入和流出的信息进行细化控制,且能够在一台低配置机器上很好地运行。本文将简单介绍使用 netfilter/iptables实现防火墙架设和Internet链接共享等应用。 安全

netfilter/iptabels应用程序,被认为是Linux中实现包过滤功能的 第四代应用程序。netfilter/iptables包含在2.4之后的内核中,它能够实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。 netfilter工做在内核内部,而iptables则是让用户定义规则集的表结构。netfilter/iptables从ipchains和 ipwadfm(IP防火墙管理)演化而来,功能更增强大。下文将netfilter/iptabels统一称为iptables。 服务器

能够用iptables为Unix、Linux和BSD我的工做站建立一个防火墙,也可 觉得一个子网建立防火墙以保护其它的系统平台。iptales只读取数据包头,不会给信息流增长负担,也无需进行验证。要想得到更好的安全性,能够将其和 一个代理服务器(好比squid)相结合。 网络

基本概念

典型的防火墙设置有两个网卡:一个流入,一个流出。iptables读取流入和流出数据包的报头,将它们与规则集(Ruleset)相比较,将可接受的数据包从一个网卡转发至另外一个网卡,对被拒绝的数据包,能够丢弃或按照所定义的方式来处理。 并发

经过向防火墙提供有关对来自某个源地址、到某个目的地或具备特定协议类型的信息包要作些 什么的指令,规则控制信息包的过滤。经过使用iptables系统提供的特殊命令iptables创建这些规则,并将其添加到内核空间特定信息包过滤表内 的链中。关于添加、去除、编辑规则的命令,通常语法以下: ssh

iptables [-t table] command [match] [target] tcp

1.表(table)

[-t table]选项容许使用标准表以外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有三个可用的表选项:filter、nat和mangle。该选项不是必需的,若是未指定,则filter做为缺省表。各表实现的功能如表1所示。 工具

表1 三种表实现的功能 oop

2.命令(command)

command部分是iptables命令最重要的部分。它告诉iptables命令要作什么,例如插入规则、将规则添加到链的末尾或删除规则。表2是最经常使用的一些命令及例子。 测试

表2 命令的功能和样例 ui

3.匹配(match)

iptables命令的可选match部分指定信息包与规则匹配所应具备的特征(如源地址、目的地址、协议等)。匹配分为通用匹配和特定于协议的匹配两大类。这里将介绍可用于采用任何协议的信息包的通用匹配。表3是一些重要且经常使用的通用匹配及示例说明。

表3 通用匹配及示例说明

4.目标(target)

目标是由规则指定的操做,对与那些规则匹配的信息包执行这些操做。除了容许用户定义的目标以外,还有许多可用的目标选项。表4是经常使用的一些目标及示例说明。

除表4外,还有许多用于创建高级规则的其它目标,如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。

表4 目标及示例说明

应用iptables

与ipchains和ipfwadm不一样的是,iptables能够配置有状态的防火墙。iptables能够检测到源地址和目的地址、源端口和目的端口 及流入数据包的顺序,即iptables记住了在现有链接中,哪些数据包已经被容许接收。这使得暂时性的端口只有在须要时才会被打开,而且会拒绝全部永久 性占用端口的请求,大大地增强了安全性。同时,那些被更改了报头的数据包,即便包含有一个被容许的目的地址和端口,也会被检测到并被丢弃。此外,有状态的 防火墙可以指定并记住为发送或接收信息包所创建链接的状态。防火墙能够从信息包的链接跟踪状态得到该信息。在决定新的信息包过滤时,防火墙所使用的这些状 态信息能够增长其效率和速度。

1.启动和中止iptables

下面将正式使用iptables来建立防火墙。启动和中止iptables的方法取决于所使用的Linux发行版,能够先查看所使用Linux版本的文档。

通常状况下,iptables已经包含在Linux发行版中,运行iptables --version来查看系统是否安装了iptables。在Red Hat 9.0中,安装的版本是iptables v1.2.7a。若是系统没有安装iptables,则能够从http://www.netfilter.org下载。

2.查看规则集

上面仅对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是最经常使用的表,在filter表中最经常使用的三个目标是ACCEPT、DROP和REJECT。DROP会丢弃数据包,再也不对其进行任何处理。REJECT会把出错信息传送至发送数据包的主机。

图1 Red Hat 9.0中安全设置的GUI工具

在Red Hat 9.0中,提供一个GUI程序来让用户对系统的安装级别进行简单的配置。该工具的启动方法是:主选单→系统设置→安全工具(如图1所示)。在此将安全级别 设为“高级”,并选择使用默认的防火墙规则。点击肯定后,再用iptables -list显示,发现iptables与没有定义规则前已经有很大不一样,以下所示:

[root@workstation root]# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
RH-Lokkit-0-50-INPUT  all  --  anywhere             anywhere
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
......

现实中通常不使用这个GUI工具,由于它的功能有限,也不够透明。相比较而言,SuSE 9.0中相应的配置工具要好得多,它能够在GUI下对防火墙进行更加细化的配置(好比增长了IP转发和假装等功能的配置)。尽管这样,通常仍是本身来增长和删除规则。

3.增长规则

本例中的规则将会阻止来自某一特定IP范围内的数据包,由于该IP地址范围被管理员怀疑有大量恶意攻击者在活动:

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

也能够很轻易地阻止全部流向攻击者IP地址的数据包,该命令稍有不一样:

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

注意这里的A选项,如前所述,使用它说明是给现有的链添加规则。

4.删除规则

网络上的恶意攻击者老是在变化的,所以须要不断改变IP。假设一个网上攻击者转移到新的IP地址,而其老的IP地址被分配给一些清白的用户,那么这时这些用户的数据包将没法经过你的网络。这种状况下,可使用带-D选项的命令来删除现有的规则:

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

5.缺省的策略

建立一个具备很好灵活性、能够抵御各类意外事件的规则须要大量的时间。对于那些没有时间这样作的人,最基本的原则是“先拒绝全部的数据包,而后再容许须要的”。下面来为每个链设置缺省的规则:

# 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

6.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数据包。SYN用于初始化一个TCP链接,若是本身机器上没有运行任何服务器,别人也就不会向你发送SYN数据包。

7.有状态的数据包的检测

前边的例子把每个数据包当作是独立的,而不是相互关联的,依靠的是数据包的头信息。iptables会检查数据包的源和目的IP地址、源和目的端口、流 入数据包的顺序号、TCP前后顺序的信息及头标记(SYN、ACK、FIN、RST等)的状态,即它会跟踪整个链接会话,从而使整个过滤过程是相互关联 的。

8.共享一个Internet链接

网络地址翻译和IP假装均可以实现多台主机共享一个Internet链接,这个局域网能够是 Linux和Windows系统组成的多系统局域网。假设如今有一台机器,配有两个网卡,其中eth0为“公共”网卡,eth1为“私有”网卡,即 eth0被分配了一个静态的、可路由的IP地址,而eth1被分配了一个私有的、不能路由的IP,该IP是属于该局域网子网的。要实现上述功能,须要向 nat和filter表中添加一些链:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT

这显示了有状态的数据包检测的价值。请注意,这里是如何实现流入数据包只有在属于一个已经存在的链接时才被容许,而全部来自局域网内流向外的数据包则都容许经过。第一条规则让全部流出的信息看起来都是来自防火墙机器的,而并不会显示出防火墙后面还有一个局域网。

下面的命令为FORWARD和POSTROUTING链设置缺省的策略,在使用假装时,有一个缺省的POSTROUTING DROP策略很是重要,不然就可能有心怀恶意的用户突破网关后假装本身的身份。

# iptables -t filter -P FORWARD DROP
# iptables -t nat -P POSTROUTING DROP

下面的命令为拨号链接设置,它能够动态地分配IP地址:

# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

9.运行服务器时的状况

有时也会把服务器放置在防火墙后面,这时iptables就须要知道从哪儿经过数据包,设置以下所示:

# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80
# iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25

10.规则的保存

到如今为止,全部的例子都是在命令行中进行的。在测试新的规则时,这是一种很好的方式,但一旦测试结果使人满意,就能够将它们保存为脚本。可使用 iptables-save 命令来实现:

$ iptables-save > iptables-script

信息包过滤表中的全部规则都被保存在文件iptables-script中。不管什么时候再次引导系统,均可以使用iptables-restore命令将规则集从该脚本文件恢复到信息包过滤表。恢复命令以下所示:

$ iptables-restore iptables-script

若是愿意在每次引导系统时自动恢复该规则集,则能够将上面指定的这条命令放到任何一个初始化Shell脚本中。

下面的例子并非一个完整的脚本,它只是描述了如何使用变量及提供了一些附加的规则样例。

#!/bin/sh
#为变量赋值
IPTABLES=/sbin/iptables
LAN_NET="192.168.1.0/24"
IFACE= "eth0"
LO_IFACE="lo"
LO_IP="127.0.0.1"
#加载所需的内核
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
#缺省状况下,IP转发都处于不可用状态,将其设置为可用状态:
echo "1" > /proc/sys/net/ipv4/ip_forward
#使IP的动态分配功能可用
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
#每次重启这个脚本时,最好清除之前所设的规则
$IPTABLES -P INPUT DROP
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -F -t nat
#只容许在LAN中使用SSH链接
$IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT
#容许loopback!
$IPTABLES -A INPUT -i lo -p all -j ACCEPT
$IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
#丢弃那些流入的宣称是来自本地机器的数据包
#丢弃那些流出的不是出自本地机的数据包
$IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP
$IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP
#限制一些流出的信息
$IPTABLES -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP
$IPTABLES -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP
#此外,3133五、2744四、2766五、20034 NetBus、970四、137-139(smb)端口也应被禁止。
相关文章
相关标签/搜索