十分钟创建一个有效的防火墙
十分钟创建一个有效的防火墙最近几个月,我生活的环境有所改变,使用的电脑也变成了两台通过DSL连接到Internet的笔记本电脑。 一般而言,这种情况的安全性是一个问题。不过对于我的机器来说,没有太大的问题,因为我使用的是Linux,并且有一组设计非常好的iptables规则集。然而,我妻子使用的是一台Windows 98的机器,我个人认为它的安全性非常差。我要为我们的局域网设置一个适当的防火墙。 Linux下的防火墙 在每一个Linux版本中,都有着不同的防火墙软件套件。iptabels(NetFilter)应用程序被认为是Linux中实现包过虑功能的第四代应用程序。第一代是Linux 内核1.1版本所使用的Alan Cox从BSD Unix中移植过来的ipfw。在2.0版的内核中,Jos Vos和其它一些程序员对ipfw进行了扩展,并且添加了ipfwadm用户工具。在2.2版内核中, Russell和Michael Neuling做了一些非常重要的改进,也就是在该内核中,Russell添加了帮助用户控制过虑规则的ipchains工具。后来,Russell又完成了名为NetFilter(http://www.netfilter.org)的内核框架。这些防火墙软件套件一般都比其前任有所改进,表现越来越出众。 NetFilter的目的是为用户提供一个专门用于包过滤的底层结构,用户和开发人员可以将其内建在Linux内核中。iptables是一个内建在NetFilter框架中的一个模块,它可以让用户访问内核过滤规划和命令。如果你了解ipchains就会发现,iptables和ipchains非常相似。事实上,在2.4中,如果加载了ipchains模块,那么ipchains风格的规则也可以被支持。iptables对网络的控制提供了非常强大的功能,它可以向不同的机器路由数据包。在现实中,由于比较复杂,iptables经常被束之高阁。 快速构建防火墙 现在有关编写防火墙脚本以及设置防火墙的书籍有很多,不过我不想把问题复杂化,想在十分钟里建起一个有效的防火墙。 在本例中,网络结构如图1所示。 /qzone/newblog/v5/editor/css/loading.gif图1 网络结构图我们要使用一台装有两块网卡的机器作为防火墙,并且将所有的机器放在防火墙后面的局域网中。在此假设使用的网络地址是192.168.1.0,它可以在防火墙后提供254个主机地址。我们使用192.168.1.1作为防火墙的局域网IP地址(假设绑定的网卡为eth0),假设Internet端的IP地址为300.3.3.3(此地址纯属虚构),绑定网卡为eth1。 我们的防火墙并不需要实现太多的功能,因此,关闭了除ssh以外的所有服务。也就是说可以拒绝除局域网内主机以外的所有连接请求,配置内容如下: machine$ cat /etc/hosts.allowsshd: 192.168.1.machine$ cat /etc/hosts.denyALL: ALL在防火墙上运行的惟一一个其它的服务是DHCPD服务器,用于分配IP地址给局域网内的主机。我们需要配置iptables,使其改写所有从局域网内主机流出的数据包,并对其进行伪装,使它看起来好象所有流出的数据都是出自防火墙本身。 这种设置适用于任何一种Internet连接,它可以是DSL连接、Modem连接等等。这里惟一需要注意的是,必须要知道ISP商提供的IP地址。在此,这个地址是300.3.3.3,在具体的应用中,应该将其更改以符合实际情况。 首先,通过创建一个/etc/dhcpd.conf文件来配置我们的DHCP服务器。下面是该文件的内容: firewall$ cat /etc/dhcpd.conf subnet 300.3.3.0 netmask 255.255.255.0 { } subnet 192.168.1.0 netmask 255.255.255.0 { allow bootp; option routers 192.168. 1.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; # 这些参数可根据需要调整 option domain-name “example.com”; option domains-name-servers A.B.C.D E.F.G.H; range dynamic-bootp 192.168.1.50 192.168.1.254; default-lease-time 18000; max-lease-time 18000; get-lease-hostnames on; }firewall# /etc/init.d/dhcp startInternet Software Consortium DHCP Server 2.0pl4Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.All rights reserved.Please contribute if you find this software useful.For info, please visit http://www.isc.org/dhcp-contrib.htmlListening on LPF/eth1/00:10:18:77:bd:28/192.168.1.0Sending on LPF/eth1/00:10:18:77:bd:28/192.168.1.0Listening on LPF/eth0/00:e0:74:28:e9:e6/300.3.3.0Sending on LPF/eth0/00:e0:74:28:e9:e6/300.3.3.0Sending on Socket/fallback/fallback-netfirewall#
现在,DHCP服务器已经启动,内部的机器通过DHCP服务器可以得到192.168.1.50~192.168.1.254范围内的一个IP地址。在此,我并没有把所有的这个C类地址放在DHCP主机上,所以192.168.1.2范围内的IP地址还可以用于其它的机器。 下面来创建防火墙规则。以下内容位于/etc/init.d中。 #!/bin/sh # 定义EXT_INTERFACE=eth1EXT_IP=300.3.3.3INT_INTERFACE=eth0INT_IP=192.168.1.1 #加载一些需要的模块 modprobe iptable_nat modprobe ip_conntrack_ftp ip_nat_ftp modprobe ip_conntrack_irc ip_nat_irc #设置iptables规则 # Flush any existing tables iptables --flush iptables -t nat --flush for network in 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/5 127.0.0.1/32 do iptables -AINPUT -i $EXT_INTERFACE -s $network -j DROP iptables -A OUTPUT -i $EXT_INTERFACE -s $network -j DROPdone#告诉iptables想要改写所有连接中流出的数据包iptables -t nat -Fiptables -t nat -A POSTROUTING -o $INT_INTERFACE -j SNAT --to-source $EXT_IP# 脚本结束
现在,你的机器就安全了,不但可以为内部机器提供Internet连接,而且还避免了它们直接被外部的机器访问。 结论有的人可能会指出这里面还有一些事情可以做。很显然,如果把防火墙脚本写得再复杂一些,就可以保护很多此处没有提到的东西。但是我们只用了十分钟架设起来的防火墙,已经可以提供具有相当安全性的连接了。
页:
[1]