Linux路由设置入门
2013-06-14 14:48:33 阿炯

什么是路由器
简单的说:路由器的功能就是寻路――给IP包寻找正确的路径以通往目的地,下面是比较详细的介绍。

原理与作用
路由器(Router)用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器来完成。因此,路由器具有判断网络地址和选择路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。它不关心各子网 使用的硬件设备,但要求运行与网络层协议相一致的软件。

一般说来,异种网络互联与多个子网互联都应采用路由器来完成。路由器的主要工作就是为经过路由器的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据--路径表(RoutingTable),供路由选择时使用。路径表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路径表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以 由主机控制。

静态路径表
由系统管理员事先设置好固定的路径表称之为静态(static)路径表,一般是在系统安装时就根据网络的配置情况预先设定的,当网络结构的改变时需管理员手工改动相应的表项。

动态路径表

动态(Dynamic)路径表是路由器根据网络系统的运行情况而自动调整的路径表。路由器根据路由选择协议(RoutingProtocol)提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。

路由器的功能
(1)协议转换:能对网络层及其以下各层的协议进行转换。

(2)路由选择:当分组从互联的网络到达路由器时,路由器能根据分组的目的地址按某种路由策略,选择最佳路由,将分组转发出去,并能随网络拓扑的变化,自动调整路由表。

(3)能支持多种协议的路由选择:路由器与协议有关,不同的路由器有不同的路由器协议,支持不同的网络层协议。如果互联的局域网采用了两种不同的协议,例如,一 种是TCP/IP协议,另一种是SPX/IPX协议(即Netware的传输层/网络层协议),由于这两种协议有许多不同之处,分布在互联网中的 TCP/IP(或SPX/IPX)主机上,只能通过TCP/IP(或SPX/IPX)路由器与其他互联网中的TCP/IP(或SPX/IPX)主机通信,但不能与同一局域网中的SPX/IP(或TCP/IP)主机通信。多协议路由器能支持多种协议,如IP,IPX及X.25协议,能为不同类型的协议建立和维护不同的路由表。这样不仅能连接同一类型的网络,还能用它连接不同类型的网络。这种功能虽然使路由器的适应性变强,但同时也使得路由器的整体性能降低,现在IP协议在网络中越来越占主导地位,因此在下一代路由器(如交换式路由器)只需要支持IP协议。

(4)流量控制:路由器不仅具有缓冲区,而且还能控制收发双方数据流量,使两者更加匹配。

(5)分段和组装功能:当多个网络通过路由器互联时,各网络传输的数据分组的大小可能不相同,这就需要路由器对分组进行分段或组装。即路由器能将接收的大分组分段并封装成小分组后转发,或将接收的小分组组装成大分组后转发。如果路由器没有分段组装功能,那么整个互联网就只能按照所允许的某个最短分组进行传输,大 大降低了其他网络的效能。

(6)网络管理功能:路由器是连接多种网络的汇集点,网间分组都要通过它,在这里对网络中的分组、设备进行监视和管理是比较方便的。因此,高档路由器都配置了网络管理功能,以便提高网络的运行效率、可靠性和可维护行。 一个路由器必然有大于或者等于2的网络接口,这样它才存在路由的功能,否则,如果只有一个接口的话,也就无所谓"寻路"了!这里说的网络接口不一定是物理上的接口,例如网卡或其他,也可以是虚拟的接口,例如隧道入口等。

如前面所描述的,一个路由器上运行的路由信息可以是静态配置的,也可以是动态产生。前者通过手工配置完成、而后者则通过在路由器上运行跑相关路由协议的程序来根据网络状态动态改变内核中的路由表。下面我们仔细介绍一些这两类路由器的配置。通常,一个路由器既有静态配置的部分,又有动态配置的部分,二者结合起来。但最值得学习的是动态路由的原理。

动态路由器的配置
基本原理介绍

从前面的描述中我们可以看到,路由器的基本功能就是为IP分组寻找到达目的地址的路径。我们前一节介绍的是人工手动静态配置路由规则,也就是人为的设定寻路方式。但是因特网是个庞大的系统,上面跑的网络结构负责,而且拓扑结构也在随时改变,这样在某些复杂的范围里我们的静态配置就不一定能获得最佳的寻路路径了。而且一旦网络结构发生改变,我们手动的静态配置也往往无法及时跟着改变。在这 个背景下,产生了动态路由配置的概念,也就是动态路由器。

动态路由器上的路由表项是通过相互连接的路由器之间交换彼此信息,然后按照一定的算法优化出来的,而这些路由信息是在一定时间间隙里不断更新,以适应不断变化的网络,以随时获得最优的寻路效果。为了实现IP分组的高效寻路,IETF制定了多种寻路协议。其中用于自治系统(AS:Autonomous System)内部网关协议有开放式最短路径优先(OSPF:Open Shortest Path First)协议和寻路信息协议(RIP:Routing Information Protocol)。所谓自治系统是指在同一实体(如学校、企业或ISP)管理下的主机、路由器及其他网络设备的集合。还有用于自治域系统之间的外部网络 路由协议BGP-4等。

运行这些路由协议的软件就是我们通常说的路由软件,Linux下常见的路由软件有 gated和zebra。前者既有GPL版本的发行,又有收费的版本;而后者则是日本某组织开发的完全GPL的高效的路由软件。Linux的发行里面一般都缺省就有gated这个软件,我们下面主要介绍它的配置和使用方法。

路由协议的介绍
这里先介绍一下RIP协议。RIP是Routing Information Protocol的缩写,直接翻译就是"路由信息协议"。它计算路由时使用了"距离向量(distance vector)"算法,因此它也被称作"距离向量寻路协议(distance vector routing protocol)。

RIP的特点是路由器间定时地交换网络的整体知识,并且只和相邻路由器交换这种知识。换句话说,路由器只和相邻路由器共享网络信息。路由器一旦从相邻路由器获取了新的知识,就将其追加到自己的数据库中,并将该信息传递给所有的相邻的路由器。相邻路由器做同样的操作,经过若干次传递,使自治系统内的所有路由器都能获得完整的路由信息。

RIP报文用UDP数据报来传送。为了区别于其他的UDP应用,规定RIPng的公认专用UDP端口号为521。主动寻路更新报文的源/目的的端口都是RIPng端口,应答的更新报文送往发起请求的端口。应当注意,IPv4中RIP使用 的端口号是520,与RIPng的有所不同。

定时器爱RIP中有着比较重要的作用。在RIP中为支持寻路操作使用了三个不同的定时器。第一个是启动定时进行RIP更新操作的定时器。此定时器通常设置成30秒。在RIP标准中对其进一步加以限制,它要求路由器对更新报文的发送间隔采用随机数,将RIP更新报文的间隔选取在25秒到35秒之间。其目的是为了避免网络上所有的路由器以相同的定时发送更新报文,大量的业务量压迫网络造成冲突。利用随机间隔可均衡业务量,从而减少路由器的冲突。

RIP在避免冲突方面还有一点需要注意,在触发更新中不论何时发送了报文,不对30秒定时器复位。如果复位,多个路由器的更新报文的发送间隔就会发生冲突。这是由于所有的路由器在发送触发更新后同时启动定时器造成的。如不对该定时器复位,即使与在数秒前刚广播的触发更新报文的内容完全一样,定时的更新报文也照发不误。

RIP使用的第二个定时器时期满(expiration)定时器。路由器只要收到通往特定信宿的路由,就对通往该信宿的期满定时器初始化。期满定时器虽然被设定为180秒,但在稳定的网络中总是每隔30秒被初始化。当网络不稳定时,此定时器的时间区间表示该路由无效。

RIP最后一个定时器时垃圾收集(garbage collection)定时器。路由器对无效路由打上尺度为无穷大的无效标记并将垃圾收集定时器置位。此时,定时器在120秒的区间内工作。在该期间内路由器将尺度费用置成无穷大的同时,继续公布该信宿。以这种方法公布路由,相邻路由表就能迅速从寻路表中删除该路由。

RIP协议也有它的缺陷:
网络直径较小

RIP将尺度(即费用)无穷大定义为16,这一定义对使用RIP的所有网络的规模作出了严格的限制。因尺度必须是整数,故网络的费用至少为1。在基于RIP的Internet中,所有的系统距其他任何系统不能超过15个网络。这一大小被称作网络直径。

这一限制对管理员分配费用的灵活性是一个很大的制约。管理员分配费用最直接的方法是对各个网络的费用都设成1。但在这种分配方式下,RIP就会选择费用最小的路径,而不管该路径上的信道容量的大小。因此会舍弃"较长"的高速路径而通过低效的"较短"路径传送数据。为了避免这种情况的发生,管理员可将大于1的费用分配给低效链路,人为地提高其费用。其结果是最大网络直径随之变小,进一步限制了RIP的网络规模。

对网络变化的反应较慢
RIP网络中的路由器从路由失效到将其识别出来要等待180秒,而在OSPF中典型值是1~2秒。 不支持组播在RIP中没有公布组成员信息的方法,因此不支持组播寻路。为实现组播寻路需和其他协议并用。


route命令
route工具主要功能是管理Linux系统内核中的路由表。它最大的用途就是用来设定静态的路由表项,通常是在系统用ifconfig配置网络接口(例如网卡等)后,用它来设定主机或者一网段的IP地址应该通过什么接口发送等。Route工具有复杂的调用参数。
格式如下:
route [-CFvnee]
route [-v] [-A family] add [-net|-host] target [netmask
Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I]
[reject] [mod] [dyn] [reinstate] [[dev] If]
route [-v] [-A family] del [-net|-host] target [gw Gw]
[netmask Nm] [metric N] [[dev] If]
route [-V] [--version] [-h] [--help]

主要参数说明如下:
-v 使用冗余输出模式。
-A family
指定特定的地址族(例如"inet"、"inet6")。
-n 使用数字显示的地址(例如,202.38.75.75)而不是去解释域名。
-e 使用与netstat相同的输出格式。
-ee 参数会产生很长的输出,包括内核路由表的几乎所有信息。
-net 目标(target)是一个网段。
-host 目标(target)是一个单独的主机。
-F 显示内核FIB路由表。结果可能被-e 和-ee参数改变。
-C 显示内核中路由缓存信息。
del 删除一个路由表项。
add 增加一个路由表项。
target 配置的目的网段或者主机。可以是IP,或者是网络或主机名。
netmask Nm:用来指明要添加的路由表项的网络掩码。
gw Gw:任何通往目的(target )的IP分组都要通过这个网关。
metric M:设置路由表中该项的尺度域(metric field)为M。
mss M 设置TCP的最大分片长度(MSS)M bytes。系统缺省值是536。
window W:设置TCP发送窗口的尺寸为W bytes。
irtt I 设置TCP的初始化回路时间(irtt)I毫秒(1-12000)。缺省情况下按照RFC 1122 规定是300ms。
reject 安装一个阻塞型的路由,这样可能会有路由查找失败。
mod, dyn, reinstate:添加或者修改一个动态路由表项。主要用来测试和诊断。
dev If 强行使用某个特定的输出接口(If),而不用系统去寻找接口。

下面举几个配置的例子:
route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
添加一条路由表项,网段192.56.76.x 应该从接口"eth0"走。

route add default gw mango-gw
添加一条缺省路由(如果没有其他匹配的路由项,就使用这个路由规则)。"mango-gw"是一个主机名,而通往这个主机的路由规则应该事先已经设置好了。

route add ipx4 sl0
给主机"ipx4"添加一条路由规则,使用SLIP接口sl0。

Route命令的输出结果,输出的格式有以下几栏:
Destination:目标网段或者主机。
Gateway:网关地址,如果没有设置,则是"*"表示。
Genmask:网络掩码。

Flags 一些可能的标记如下:
U (路由是活动的)
H (目标是一个主机)
G (使用网关(gateway))
R (reinstate route 动态路由产生的表项)
D (dynamically installed by daemon or redirect)
M (modified from routing daemon or rederict)
! (reject route)
Metric 路由距离。
Ref 路由项引用次数。(linux内核中没有使用)
Use 查找路由项的次数。
Iface 该路由表项对应的输出接口。
MSS 缺省的TCP最大分片尺寸。
Window 缺省的TCP窗口的尺寸。
irtt 缺省的TCP回路时间。
HH (cached only)
ARP入口的数目。
Arp (cached only)
该路由项对应的物理地址是否过期等信息。

下面是route -n的输出实例:
tarn:~$ /sbin/route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
202.38.64.3 202.38.75.62 255.255.255.255 UGH 0 0 0 eth0
202.38.75.75 0.0.0.0 255.255.255.255 UH 0 0 0 eth2
202.38.75.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
192.168.75.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
159.226.0.0 202.38.75.62 255.255.0.0 UG 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 202.38.75.62 0.0.0.0 UG 1 0 0 eth0

上面的输出中我们可以看出,该路由器配置的缺省网关是202.38.75.62,它上面有3个以太网接口(eth0、eth1和eth2)。其中第一条和第二条路由规则是针对一个主机的,其他的都是针对一个网段的,这可以重掩码看出。

gated
gated支持RIP、OSPF、IS-IS等路由协议。我们这里着重介绍RIP协议的配置方法,其他协议的配置大家可以针对协议本身然后参考相关帮助文档做类似的配置就可以。

首先修改/etc/sysconfig/network文件,使得FORWARD_IPV4=yes。然后在/etc/目录下创建文件名为gated.conf的文件,里面就是需要填写的配置信息。RIP协议的配置语法如下:
rip yes | no | on | off [ {
broadcast ;
nobroadcast ;
nocheckzero ;
preference preference;
defaultmetric metric ;
query authentication [none | [[simple|md5] password]] ;
interface interface_list
[noripin] | [ripin]
[noripout] | [ripout]
[metricin metric]
[metricout metric]
[version 1]|[version 2 [multicast|broadcast]]
[[secondary] authentication [none | [[simple|md5] password]] ;
trustedgateways gateway_list ;
sourcegateways gateway_list ;
traceoptions trace_options ;
} ] ;

上面的配置语法用来启动或者禁止RIP协议的运行,并对RIP协议某些参数进行设置。各参数的含义如下:
broadcast:指明RIP分组将被广播。当广播静态路由或者由其他协议产生的RIP路由项时,这很有用。
nobroadcast:指明当然的接口上不广播RIP分组。
nocheckzero:指明RIP不处理RIP分组中的保留域。通常RIP将拒绝保留域为非零的分组。
preference preference:设置RIP路由的preference,其缺省值是100,这个值可以被其他的给定的策略重写。
metric metric:定义当使用RIP广告由其他路由协议获得的路由信息时使用的尺度(metric)。其缺省值为16(不可达)。
query authentication [none | [[simple|md5] password]] ;:设定身份认证密码,缺省是无需认证。
interface interface_list:针对某特定的接口进行参数设定。

可以有的参数如下:
noripin:指定该接口商接收的RIP分组无效。
ripin:这是缺省的参数。与noripin相反。
noripout:被指定的接口上将无RIP分组发出。缺省值是在所有的广播和非广播的接口商发送送RIP分组。
ripout:这是缺省值。与noripout的含义相反。
metricin metric:指定在新添加的路由表项加入内核路由表以前增加的尺度(metric)。缺省值是1。
metricout metric:指定通过特定的接口发出的RIP前,对尺度的增加值。缺省值是0。
version 1:指定发送第一个版本的RIP协议的分组。缺省值是这个。
version 2:在指定的接口商发送第二个版本的RIP协议分组。如果IP组播可以使用,则缺省发送完全第二版本的分组,如果不支持组播,则使用与第一版本兼容的第二版本的RIP分组。
multicast:指明在特定接口上的第二版本的RIP分组使用组播发送。
broadcast:指明在特定的接口上使用广播来发送与第一版本兼容的第二版本的RIP分组,即使该接口支持组播。
[secondary] authentication [none | [simple|md5] password]:定义身份认证的方式。只对第二版本的RIP协议有用。缺省是无身份认证。
trustedgateways gateway_list:定义RIP接收RIP更新分组的网关。gateway_list 是一个简单的主机名或者IP地址的列表。缺省情况下,在共享网络上的所有的路由器都被认为支持提供RIP更新信息。
sourcegateways gateway_list:定义RIP直接发送分组的路由器列表,而不通过组播或者广播。
traceoptions trace_options:设置RIP跟踪选项,详细设置略。


下面是些配置示例:
配置1:
#
# This configuration runs RIP in quiet mode, it only listens to
# packets, no matter how many interfaces are configured.
#
rip yes {
nobroadcast ;
} ;

配置2:
# This configuration emulates routed. It runs RIP and only sends
# updates if there are more than one interfaces up and IP forwarding is
# enabled in the kernel.
#
# NOTE that RIP *will not* run if UDP checksums are disabled in
# the kernel.
#
rip yes ;

zebra
这是日本人写的以GNU版权方式发布的软件,开始于1996年,主要的功能是实现了 RIPv1,RIPv2,RIPng, OSPFv2, OSPFv3, BGP-4, and BGP-4+路由协议,目前是0.87版,目前支持Linux和FreeBSD,将来会支持Solaris 7和GNU Hurd。

其中RIPv1, RIPv2, OSPFv2是用于IPv4的自治域系统内部网络路由协议,最好的是OSPF,他支持VLSM(变长子网掩码)、收敛快,能根据链路的负载等动态调整路由,是目前最好的所有厂商都支持的内部路由协议。跟他差不多(也许还要好)的是cisco专有的EIGRP。

BGP-4是用于自治域系统之间的外部网络路由协议,也是目前Internet主干上目前使用的协议,非常的灵活。在国外用的非常普遍,如果一个网络有两个以上出口(连接两个ISP)极大的可能会用他。但是在国内好象很少使用,这也跟国内的网络比较封闭有关。假如我们跟CSTNET和CETNET使用BGP-4的话,只要这两个出口一个是通的,我们对外的连接不会中断超过1分钟。
RIPng OSPFv3, BGP-4+主要扩展了对ipv6的支持。

这个软件配置的很多方面跟cisco的IOS配置几乎完全相同,我们完全可以拿一台PC机来完成一些必须用昂贵的CISCO路由器才能完成的比较复杂的路由协议处理控制功能。GNU Zebra可以到其官网www.zebra.org上去找。

路由器上的策略控制:IP带宽管理(QoS)
为什么要管理带宽?

因特网的成功主要因素是IP(Internet Protocol)协议族的简单和稳健。现在几乎所有的人都在向IP靠拢,甚至传统的电讯公司也在将它们的基于电路交换的语音网络向IP网络转。然而基于IP协议的因特网这时候就遇到了一个非常大的困难。它不相ATM协议,它是平等地对待任何业务,也就是说所有的通过IP网络的数据都被平等地尽可能好的传送(称:尽力型服务)。如果我愿意多付1倍的钱,我也不能让我的主页下载的速度提高一倍。这时候就引入了QoS概念,也就是服务质量保证。这种情况下,平等对待所有IP业务数据的方法就要被放弃,而试图区分不同的用户或业务,然后分配不同的带宽。这就是路由器上的带宽的分配和管理。

这些年来,不同的技术发展很快,IETF(Internet Engineering Task Force)已经发布了几种标准,包括:综合服务、区分服务、资源预留技术。这些标准都在Linux下有了实现。但它们的使用是个综合的问题,需要网络其它路由器的配合(例如资源预留),所以当前在实践中使用不是很广,但随着因特网业务的不断增加,它们会逐渐越来越多的被大家使用的。

Linux内核2.1.x及后续版本里面主要是引入了traffic control代码,来实现IP带宽的分配和管理。

TC的特点
TC是Traffic Control的缩写,中文意思即为"流量控制"。TC有很大的伸缩性。作为一个提供虚拟主机服务的ISP来说,它可以利用Linux的流量控制来给不同的客户不供的服务质量保证。传统的出售虚拟主机或者提供主页存放服务的ISP通常是提供不同的磁盘空间来作为不同档次的服务,例如一个月100元可以获得100M的空间。如果使用Linux的流量控制(TC),我们就可以多提供一种有区分的不同的服务,例如你是一个提供虚拟主机服务的ISP,可以利用TC很方便的指定各种有控制的服务规则。


Linux路由之ip route

1.基础知识

1.1 路由Routing
1.1.1 路由策略使用 ip rule 命令操作路由策略数据库

基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。

ip rule 命令:
Usage: ip rule [ list | add | del ] SELECTOR ACTION add 添加;del 删除; llist 列表
SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]
ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]

示例:
ip rule add from 192.203.80/24 table inr.ruhep prio 220 通过路由表 inr.ruhep 路由来自源地址为192.203.80/24的数据包
ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由

在 Linux 系统启动时,内核会为路由策略数据库配置三条缺省的规则:
0 匹配任何条件查询路由表local(ID 255) 路由表local是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。rule 0非常特殊,不能被删除或者覆盖。  

32766 匹配任何条件查询路由表main(ID 254) 路由表main(ID 254)是一个通常的表,包含所有的无策略路由。系统管理员可以删除或者使用另外的规则覆盖这条规则。

32767 匹配任何条件查询路由表default(ID 253) 路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。

不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。


1.1.2 路由表 使用 ip route 命令操作静态路由表

所谓路由表,指的是路由器或者其他互联网网络设备上存储的表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表Routing Table,供路由选择时使用,表中包含的信息决定了数据转发的策略。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表根据其建立的方法,可以分为动态路由表和静态路由表。

linux 系统中,可以自定义从 1-252个路由表,其中linux系统维护了4个路由表:
0#表:系统保留表
253#表:defulte table 没特别指定的默认路由都放在改表
254#表:main table 没指明路由表的所有路由放在该表
255#表:locale table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改

路由表的查看可有以下二种方法:
ip route list table table_number
ip route list table table_name

路由表序号和表名的对应关系在 /etc/iproute2/rt_tables 文件中,可手动编辑。路由表添加完毕即时生效,下面为实例:
ip route add default via 192.168.1.1 table 1 在一号表中添加默认路由为192.168.1.1
ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一号表中添加一条到192.168.0.0网段的路由为192.168.1.2

以下面的路由表为例:
Destination    Netmask    Gateway          Interface    Metric
0.0.0.0    0.0.0.0    192.168.123.254    192.168.123.88    1 #缺省路由,目的地址不在本路由表中的数据包,经过本机的 192.168.123.88 接口发到下一个路由器 192.168.123.254
127.0.0.0    255.0.0.0    127.0.0.1    127.0.0.1    1        #发给本机的网络包
192.168.123.0    255.255.255.0    192.168.123.68    192.168.123.68    1 #直连路由。目的地址为 192.168.123.0/24 的包发到本机 192.168.123.88 接口
192.168.123.88    255.255.255.255    127.0.0.1    127.0.0.1    1        #目的地址为 192.168.123.88的包是发给本机的包
192.168.123.255    255.255.255.255    192.168.123.88    192.168.123.88    1 #广播包的网段是 192.168.123.0/24,经过 192.168.123.88 接口发出去
224.0.0.0    224.0.0.0    192.168.123.88    192.168.123.88    1             #多播包,经过 192.168.123.88 接口发出去
255.255.255.255    255.255.255.255    192.168.123.68    192.168.123.68    1 #全网广播包
Default Gateway: 192.168.123.254

各字段说明:
destination:目的网段

mask:与网络目标地址相关联的网掩码又称之为子网掩码。子网掩码对于 IP 网络地址可以是一适当的子网掩码,对于主机路由是 255.255.255.255 ,对于默认路由是 0.0.0.0。如果忽略,则使用子网掩码 255.255.255.255。定义路由时由于目标地址和子网掩码之间的关系,目标地址不能比它对应的子网掩码更为详细。换句话说,如果子网掩码的一位是 0,则目标地址中的对应位就不能设置为 1

interface:到达该目的地的本路由器的出口ip

gateway: 下一跳路由器入口的 ip,路由器通过 interface 和 gateway 定义一调到下一个路由器的链路。通常情况下,interface 和 gateway 是同一网段的metric 跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用metric值小的那条路由

根据子网掩码,可以将路由分为三种类型:
主机路由:机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。

Destination    Gateway       Genmask        Flags     Metric    Ref    Use    Iface
-----------    -------     -------            -----     ------    ---    ---    -----
10.0.0.10     192.168.1.1    255.255.255.255   UH       0    0      0    eth0

网络路由:网络路由是代表主机可以到达的网络。网络路由的Flags字段为N。在下面的示例中,本地主机将发送到网络192.19.12的数据包转发到IP地址为192.168.1.1的路由器。

Destination    Gateway       Genmask      Flags    Metric    Ref     Use    Iface
-----------    -------     -------         -----    -----   ---    ---    -----
192.19.12     192.168.1.1    255.255.255.0      UN      0       0     0    eth0

默认路由:当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由默认网关上。默认路由的Flags字段为G。

Destination    Gateway       Genmask    Flags     Metric    Ref    Use    Iface
-----------    -------     ------- -----      ------    ---    ---    -----
default       192.168.1.1     0.0.0.0    UG       0        0     0    eth0

设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]

其中:
add : 添加一条路由规则,del : 删除一条路由规则,-net : 目的地址是一个网络,-host : 目的地址是一个主机,target : 目的网络或主机
netmask : 目的地址的网络掩码,gw : 路由数据包通过的网关,dev : 为路由指定的网络接口

比如:
route add 0.0.0.0 mask 0.0.0.0 192.168.12.1
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7


关于 src 属性:
当一个主机有多个网卡配置了多个 IP 的时候,对于它产生的网络包,可以在路由选择时设置源 IP 地址。比如:
ip route add 78.22.45.0/24 via 10.45.22.1 src 10.45.22.12 发到 78.22.45.0/24 网段的网络包,下一跳的路由器 IP 是 10.45.22.1,包的源IP地址设为10.45.22.12。

要注意的是,src 选项只会影响该 host 上产生的网络包。如果是一个被路由的外来包,明显地它已经带有了一个源 IP 地址,这时候,src 参数的配置对它没有任何影响,除非你使用 NAT 来改变它。


1.1.3 路由分类之静态路由

静态路由是指由用户或网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。当然,网管员也可以通过对路由器进行设置使之成为共享的。静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。



以上面的拓扑结构为例,在没有配置路由的情况下,计算机1 和 2 无法互相通信,因为 1 发给 2 的包在到达路由器 A 后,它不知道怎么转发它。B 也同样。管理员可以配置如下的静态路由来实现 1 和 2 之间的通信:

计算机配置默认网关:
计算机1 上:route add default gw 192.168.1.1
计算机2 上:route add default gw 192.168.3.1

路由器配置:
R1 上:ip route 192.168.3.0 255.255.255.0 f0/1 意思为:目标网络地址为 192.168.3.0/24 的数据包,经过 f0/1 端口发出
R2 上:ip route 192.168.1.0 255.255.255.0 f0/1 意思为:目标网络地址为 192.168.1.0/24 的数据包,经过 f0/1 端口发出

或者

R1 上:ip route 192.168.3.0 255.255.255.0 192.168.2.2 意思为:要去 192.168.3.0/24 的数据包,下一路由器 IP 地址为 192.168.2.2
R2 上:ip route 192.168.1.0 255.255.255.0 192.168.2.1


1.1.4 路由分类之动态路由

动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整。它是与静态路由相对的一个概念,指路由器能够根据路由器之间的交换的特定路由信息自动地建立自己的路由表,并且能够根据链路和节点的变化适时地进行自动调整。当网络中节点或节点间的链路发生故障,或存在其它可用路由时,动态路由可以自行选择最佳的可用路由并继续转发报文。

常见的动态路由协议有以下几个:路由信息协议RIP、OSPF(Open Shortest Path First开放式最短路径优先、IS-ISIntermediate System-to-Intermediate System,中间系统到中间系统、边界网关协议BGP是运行于 TCP 上的一种自治系统的路由协议。


1.1.5 ip rule,ip route,iptables 三者之间的关系

以一例子来说明:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 电信,其他IP使用 20.0.0.1 网通上网。

首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关:ip route add default gw 20.0.0.1
之后通过 ip route 添加一个路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号)
之后添加 ip rule 规则:ip rule add fwmark 3 table 3 fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表
之后使用 iptables 给相应的数据打上标记:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3

因为 mangle 的处理是优先于 nat 和 fiter 表的,所以在数据包到达之后先打上标记,之后再通过 ip rule 规则,对应的数据包使用相应的路由表进行路由,最后读取路由表信息,将数据包送出网关。此处有一个更详细的例子。



这里可以看出 Netfilter 处理网络包的先后顺序:接收网络包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再发出网络包。


1.1.6 Traceroute 工具

在 linux 机器上使用 traceroute 来获知从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点source到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。在 MS Windows 中该工具为 tracert。 在大多数情况下,我们会在linux主机系统下,直接执行命令行:traceroute hostname;而在Windows系统下是执行tracert的命令: tracert hostname。

命令格式:traceroute [参数] [主机]
命令功能:traceroute 指令让你追踪网络数据包的路由途径,预设数据包大小是 40Bytes,用户可另行设置。
具体参数格式:traceroute [-dFlnrvx][-f<存活数值>][-g<网关>...][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]

命令参数:
-d 使用Socket层级的排错功能,-f 设置第一个检测数据包的存活数值TTL的大小,-F 设置勿离断位,-g 设置来源路由网关,最多可设置8个,-i 使用指定的网络界面送出数据包,-I 使用ICMP回应取代UDP资料信息,-m 设置检测数据包的最大存活数值TTL的大小,-n 直接使用IP地址而非主机名称。

-p 设置UDP传输协议的通信端口,-r 忽略普通的Routing Table,直接将数据包送到远端主机上,-s 设置本地主机送出数据包的IP地址,-t 设置检测数据包的TOS数值。

-v 详细显示指令的执行过程,-w 设置等待远端主机回报的时间,-x 开启或关闭数据包的正确性检验。

1)示例
# traceroute www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
1 192.168.74.2 (192.168.74.2) 2.606 ms 2.771 ms 2.950 ms
2 211.151.56.57 (211.151.56.57) 0.596 ms 0.598 ms 0.591 ms
3 211.151.227.206 (211.151.227.206) 0.546 ms 0.544 ms 0.538 ms
4 210.77.139.145 (210.77.139.145) 0.710 ms 0.748 ms 0.801 ms
5 202.106.42.101 (202.106.42.101) 6.759 ms 6.945 ms 7.107 ms
6 61.148.154.97 (61.148.154.97) 718.908 ms * bt-228-025.bta.net.cn (202.106.228.25) 5.177 ms
7 124.65.58.213 (124.65.58.213) 4.343 ms 4.336 ms 4.367 ms
8 202.106.35.190 (202.106.35.190) 1.795 ms 61.148.156.138 (61.148.156.138) 1.899 ms 1.951 ms
9 * * *
30 * * *

说明:
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是 -q 的默认参数。

探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果用 traceroute -q 4 www.freeoa.net,表示向每个网关发送4个数据包。

有时我们 traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP 的返回信息,所以我们得不到什么相关的数据包返回数据。

有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台 DNS 出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析,以IP格式输出数据。

如果在局域网中的不同网段之间,我们可以通过 traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。

2)原理

Traceroute 程序的设计是利用 ICMP 及 IP header 的 TTLTime To Live栏位field。

首先,traceroute 送出一个 TTL 是 1 的 IP datagram其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签到目的地,当路径上的第一个路由器router收到这个datagram 时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此 datagram 丢掉,并送回一个「ICMP time exceeded」消息包括发IP包的源地址,IP包的所有内容及路由器的IP地址,traceroute 收到这个消息后,便知道这个路由器存在于这个路径上。

接着,traceroute 再送出另一个TTL 是 2  的datagram,发现第2 个路由器......

然后,traceroute  每次将送出的 datagram 的 TTL  加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?

Traceroute 在送出 UDP datagrams 到目的地时,它所选择送达的 port number 是一个一般应用程序都不会用的号码30000 以上,所以当此 UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。Traceroute提取发 ICMP TTL 到期消息设备的 IP 地址并作域名解析。每次 ,Traceroute 都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。



以上资料来自互联网,感谢原作者。



该文章最后由 阿炯 于 2021-02-26 13:05:13 更新,目前是第 2 版。