扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
2007年8月15日
关键字:
在本页阅读全文(共2页)
在要从不同级别执行包过滤服务之前,您得建立符号链接。网络已经启动的情况下,首先确认包过滤器已运行在初始级别2和3下。
# ln -s /etc/rc.d/init.d/packetfilter /etc/rc.d/rc2.d/S09packetfilter
# ln -s /etc/rc.d/init.d/packetfilter /etc/rc.d/rc3.d/S09packetfilter
以上两条命令建立了符号链接,从而保证在 Red Hat Linux 的网络有效前启动包过滤器。某种网络服务的名称应该类似于 SXXnetwork,其中的 "XX" 指定了该服务的启动次序。请选择一个其他启动脚本内未指定的,比所有网络服务启动次序号都低的"XX"。上面的例子中,网络启动脚本命名为 "S10network" 。
类似的,在网络服务关闭后也应该停止包过滤器的符号连接。该例子中,网络接口关闭位于脚本 K90network,因此包过滤器脚本链接为 K91packetfilter。
# ln -s /etc/rc.d/init.d/packetfilter /etc/rc.d/rc0.d/K91packetfilter
# ln -s /etc/rc.d/init.d/packetfilter /etc/rc.d/rc1.d/K91packetfilter
最后,在 Red Hat 系统中,您务必确保文件 /etc/sysconfig/network 中含有下列条目:
FORWARD_IPV4="yes"
一旦重新启动机器,包过滤器就启动了。到目前为止,您还没有制定任何过滤规则。下面我们将继续这个规则设置步骤。
配置防火墙
如果您用了防火墙,就可以使用公共因特网上无效的某段网址,或者用 NAT 。这样,主干网的主要路由器将视那些来自私人地址的包为非法而予以丢弃。这些段址已经定义并在文献 RFC 1918 列举出来(参看表 1)。这样的段址共有三套,但对于绝大多数公司来说,192.168.0.0 就足够了。在下面的例子中我们也将采用这套段址。
表 1: 分配给私有网络的 IP 地址
起始地址 结束地址 CIDR 段址前缀 地址数目
10.0.0.0 10.255.255.255 10.0.0.0/8 ~ 16,000,000
172.16.0.0 172.31.255.255 172.16.0.0/12 ~ 4,000,000
192.168.0.0 192.168.255.255 192.168.0.0/16 ~ 65,000
您的内部网的全部机器都应该用这些给定地址范围来标识。比如 192.168.1.22 防火墙的内部接口应占用第一个地址 192.168.0.1。以 .0.0、.0、.255 和 .255.255 结尾的是系统保留地址,所以不要把他们分配给任何机器。在起始地址和结束地址范围之内的其他 IP 地址可按个人喜好分配.
下面的例子包括四个台式机和四个服务器。名为 stranger 的台式机禁止进入防火墙保护的内部网络,而 familiar 则可以。名为 Freedom 的服务器位于公司内部网络,但不受防火墙保护,这对向公开的网站来说是常见的。分配给这些机器的网络地址是随便给定的,但是它们被划分成不同的网络地址集合 (192.168.x.x 分配给防火墙内部网, 216.19.15.x 分配给防火墙外部但仍处于公司内部的网络, 198.102.x.x 指的是公共因特网址)。
表 2: 链操作命令
命令 陈述
ipchains -N 创建一个新链
ipchains -X 删除已有链
ipchains -L 列出链中的所有规则
ipchains -F 删除链中的所有规则,但仍保留该链
ipchains -Z 删除与链相关的统计数据
ipchains -P 设置链的全部策略(接受 ACCEPT, 否决 DENY, 拒绝 REJECT, 屏蔽 MASQ, 改向 REDIRECT, 返回 RETURN 等)
ipchains -M -L 列出所有使用屏蔽的链
ipchains -M -S 对所有使用屏蔽的链,根据协议不同而分配若干超时限制
表 3: 定义过滤规则的命令
命令 陈述
ipchains -A 将规则添加到链中
ipchains -D 根据规则在链中的位置,删除该规则
ipchains -R 根据规则在链中的位置,用新规则取代它
ipchains -I 将新规则插入到链中的指定位置
ipchains -C 使用链中的规则来过滤 protocol-info 中的内容,从而测试该链
表 3 中的过滤规则命令需要指定源和目的地址、协议类型和相关的端口号、其他IP协议的标志、以及所施行于它们的规则。这些规则条目可以逐一列出,以便或含糊或准确的描述被过滤掉的包的类型。
源地址 (-s) 和目的地址 (-d) 具有相同的格式。您可以具体指定单个主机地址或某网络的一组主机地址。前一种情况,只需要插入主机地址;后一种情况则需要指定网络地址和网络地址掩码或比特掩码。比特掩码和网络掩码的作用是一样的,不同于网络掩码给定四组十进制数,它从网络掩码的左端开始计入比特数。例如,网络掩码 255.255.255.0 等效于比特掩码 24,255.255.224.0 等效于 19。不方便的是,您不能指定任意范围的网络地址,比如从 192.168.1.1 到 192.168.1.133 ―― 因为您无法用合适的网络掩码来表示它们。这个软件不得不这么工作,因为想要使它有效地过滤任意一段网络地址实在是太困难了。
规则 陈述
-d 192.168.1.24 -j ACCEPT 接受所有发送到 192.16.1.24 (Jane) 的包
-d 192.168.0.0/255.255.224.0 -j DENY 拒绝所有试图到达 192.168.1.0 到 192.168.31.255 范围中某个地址的数据包,这就意味着 Bob, Fred 和 Jane 的主机都被保护起来,而 Olivia 则没有。
-d 192.168.0.0/19 -j DENY 和上一命令相同,只是用比特掩码来表示范围的结束地址。
上面的例子展示了目的地址的细节(用 -d ),但和源地址的用法是相同的(只是代之以 -s )。下一个策略组件是协议类型。ipchains 支持三种常用的传输协议类型:TCP、UDP 和 ICMP。其他协议仍处于试用阶段,这里略过不谈。
-p TCP -s 192.168.1.24 -j ACCEPT 接受所有来自 Jane (192.168.1.24) 的包
-p TCP -d 192.168.0.0/19 -j DENY 否决所有到达 Bob, Fred 和 Jane 的 TCP 包
-p TCP -d 192.168.1.24 80 -j ACCEPT 接受到达 Jane 机器80端口的所有 TCP 包
-p TCP -d 192.168.1.24 www -j ACCEPT 和上一命令类似,但用 www 来表示缺省的 Web 服务器端口。在 /etc/services 文件中定义了此端口。
-p TCP -d 192.168.1.24 0:1024 -j DENY 否决所有要到 Jane 的0到1024范围中任何一个端口的 TCP 包。
-p TCP -d 192.168.1.24 www -j ACCEPT 接收要到 Jane 机器上 www 端口(缺省情况下即80端口)的所有 TCP 包。
-p TCP -d 192.168.1.24 ! www -j DENY D 否决要到 Jane 机器上 www 之外任何端口的 TCP 包。命令中的感叹后(!)表示对它后面的值取非,这里即用 ! www 来表示除了 www 之外的所有端口值。
-p TCP -d ! 192.168.1.24 www -j DENY 否决要到除了 Jane 之外的其他机器 www 端口的所有 TCP 包。注意这条命令与上一条并不相同。
-p TCP -d ! 192.168.1.24 ! www -j DENY 否决所有要到 Jane 之外的其他机器,并且非 www 端口的 TCP 包。也就是说,它允许那些到达 Jane 的 www 端口的 TCP 包。尽量不要用这样的规则,以免引起混乱。
-p ! TCP -d 192.168.1.24 -j DENY 否决所有要到 Jane 机器上的 TCP 之外的数据包。
对于 UDP 协议,其工作情况类似。而对于支持 ping 和 traceroute 的 ICMP 协议则需要指定端口.
-p ICMP -d 192.168.1.24 0 -j ACCEPT -p ICMP -d 192.168.1.24 8 -j ACCEPT 接受对 Jane 的 ping 包。为了让 ping 正常工作,这两条规则(ICMP 端口0 和 8)必须分开写。
-p ICMP -d 192.168.1.24 3 -j ACCEPT 如果 Jane 机器上的用户试图访问一个远程站点,所返回的“无法到达” ICMP 消息允许通过。访问一些远程机器的 telnet 或其他服务时,常有这种没有回应的情况发生,因此通常都会使用这条规则。
-p ICMP -d 192.168.1.24 11 -j DENY 否决来自防火墙外部 traceroute 命令的数据包。
除了地址和协议信息,您还可以指定通过包的网络接口驱动程序。如果要加入考虑数据包的来源,是比较容易的,在指定过滤规则应用的网络端口时也很有用。
-i eth0 -s 192.168.1.24 -j ACCEPT 使用第一块以太网卡 (eth0) 来接受所有来自 Jane 的数据包。
-i eth+ -s 192.168.1.24 -j ACCEPT 可以用任何一块网卡 (eth+) 来接受来自 Jane 的数据包。
-i ppp0 -p TCP -s 198.102.68.2 1025:65535 -j ACCEPT 通过 ppp 接口,来接受所有来自 familiar (198.102.68.2) 1025 到 65535 端口之间的 TCP 包。
有两种特殊的策略组件指定 TCP_SYN 标志 (-y) 和碎片包 (-f)。当 TCP 客户端第一次试图连接远程 TCP 服务器时,TCP_SYN 标志被设置。不幸的是,黑客会利用它攻击远程服务器,其做法是发送大量 TCP_SYN 消息而不真正连接服务器,从而锁住所有服务器进程,使其速度变慢或使服务器崩溃。只要为该组件指定 TCP 组件 -p,就可以阻止外部的 TCP_SYN 攻击。
碎片包过滤规则组件是必要的,因为 IP 包常常通过不同容量的的网络连接。有时他们不得不分成一些名为 碎片 的更小的包以便顺利通过小容量的连接通道。在 PPP 协议下用调制解调器连接网络时常发生这种情况。例如,以太网可以传送长为 1500 字节的 IP 包,而调制解调器(串行线)的包通常是 256 字节;以太网量级的包不得不分成六份以符合调制解调器量级的碎片包。到达目的机器后,这些碎片包就被组合起来。因此,在 PPP 或 SLIP 协议下使用调制解调器连接网络时,您应该指定这个规则组件,这样防火墙才会把包视作一体。也只有如此它才能正确辨识传输层协议( TCP, UDP, ICMP) 信息,从而实施其他规则。
在命令行下运行以上规则,并用 /sbin/ipchains -L 命令检查其顺序是否正确。接着还要按照"开始/关闭"脚本指定的文件名来保存这些规则(我们的例子中,该文件是 /etc/firewall.rules )。下次系统启动时就会使用这些规则了。需要注意的是,每次您定义新规则都必须运行以下命令:
# /sbin/ipchains-save >/etc/firewall.rules
接下来给出一些配置实例,您可以看到如何为防火墙制定规则。
一些配置实例
这个例子是最简单的防火墙模型,只允许位于保护范围内的机器访问外部网络,但禁止任何外部机器进入内部网络。您首先要拦截由任何接口流出的所有包,然后只让那些具有转换过的地址信息的包通过。
# /sbin/ipchains -P forward DENY
# /sbin/ipchains -A forward -f -i ppp0 -j MASQ
采用以上两个规则,则在包流出之前,所有安装了防火墙的机器(Bob,Fred,Jane 和 Olivia)都被屏蔽了。同时禁止防火墙外部的机器接触任何内部设备。这里并没有涉及路由器,实际上本例中的防火墙是通过调制解调器建立到因特网 PPP 连接的。
嵌入路由器的防火墙代码并不少见。很多时候,防火墙和路由器可能位于同一机器。另一方面,利用 PPP 的调制解调器方案,防火墙就成为路由器,路由指令把所有非本地数据流转发到 PPP 端口。
您可能希望防火墙的功能复杂些,例如所有保护范围内的机器都可连到外部去,而只有指定的外部机器才能连接进来。下面的例子准许名为 familiar 的机器 (198.102.68.2) 连接到防火墙内部机器的某些指定端口 (telnet、FTP 和 WWW 等服务的公共端口)。
# /sbin/ipchains -P forward DENY
# /sbin/ipchains -A forward -f -i eth0 -j MASQ
# /sbin/ipchains -A input -i eth0 -s 198.102.68.2 -j ACCEPT
# /sbin/ipchains -A output -i eth1 -s 198.102.68.2 -d 0/0 -j DENY
# /sbin/ipchains -A output -i eth1 -s 198.102.68.2 -d 0/0 telnet -j MASQ
# /sbin/ipchains -A output -i eth1 -s 198.102.68.2 -d 0/0 ftp -j MASQ
# /sbin/ipchains -A output -i eth1 -s 198.102.68.2 -d 0/0 ftp-data -j MASQ
# /sbin/ipchains -A output --i eth1 s 198.102.68.2 -d 0/0 www -j MASQ
在我们的例子中,有台名为 Freedom 的服务器位于防火墙网络外但处于公司网络内部。这是一台任何机器都可达的公共网页服务器,它和互联网上其他计算机一样,可能遭受外部世界的攻击和破坏。不过我们可以假定它足够安全,并允许其连接到防火墙内部网络。这就需要添加下列规则:
# /sbin/ipchains -A input -i eth0 -s 216.19.15.32 -j ACCEPT
# /sbin/ipchains -A output -i eth1 -s 216.19.15.32 -d 0/0 -j MASQ
应用协议
有些应用要求协议包含正确的主机地址信息,否则无法工作。这些应用可能会将网络或主机地址信息嵌入到 TCP 或 UDP 包里,但包过滤器一般不深入探究这些包中的内容。
如此一来,为了过滤这些应用协议内核还需要加载另外的模块。这些模块包含某些协议,能够支持 FTP、RealAudio、IRC、VDO Live、CU SeeMe 甚至某些流行的游戏 Quake 等。
为了加载这些模块,可以在先前的"开始/关闭"脚本中加入以下用于特殊协议的代码行:
/sbin/modprobe ip_masq_raudio
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_cuseeme
/sbin/modprobe ip_masq_vdolive
/sbin/modprobe ip_masq_quake
/sbin/modprobe ports=ip_masq_quake 26000,27000,27910
ipchains 具有十分强大的功能,可以把几组规则一次"链接"。当您需要面对许多内部节点,并为它们分别定义网络数据包策略时,这种建立多链条的能力就更加重要。这些链条被指派给特定的网络接口,改变接口开关的安全规则(例如网络连接接通或断开)。
ipchains 将继续升级。随着下一内核版本 (2.3.x 和 2.4.x) 一起发布 ipchains 新版本,名为 netfilter 。新版本软件将能执行一些设计精巧的组件,例如逆向网络地址转换 (reverse NATs),用于使一组内部网机器为某个地址进行负载平衡。
一般情况下,有效使用 ipchains 可以让您的内部网络细节受到防火墙良好的保护。它赋予您那台"慢吞吞"的老机器以崭新的使命,变成网络里相当有用的一员。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。