用Linux实现路由器和包过滤防火墙
【路由器和防火墙】
路由器是一种广泛运用在IP网段之间的设备,市场上有许多现成的产品。在应用中,我们经常将路由器跨接在广域网和局域网之间,大多数的路由器产品也就是基于这种需要来设计的。但是随着用户IP网络的扩展,我们需要一种能够在多个以太网络之间进行寻址的路由器,传统的路由器产品中偶尔有几款双以太网络接口的,但是这样的产品价格尤其昂贵,而且要是支持快速以太网络应用的话价格将是天文数字;第三层交换机可以实现这样的功能,但是第三层交换机也不是便宜的家伙。
路由器工作的时候,根据它的某个端口收到的数据包的目的IP地址,查询路由器自己的路由表,然后决定将数据包转发到相应的端口。路由器的路由表有几种:一种是根据路由器自己的每个端口IP地址和子网掩码计算出来的路由,这种路由叫做“固定路由”;第二种是有系统管理员种设置的到某个子网需要通过某个下一级路由器的路由,这种叫“静态路由”;还有就是在网络环境中让每个路由器都把自己的路由信息广播出去,让路由器之间进行互相学习,这样学到的路由就叫做“动态路由”。路由器还会把目的地址不在自己路由表中的数据包固定转发给一个预先设定IP地址,这样的路由设置又叫“默认路由”。在路由匹配的过程中,一般有这样的优先级:固定路由静态路由动态路由默认路由。
路由器只会查看IP数据包的目的地址,也就是说原则上它是“照单全收”,而且全部转发,除非真的发不出去了。如果让路由器在转发数据包的时候,加一项检查,检查数据包的来源和数据包要求的应用层服务类型,根据预先设计的规则来判定这个数据包是应该转发还是作别的处理,这样这个路由器就不再是一个单纯意义上的路由器,而是一种类型的防火墙――包过滤防火墙。
包过滤防火墙可以检查数据包的来源、源端口、目的地址、目的端口,使用的传输层协议类型等项目,根据检查的项目的内容来匹配一个规则表,当符合规则表中的定义的时候,就执行规则表事先定义的操作。一般来说,规则表可以定义这样的操作:ACCEPT(通过)、NAT(MASQ地址转换)、DENY(丢弃)、REJECT(拒绝,同时回送‘不可用’消息给源端)。
当然目前市场上也能买到支持包过滤防火墙的现成产品,但是价格问题还是我们不得不考虑的重要因素。尤其大多数产品都有许多许可证、性能等方面的限制。
Linux操作系统应运IP网络而生,除了Linux价格上的优势之外,更吸引人的是它内建的强大的网络功能,除了做各种Internet上的应用服务之外,Linux还提供了完整的路由器功能和防火墙功能。而它所带来的系统造价和功能的比例是相当诱人的,为什么不一试呢?
【Linux系统的准备】
相对于现成的路由器产品,我们把这样的路由器称为“软路由器”,当然这样做出来的路由器性能绝对不会比“硬件路由器”的性能差,我们只要明白比如很多“25××”系列的路由器才只是采用25M主频的摩托罗拉68030CPU(性能相当于Intel 80386)我们就知道了。
用来做“软件路由器”的Linux系统主机硬件配置要求并不是太高,用作三五个局域网之间的路由选择,数百台计算机的话,选用奔腾133以上的主机就足够了,当然现在的市场上赛杨2或者奔腾4或者其他的CPU也不是很贵;配置64M内存,有条件的话可以配置到128M也无所谓;硬盘就不要太大了,否则也是浪费.
关键在于网络适配器的配置,Linux系统支持大多数市场上能见到的以太网络适配器,PCI卡的安装比较简单,只要内核支持,在开机的时候有多少卡都会被系统正确的识别出来。ISA卡的安装也不复杂,详细可以参考我以前的一篇文章
www.nyfzns.net www.520cat.com
下面是我在实际使用过的能够正常工作的网卡:
★Intel EtherExpress Pro PCI100M
★RealTek 8029/8139 PCI 10M/100M
★D-link 系列 (使用Tulip 2114X驱动) PCI 10M
★ACCTON EN1207 (使用Tulip 2114X驱动) PCI 100M
★3COM全系列 (PCI/ISA 10M/100M)
★AMD PC-NET 32 PCI 10M
★大部分NE2000兼容网卡,Topstar、Dlink、ACCTON、SN2000等等
★HardLink PCMCIA 笔记本专用网卡 10M
当然Linux能支持的网卡远远不止这些.
将网卡驱动加挂到Linux中有几种方法,最常用的是用modprobe系统工具加挂一个内核模块,比如加载一个NE2000兼容网卡的驱动可以这样:
#modprobe ne io=0x300
其实大多数的PCI网卡并不需要指定IO地址范围,就像加载一个ACCTON的EN1207c网卡可以这样:
#modprobe tulip
将网卡驱动编译到Linux内核中是一种最高效的做法,在编译Linux内核的时候,使用
#make menuconfig
代替很多老资料上提到的“#make config”,这样就会得到一个菜单,在菜单中“Network Device”选项下选定指定的网络适配器的驱动程序,编译完成以后就会得到一个完整的支持相应网卡的Linux内核。
对于很多系统只能识别一个的网卡,将第二个以后的网卡参数写在/etc/lilo.conf中是最佳做法,这里有一个系统中安装呢4块网卡,一个是PCI的RealTek 8139,另外3个是NE2000,这样的话系统就识别8139网卡以后就不会自动识别后面的三个ISA卡,我们需要在/etc/lilo.conf中加上这样一句:
append=-ether=3,0x240,eth1 ether=11,0x300,eth2 ether=4,0x260,eth3-
在编译内核的过程中,我们可以在Network option中选择“optimize as router not host”,这样系统就会按照路由器而不是主机的方式进行优化,同时,还可以根据具体的需要选择上“ Fast switching”和“ Forwarding between high speed interfaces”以及“ advanced router”。如果我们还计划在这个机器上实现包过滤防火墙,那么选择上“ firewalling”和“ IP: masquerading”以及与“IP MASQ”相关的选择项。
编译内核的全部过程请参看“Linux Kernel Howto”。在http://howto.fhlfox.dhs.org/online....闹形木迪癜姹尽?/a
注意查看开机的系统提示或者使用dmesg命令可以看到系统是不是正常识别并且启动相应的网卡的驱动程序,在上面例子中提到的具有一个Realtek8139网卡,三个NE2000网卡的机器上我们能够看到这样的情况:
rtl8139.c:v1.07 5/6/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/r
tl8139.html
eth0: RealTek RTL8139 Fast Ethernet at 0x6000, IRQ 9, 00:e0:4c:dd:5f:85.
ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)
NE*000 ethercard probe at 0x240: 00 40 05 1f 60 9a
eth1: NE2000 found at 0x240, using IRQ 3.
NE*000 ethercard probe at 0x300: 00 40 05 22 08 65
eth2: NE2000 found at 0x300, using IRQ 11.
NE*000 ethercard probe at 0x260: 00 40 05 23 59 0f
eth3: NE2000 found at 0x260, using IRQ 4.
然后是配置每个网络端口的IP地址,当然我们可以使用操作系统的一些对话框来配置第一个网卡的参数,但是一个有经验的网络管理员一般是不这样做的,因为这样不能配置其他的网卡,我们必须学会用这个命令来配置第一块网卡:
#ifconfig eth0 10.3.3.3 netmask 255.255.255.0 broadcast 10.3.3.255
第二块网卡的名字就是eth1,其他依次是eth2,eth3等等。
由于计算机体系结构的限制,在一个普通PC主板上只有一个PCI控制器,而一个PCI控制器最多只能同时支持4个PCI设备,当然某些专用服务器上可能有支持两个以上的PCI控制器。ISA网卡的安装受到系统中断号的限制,单CPU的系统中只有16个可用的IRQ号,扣除硬盘、内存、键盘、显示卡等硬件已经所剩无几,所以一般也是安装4个卡,当然,双CPU的系统可以有256个中断号可用,这样就宽裕了许多。
另外,我们还需要打开Linux系统的IP转发开关,这一点非常容易,执行这一条指令:
echo 1
/proc/sys/net/ipv4/ip_forward
当然这些配置命令最好是放到/etc/rc.d/rc.local中,这样就不用每次开机以后重新配置了。
【Linux实现路由器】
正确配置?ê拖嘤Φ纳P地址等参数以后,系统就自动计算出了每个端口所接的子网的固定路由,在这样的一个例子中我们可以看到:
我们可以用命令“route -n”或者“netstat -r -n”来查看系统目前的路由表,在右边图二所示的例子中,我们可以得到这样的路由表:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0
10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3
10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
其中Destination项表示目的网络,其大小可以通过子网掩码(Genmask)计算出来,Flags项表示这个网段是否直接连接的,“U”就是直接可用的意思,Metric是级跳,Ref是优先级参考,Use Interface是连接的端口,Gateway栏目在需要其他路由器转发的时候指明下一级路由器的地址。
使用命令route同时还可以建立或者删除一个静态路由,使用这样的格式:
#route add -net 目标子网地址 netmask 目标子网掩码 gw 下一级路由器的地址
同理,使用
#route del -net 目标子网地址 netmask 目标子网掩码 gw 下一级路由器的地址
可以设置静态路由。
使用
#route add default gw 网关地址
或者
# route add -net 0.0.0.0 netmask 0.0.0.0 gw 网关地址
我们把路由设置命令加到/etc/rc.d/rc.local中,以便其能够在下次启动的时候自动的运行所