FreeBSD 路由详解

时间:2023-12-27 14:46:55

在同一个局域网上的计算机是直接连通的,但是不同的网络上的计算机并没有直接相连,只能通过一台特殊的专用计算机 -路由器来完成连通。路由器连接有多个网络界面,每一个网络界面连接到一个相应的网络上,具有一个这个网络上的IP地址,因此,网络内部的计算机可以和路 由器本身相互通信。

当网络内部的计算机要向外连接的时候,数据包实际是交给路由器的,路由器再将数据包从连接外部网络的网络界面上转发出去,数据包经过这 样一个一个的转发过程,直到到达目的地。对于网络内部的计算机来讲,没有必要了解数据包的整个转发的路径和经过的所有路由器的信息,只需要知道第一步需要 将数据包交给哪一个路由器就可以了。因此,计算机必须知道与它直接相连接的路由器的有关信息,这个过程就是路由配置的过程。

进行路由配置有两种途径,一种是由管理员设置所有的路由信息,由于数据是手工设置,因此称为静态路由设置。另一个是启动一个支持路由交换协议的进程,自动侦测网络上的所有路由器及其相关信息,这称为动态路由设置。

在 FreeBSD系统不用做专门路由器的情况下,一般地说使用静态路由设置足够满足网络通信的需要。

1) 缺省网关

在最简单的情况下,一个网络向外通过一个路由器完成向外连接,这个路由器被称为缺省网关,它负责几乎所有的向外连接任务。假设缺省网关的地址为 192.168.1.254,则设置缺省网关的命令为:

# route add default 192.168.1.254

add net default: gateway 192.168.1.254

在 route指令中,使用default来代表全部网络,那么通向全部网络的路由器就是缺省网关,而 ” 0.0.0.0 ” 和 default有同样的含义。

如果系统已经设置了缺省网关,那么系统会报告错误,如果要改变缺省网关的设置,就需要首先清除原有配置数据。

# route add default 192.168.1.254

rotue: writing to routing socket: File exists

add net default: gateway 192.168.1.254: File exists

# route delete default

delete net default

显然 ” delete ” 参数的意思和 ” add ” 参数的意思相反,用于清除已经设置的路由数据。除了使用 ” delete ” 一个一个的删除路由之外,如果所有的静态路由设置都不再需要,可以使用 ” flush ” 清除所有设置。

# route flush

default 192.168.1.254 done

上述命令执行之后立即生效,因此,可能会影响已经建立的连接。为了保存缺省网关的配置,同样也需要将配置写入系统配置文件 rc.conf。

defaultrouter= “ 192.168.1.254 ”

仅仅配置缺省网关的大部分情况是在计算机处于整个互联网的边缘,网络中仅仅需要一个路由器接入互联网就可以了。

2) 其他静态路由设置

更复杂的情况下,计算机所处的网络与多个网络相连接,网络中存在多个路由器,每个路由器负责到一些网络的转发任务,而不负责到全部网络的转 发任务。这种情况下,如果将所有的数据都发给一个路由器,那么原则上它只能正确转发目的是它自己负责的网络的数据。实际使用当中,路由器将使用 ICMP协议,向发送数据的主机报告路由错误。

因此,应该在计算机中配置这个网络上所有路由器及这些路由器负责的相应网络的路由数据,以便计算机选择正确的路由器转发数据包。同样,也必须使用 route命令增加到各个网络的静态路由数据。 [page]

# route add 192.168.10.0/24 192.168.1.253

# route add 192.168.20.0 192.168.1.253

# route add 192.168.30.0/25 192.168.1.253

# route add 192.168.30.128 192.168.1.253

# route add 192.168.40.0 -netmask 255.255.255.0 192.168.1.253

上面指令给出了几种不同的情况, IP地址之后的 ' /24 ' 指明子网掩码的长度是 24位,它代表二进制方式的网络掩码前面非0位的长度,24个非0位的掩码等价于255.255.255.0,也可以忽略这个部分,系统使用网络地址的缺 省掩码,例如192.168.20.0属于一个C类地址,因此网络掩码是255.255.255.0。但是,如果不是标准的A、B、C类地址,而是一个被 划分过的子网,就必须指明子网掩码,例如192.168.30.0/25,必须指明掩码长度是25位,否则系统使用缺省的掩码。如果不使用掩码长度的形 式,则可以使用 ' -netmask ' 参数的形式指明网络掩码。

即便如此,上面的指令也不是没有问题。对于标准的网络地址, route指令能确定网络地址和掩码,但是对于象192.168.30.128这样的地址,在通常情况下,它属于一个计算机的普通IP地址,route指 令也能设置通向单独计算机的路由,因此上面的命令将设置一个通向192.168.30.128这一个主机的路由。系统将返回:

# route add 192.168.30.128 192.168.1.253

add host 192.168.30.128: gateway 192.168.1.253

而其他情况下将返回 ” add net ...” ,表明地址代表一个网络而不是一个单独的计算机。然而,很多情况下,这个地址被用作一个网络地址,是一个代表从 192.168.30.128到192.168.30.255整个网络的网络地址,它的掩码为25位长的255.255.255.128。

甚至在一些极端的情况下,地址 192.168.10.0也可以用来代表一个具体的计算机的IP地址,而不是一个网络地址。

为了指定这些非标准情况,必须使用额外的参数。

# route add -net 192.168.10.0/24 192.168.1.253

# route add -net 192.168.20.0 192.168.1.253

上面指令中的 -net参数是一个可选参数,它明确指出这个路由是通向一个网络的路由数据,否则[page]route只能从所给予的IP地址中判断它是网络还是计算 机,就有可能发生与管理员想法并不一致的设置。同样可以指定-host参数为一个单独的远程计算机指定路由。

# route add -host 192.168.20.0 192.168.1.253

非缺省网关的静态路由设置同样也需要保存在 rc.conf中,以备下次启动时自动配置。

static_routes= “ static1 static2 ”

route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”

route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”

保存静态路由的方法略为复杂,这是因为静态路由的数量并不确定,因此首先给静态路由确定一个名字,例如 static1、static2等,使static_routes变量中包含这些名字,然后将具体的路由设置保存在route_static1等类似的由 静态路由的名字组成的变量中。

需要注意的是,一些旧版本的 FreeBSD系统直接使用静态路由的名字作变量名字,具体设置如下:

static_routes= “ static_route1 static_route2 ”

static_route1= “ -net 192.168.10.0/24 192.168.1.253 ”

static_route2= “ -net 192.168.20.0/24 192.168.1.253 ”

3) 查看路由信息

设置完路由表之后,可以使用 netstat -r命令来查看当前的路由表的内容。

# netstat -r

Routing tables

Internet:

Destination Gateway Flags Refs Use Netif Expire

default 192.168.1.254 UGSc 1 941 xl0

127.0.0.1 127.0.0.1 UH 1 644 lo0

192.168.1 link#1 UC 0 0 xl0

192.168.1.254 0:e0:1e:ce:85:a9 UHLW 2 0 xl0

192.168.1.64 0:90:27:4e:f6:67 UHLW 1 6 lo0

192.168.1.253 link#1 UHLW 2 0 xl0

192.168.10 192.168.1.253 UGSc 0 0 xl0

192.168.20 192.168.1.253 UGSc 0 0 xl0

该命令执行结果的第一列显示的是路由的目的,可以是一个网络地址,也可以是一个主机地址;而第二列则显示了到达该目的应使用网关地址,可以 有三种形式,对于不能直接到达的网络地址和主机地址来讲,通常使用网关的 IP地址形式,对于与本机直接相连接的网络,通常使用网络界面的来表示,如 ' link#1 ' 表示第一个网络界面,而对于可以直接到达的主机地址,则使用该地址的 MAC地址来表示网关;

第三列则为该路由属性的一些标志, ' U ' 表示路由当前可以使用, ' G ' 表示到达目的需要对 IP数据包进行专发, ' S ' 表示是手工添加的静态路由,而不是系统自动产生的路由数据, ' C ' 和 ' c ' 表示在使用中会产生新的路由,通常对网络的路由带有这个标志,因为一旦产生具体的连接,则会添加到达具体主机的路由数据, ' H ' 表示是针对独立主机地址的路由数据, ' L ' 表示使用网关地址中的 MAC地址发送数据, ' W ' 表示路由是由 ' C ' 或 ' c ' 标志指定的路由生成的。

第四列和第五列是表示该路由数据在路由处理中被引用或使用的一些数据,而第六列标识了该路由使用的网络界面,第七列则标识该路由数据的有效时间,当路由数据达到有限时间的时候,该路由数据就被自动撤消。

从这些结果来看,系统自动将可以直接达到的网络加入路由表中,就是说 ifconfig执行更改地址的同时也更改了路由,这也就解释了前面章节中使用ifconfig配置同网络IP地址带来的执行错误的问题。

同样,直接可以连接的主机也被系统自动加入路由表中,路由信息记录了详细的连接方式,包括与该地址通信的是哪个网络界面和该地址的 MAC地址。

事实上,使用 route指令也完全可以手工指定该地址应该用哪个网络界面进行通信,通信目标的MAC地址是多少。

# route add -host 192.168.30.122 -iface -link xl0:0:12:3f:2:3:4

上述指令将设置通向 192.168.30.122为通过xl0网络界面,目的MAC地址为0:12:3f:2:3:4。显然,正常情况下不需要如此设置,除非某些特殊情况 下,例如对于ATM网络界面用来设置PVC等等,这种作法也能用来支持所谓MAC地址与IP地址绑定,然而由于计算机的MAC地址可以随意改变,因此这种 使用绑定来增加网络安全的思路显然是没有什么太大的用处的。

4) 保存配置

要想让系统重起之后配置仍然有效,就必须将上面的配置保存到配置文件 /etc/rc.conf中,通常情况下设置好了网络的这个文件应该与下面的例子相似:

hostname="wb.example.com.cn"

ifconfig_xl0="inet 192.168.1.64 netmask 255.255.255.0"

ifconfig_lo0="inet 127.0.0.1"

defaultrouter= “ 192.168.1.1 ”

static_routes= “ static1 static2 ”

route_static1= “ -net 192.168.10.0/24 192.168.1.253 ”

route_static2= “ -net 192.168.20.0/24 192.168.1.253 ”