路由基础

Posted 3me-linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了路由基础相关的知识,希望对你有一定的参考价值。

基础路由:

查看 Linux 内核路由表

使用下面的 route 命令可以查看 Linux 内核路由表。

需要注意的是:route命令是在main表中进行操作的。

# route

Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0

route 命令的输出项说明

输出项

说明

Destination

目标网段或者主机

Gateway

网关地址,"*" 表示目标是本主机所属的网络,不需要路由

Genmask

网络掩码

Flags

标记。一些可能的标记如下:

 

U — 路由是活动的

 

H — 目标是一个主机

 

G — 路由指向网关

 

R — 恢复动态路由产生的表项

 

D — 由路由的后台程序动态地安装

 

M — 由路由的后台程序修改

 

! — 拒绝路由

Metric

路由距离,到达指定网络所需的中转数(linux 内核中没有使用)

Ref

路由项引用次数(linux 内核中没有使用)

Use

此路由项被路由软件查找的次数

Iface

该路由表项对应的输出接口

3 种路由类型

主机路由

主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。

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。例如,在下面的示例中,默认路由是IP地址为192.168.1.1的路由器。

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

配置静态路由

route 命令

设置和查看路由表都可以用 route 命令,设置内核路由表的命令格式是:

# route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]

其中:

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

route 命令使用举例

添加到主机的路由

# route add -host 192.168.1.2 dev eth0:0
# route add -host 10.20.30.148 gw 10.20.30.40

添加到网络的路由

# route add -net 10.20.30.40 netmask 255.255.255.248 eth0
# route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
# route add -net 192.168.1.0/24 eth1

添加默认路由

# route add default gw 192.168.1.1

删除路由

# route del -host 192.168.1.2 dev eth0:0
# route del -host 10.20.30.148 gw 10.20.30.40
# route del -net 10.20.30.40 netmask 255.255.255.248 eth0
# route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
# route del -net 192.168.1.0/24 eth1
# route del default gw 192.168.1.1

设置包转发

在 CentOS 中默认的内核配置已经包含了路由功能,但默认并没有在系统启动时启用此功能。开启 Linux的路由功能可以通过调整内核的网络参数来实现。要配置和调整内核参数可以使用 sysctl 命令。例如:要开启 Linux内核的数据包转发功能可以使用如下的命令。

# sysctl -w net.ipv4.ip_forward=1

这样设置之后,当前系统就能实现包转发,但下次启动计算机时将失效。为了使在下次启动计算机时仍然有效,需要将下面的行写入配置文件/etc/sysctl.conf。

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

用户还可以使用如下的命令查看当前系统是否支持包转发。

# sysctl net.ipv4.ip_forward

 

 

 

 

多路径路由:

    多路径路由是指一条路由可以指定多个下一跳网关,这样做的目的,有可能是出于流量均衡的考虑,也有可能是为了线路冗余备份。

    如下图所示,左侧网络通过路由器RT与因特网相连,RT通过两条上行链路与两个不同的ISP同时相连:

技术分享图片

    

    RT使用rt1和rt2作为默认网关,这样,我们可以在RT上定义一条多路径路由,该路由有多个下一跳:

ip route add default scope global nexthop via 100.100.100.1 weight 1 nexthop via 200.200.200.1 weight 2    

 

    需要注意的是,虽然这条路由有多个下一跳,但仍被视为一条路由。

    

    同时,需要考虑的是,每次查找到该路由时候,如何确定下一跳。一般linux内核采用加权循环算法来确定下一跳网关,该算法比较简单,在分析代码的时候回讲到。

 

策略路由

    一般情况下,路由项是通过dest ip进行匹配的,但是,考虑到下面拓扑所示的情况:

技术分享图片

 

如果有下面的要求:

 

  1. 校园网1到校园网3的流量要经过RT1,从校园网2到校园网3的流量要经过RT2.
  2. 校园网1到因特网的流量经过DG1,从校园网2到因特网的流量经过DG2。

 

显然,如果通过dst ip来确定路由是无法满足上面的需求的,因此我们可以引入其它确定路由的策略,比如根据src ip, 入口设备eth0, 封包的tos参数等。使用这些参数相结合来确定一条到达目的地址的路由。本例中,我们可以将入口设备和目的地址相结合作为选择路由的策略,

这就是我们说的策略路由(注意要和路由策略区分开来,这个概念涉及到代码的时候会分析)。

 

同时,我们来看看内核开启策略路由情况下的路由表。上面的例子中,如果内核使用单张路由表,如下所示:

Single routing table example

Ingress device

Source IP

Destination IP

Next hop

Egress device

Routes to Campuses 2 and 3 for traffic originated in Campus 1

  

  

  

  

eth0

Not specified

10.0.3.0/24

10.0.0.10 (RT1)

eth2

eth0

Not specified

10.0.2.0/24

Not specified

eth1

Routes to Campuses 1 and 3 for traffic originated in Campus 2

  

  

  

  

eth1

Not specified

10.0.3.0/24

10.0.0.20 (RT2)

eth2

eth1

Not specified

10.0.1.0/24

Not specified

eth0

Default routes for Campus 1 and Campus 2

  

  

  

  

eth0

Not specified

0.0.0.0/0

10.0.0.11 (DG1)

eth2

eth1

Not specified

0.0.0.0/0

10.0.0.21 (DG2)

eth2

 

如果确定路由的时候,所用的策略更多,那么这张路由表中的选项会更多。这样带来的弊端是路由表不易维护,查找更费时。因此,可以根据路由策略维护多张不同的路由表,如不同的入口设备维护一张路由表,如下面表格所示:

 

  • Traffic coming in on eth0 is checked against Routing Table 1 (Table 31-2).
  • Traffic coming in on eth1 is checked against Routing Table 2 (Table 31-3).

Table 31-2. RT1 used to route traffic from Campus 1

Destination IP

Next hop

Egress device

10.0.2.0/24

None

eth1

10.0.3.0/24

10.0.0.10 (RT1)

eth2

0.0.0.0/0

10.0.0.11 (DG1)

eth2

 

Table 31-3. RT2 used to route traffic from Campus 2

Destination IP

Next hop

Egress device

10.0.1.0/24

None

eth0

10.0.3.0/24

10.0.0.20 (RT2)

eth2

0.0.0.0/0

10.0.0.21 (DG2)

eth2

 

这样,在使用策略路由的时候,为目的地查找路由可以分为如下图所示的两个步骤:

技术分享图片

当然,在执行者两个步骤之前,总是现在路由缓存中查找。

 

总的来说,我们可以基于以下参数来作为选择路由表时候的策略:

  1.  

     

     

    知道了策略路由的基本概念,那么如何把策略路由数据库显示出来呢?这次不用route -n了,得使用ip rule show来显示RPDB中的路由表:
    技术分享图片

     

    在分析上图内容前,先看看ip rule的简单用法:

    技术分享图片

ip rule show显示的内容,大体上可以分为三段:

   第一段:冒号之前的数字,表示该路由表被匹配的优先顺序,数字越小,越早被匹配。这个优先级别范围是0~4亿多。默认0、32766、32767三个优先级别已被占用。如果在添加规则时没有定义优先级别,那么默认的优先级别会从32766开始递减,可以通过prio ID参数在设置路由表时添加优先级。

   第二段:from关键字,这里显示的是匹配规则,当前表示的是从哪里来的数据包,除了from关键字外,还有to、tos、fwmark、dev等等。

   第三段:loacl/main/default 这些都是路由表名称,表示数据包要从那个路由表送出去。local表包含本机路由及广播信息,main表就是我们route -n看到的内容,default表,默认为空。

在添加规则时,需要先定义好优先级、条件及路由表ID,然后才可以添加规则。如下例:

技术分享图片

 

  上面的路由表都是用100、110、120、130等数字表示的,时间一久难免自己也会忘记该路由表的作用,不过iproute提供了一个路由表和名称的对应表(/etc/iproute2/rt_tables),可以手动修改该表。

技术分享图片

可以看到添加路由表100后,显示确实是100,在修改rt_tables的映射关系后(100映射到wangtong),ip rule show的内容也变化了。

当然也可使用ip命令来删除路由表了。

技术分享图片

 

ip rule show查看的只是有哪些路由表,要查看路由表里面的具体路由,则可以使用ip route show/list table ID/name,默认的ip route show查看的是main表的路由条目。

技术分享图片

 

  如果新加的路由在main表之外的路由表,则只有先添加规则后才能确定新的路由表的ID,有了新的路由表ID后,才能在该路由表中添加路由。

例如用以下命令验证:

 

技术分享图片

 

 

 

参考资料:

https://my.oschina.net/guol/blog/156607

http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html

深入理解LINUX网络技术内幕



















以上是关于路由基础的主要内容,如果未能解决你的问题,请参考以下文章

路由基础

路由基础

路由基础

路由基础-静态路由

动态路由基础

路由基础-静态路由