2010年(49)
分类: 嵌入式
2010-09-07 15:17:58
静态路由是网络管理员再已知网络拓扑情况下手动添加的路由信息;而动态路由则是路由器根据对网络拓扑变化的检测动态改变路由信息。静态路由,linux2.6内核提供了route命令来修改系统路由信息;动态路由,必须添加相应的路由协议如RIP、OSPF等等。
无论是静态还是动态路由,都只是更改系统路由表而已;虽然方式不同,但是结果相同。而IP包的转发是Linux2.6内核根据路由表来完成的,必须打开内核的包转发功能,否则再正确的路由表也没有用。
echo "1" > /proc/sys/net/ipv4/ip_forward |
考虑如图1网络拓扑。
图1 网络拓扑
在这里必须明确一点:在数据链路层上相互连接的两个网络接口必然处于同一网段。这个概念对于解读路由表时非常重要。
如图2所示,路由器1使用linux下route命令得到的内核路由表。
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 192.168.0.2 255.255.255.0 UG 2 0 0 eth1 192.168.2.0 * 255.255.255.0 U 0 0 0 eth0 192.168.0.0 * 255.255.255.0 U 0 0 0 eth1 default 192.168.2.254 |
图2 路由信息
其中各个字段的解释如表1所示。
表1 路由信息字段解释
字段 |
含义 |
Destination |
目的网络或目的主机 |
Gateway |
网关即下一跳地址,若无则用“*”表示, |
Genmask |
子网掩码 |
Flags |
见表2 |
Metric |
路由距离 |
Ref |
路由项引用次数。Linux内核没使用 |
Use |
查找路由项的次数 |
Iface |
该路由表项对应的网络接口,即转发出口 |
Flags的意义如表2所示。
表2 Flags意义解释
Flag |
含义 |
D |
由路由的后台进程动态安装 |
H |
目的是一个主机 |
G |
使用网关 |
M |
由路由的后台进程修改 |
R |
恢复动态路由产生的表项 |
U |
路由是活动的 |
! |
拒绝路由 |
在路由器1中的路由主要分为三类。第一类是访问与本路由器网络接口在数据链路层相连的同一网络的主机。如果是同一网络,则路由的IP包直接从相应的网络接口转发,没有下一跳的概念。主要最后一个Iface就代表了IP包转发出口。同时,这第一类路由信息也是跨网段转发的基础。
第二类就是跨网段转发。
Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 192.168.0.2 255.255.255.0 UG 2 0 0 eth1 |
注意,跨网段时,下一跳地址是192.168.0.2,而至于如果到达192.168.0.2,就是上述第一类路由所管辖的事情了。这里的下一跳地址必然不是路由器自身的网络接口,这一点要注意,这也是我一开始的错误观念。
第三类就是默认路由信息了,该信息同第一类类似,对于在路由表中找不到路由信息的IP包,使用默认路由信息。
route命令可以查看内核路由表,静态添加、删除路由信息。使用man route命令可以看到route的说明。使用man route|col –b > route.txt可以导出txt格式的说明文件。
(1)查看路由表
route
(2)添加到一个网络的路由
route add -net 192. 168.2.0 netmask 255.255.255.0 dev eth0
(3)添加到一个主机的路由
route add –host 192.168.2.1 netmask 255.255.255.0 dev eth0
(4)删除一条路由
route
route
(5)添加默认路由
route add default gw 192.168.2.254
(6)删除默认路由
route
这里讨论的动态路由都是指IGP及内部网关协议,常见的包括rip2、ospf等。Zebra是一种开源的路由协议实现源码,支持多种标准的IGP路由协议。本文所指的动态路由的实现就是基于zebra实现的。另外,由于zebra更新较慢,所以出现了基于zebra的quagga,但是下载了quagga编译一下,没过,所以依然使用zebra了。不过quagga的手册写的不错。
(1) 内核配置选项
在zebra的手册中,明确要求以下三项必须选中,具体原因参考手册。
CONFIG_NETLINK
CONFIG_RTNETLINK
CONFIG_IP_MULTICAST
(2) 网络接口的多播地址
由于路由协议使用多播地址来交换路由信息,所以网络接口必须支持多播帧的传输。调试初期,我们曾经犯过这个错误。如果网络接口驱动程序提供了设置多播地址的接口,那么使用如下语句可以打开所有多播地址。
ifconfig eth0 allmulti |
如果网络接口驱动没有提供相关接口,就只有修改驱动程序直接支持多播地址了。
从官方网站 上下载最新的zebra版本zebra
第一步,使用configure配置zebra;
./configure --host=i686-pc-linux --build=ppc CC=ppc_8xx-gcc --enable-vtysh --disable-ipv6 --prefix=/usr/zebra --disable-ripngd --disable-ospf6d --disable-bgp-announce |
上述配置指明了交叉编译链,指明了关闭ospf6d等路由协议,保留了ripd,ospfd等路由协议。具体选项参考zebra手册。
第二步,使用make命令编译;
第三步,使用make install命令安装。这样在prefix中指定的目录下就出现了zebra的编译结果。
在安装目录下,sbin目录里是zebra的主程序,分为两类,一类是zebra可执行文件,该程序负责同内核交换,修改内核路由信息;另一类是各种路由协议如ripd、ospfd等。这些路由协议运行后,通过技术网络拓扑并告知zebra如何修改内核路由表。所以,zebra必须在ripd等之前运行。
另外,zebra及ripd等的运行是需要配置文件的,在安装目录下的etc目录下,给出了配置文件示例。
ppc_8xx-strip --remove-section=.note --remove-section=.comment zebra |
Zebra使用netlink socket接口与内核通信,维护路由表,所以zebra必须首先运行。zebra的运行依赖于配置文件。
/sbin/zebra -f /etc/zebra.conf -d |
zebra.conf文件内容示例如下。
! -*- zebra -*- ! zebra sample configuration file ! $Id: zebra.conf.sample,v 1.14 1999/02/19 17:26:38 developer Exp $ hostname Router (为路由器指定名称) password zebra (指定路由器密码) enable password zebra (使密码生效,用于配置zebra时vtysh登录) log file zebra.log (记录zebra行为的文件) |
在zebra启动后,执行如下语句可以登录到zebra的vtysh命令行来配置zebra。由于一般我们的设备不会给用户命令行,所以基本不会用到vtysh。详细的命令格式见zebra手册。
telnet localhost 2601 |
与zebra类似,ripd进程的运行同样依赖于配置文件。
/sbin/ripd -f /etc/ripd.conf -d |
Ripd.conf文件内容示例如下。
! -*- rip -*- ! RIPd sample configuration file ! $Id: ripd.conf.sample,v 1.11 1999/02/19 17:28:42 developer Exp $ hostname ripd (设定用户名) password zebra (设定密码用于vtysh登录) router rip (打开rip路由协议) network eth0 (监听eth0) !network network eth1 (监听eth1) version 2 (运行rip版本2) log file ripd.log log stdout |
注意,监听网络时除了指定网络接口还可以直接指定网段,但是由于我们的系统ip是变化的,所以将网段写在固定的配置文件中是不合适的。另外,理论上在修改了eth0或eth1的ip后,RIP2依然能正常运行,至少在一段时间后收敛,但是测试结果却不行。所以在修改了eth0或eth1的ip信息应该立刻重启ripd。
登录ripd的vtysh方式如下,不过这种配置方法目前不使用。
telnet localhost 2602 |
与CISCO 2611路由器联合测试通过。