Zebra基本配置

2023-11-05

前言

Zebra是一个路由软件包,提供基于TCP/IP路由服务,支持RIPv1, RIPv2, RIPng, OSPFv2, OSPFv3, BGP- 4,

和 BGP-4+等众多路由协议。Zebra还支持BGP特性路由反射器(Route Reflector)。除了传统的 IPv4路由协议

,Zebra也支持IPv6路由协议。如果运行的SNMP守护进程(需要ucd-snmp)支持SMUX协 议,Zebra还能支持路由

协议MIBs。

由以上可见,Zebra的确是一个很不错的路由系统,但比起真正的路由器就简直是小儿科,所以网络高手 就当

这文章是小孩子过家家吧,而对于象我这样的初学者(特别是没有真实设备或足够设备进行实验) 也不失为一

个学习和熟悉路由配置、路由协议的好工具。我没有实际的配置经验,对路由的技术细节也 不是十分清晰,完

全是在扔破砖头。希望路由高手指正概念错误。

安装

Zebra目前最新的版本是0.92a,它的安装非常简单,我们只需从 http://www.zebra.org/下载zebra-

0.92a.tar.gz,然后执行以下命令安装(本文环境是RedHat7.2):

shell> tar xzf zebra-0.92a.tar.gz
shell> cd zebra-0.92a
shell> ./configure
shell> make
shell> make install

这样Zebra就安装好了,安装的执行文件:

shell> ls /usr/local/sbin
bgpd  ospfd  ripd  zebra

配置文件:

shell> ls /usr/local/etc
bgpd.conf.sample   ospfd.conf.sample  zebra.conf.sample
bgpd.conf.sample2  ripd.conf.sample

运行

编译安装完Zebra后,可以看到有4个可执行文件和5个配置样本文件,我们就使用它的配置样本文件:

shell> cd /usr/local/etc
shell> cp zebra.conf.sample zebra.conf

Zebra的各进程有各自的终端接口或VTY,如果我们需要给连接到它们的端口设置别名的话,在/etc/ services

文件添加如下内容:

zebrasrv      2600/tcp   # zebra service
zebra         2601/tcp   # zebra vty
ripd          2602/tcp   # RIPd vty
ripngd        2603/tcp   # RIPngd vty
ospfd         2604/tcp   # OSPFd vty
bgpd          2605/tcp   # BGPd vty
ospf6d        2606/tcp   # OSPF6d vty

然后就可以启动Zebra了:

shell> zebra -d

这样,Zebra就以守护进程启动了,其它的参数请参考zebra -h。

基本路由配置命令

直接用telnet连接:

shell> telnet localhost 2601
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Hello, this is zebra (version 0.92a).
Copyright 1996-2001 Kunihiro Ishiguro.


User Access Verification

Password:

Zebra会提示输入口令,我们通过/usr/local/etc/zebra.conf可以看到口令是zebra,enable口令也是zebra。

输 入口令zebra,得到路由器用户模式提示符:

Router>

进入特权模式:

Router> en
Password:
Router#

输入一个问号,看看Zebra提供了多少路由命令:

Router# ?
  configure  Configuration from vty interface
  copy       Copy configuration
  debug      Debugging functions (see also 'undebug')
  disable    Turn off privileged mode command
  end        End current mode and change to enable mode.
  exit       Exit current mode and down to previous mode
  help       Description of the interactive help system
  list       Print command list
  no         Negate a command or set its defaults
  quit       Exit current mode and down to previous mode
  show       Show running system information
  terminal   Set terminal line parameters
  who        Display who is on vty
  write      Write running configuration to memory, network, or terminal

提供的命令很少,实际路由器好多命令都没有,我们只能用有限的命令投入到无限的实验中去。

Router# sh run

Current configuration:
!
hostname Router
password zebra
enable password zebra
!
interface lo
!
interface eth0
!
line vty
!
end

Zebra把操作系统的网络接口当做路由器的接口,所以在做比较复杂的路由实验,会需要比较多的网卡。

进入全局模式,尽可能把实际可用的配置命令都实验一遍:

Router# conf t
Router(config)#

自己取一个路由器名字:

Router(config)# hostname r1
r1(config)#

Zebra比较简单,登陆口令不是在line下修改,而是直接在全局模式下用password修改

r1(config)# password {password}

Zebra不支持enable secret {password}这种MD5加密口令,只能使用enable password {password}来修改

enable口令:

r1# conf t
r1(config)# enable password {password}

在路由器配置中加密所有的口令:

r1(config)# service password-encryption

回到特权模式:

r1(config)# exit
r1# sh run

Current configuration:
!
hostname r1
password 8 alA5.vcyMAwXQ
enable password 8 ksbxOFN8xcFMc
service password-encryption
!
interface lo
!
interface eth0
!
line vty
!
end

我们看到刚才的明文密码都进行加密了,给我们的实验机也提高安全性。Zebra有一点比较恶心,如果我 们先

设置了service password-encryption,然后再修改口令,sh run就发现口令又都是明文的了,但是由 于有

service password-encryption,所以就无法登陆了。

去掉会话超时,免得10分钟没有动作,就把我们给踢了。但是在实际的路由器配置中,为安全起见我们 最好还

是设上会话超时。

r1# conf t
r1(config)# line vty
r1(config-line)# exec-timeout 0 0

设置日志记录,Zebra可以把日志记录到标准输出、syslog、以及指定输出文件:

r1(config-line)# exit
r1(config)# log stdout
r1(config)# no log stdout
r1(config)# log syslog
r1(config)# no log syslog
r1(config)# log file /usr/local/etc/zebra.log

配置接口IP地址:

r1(config)# int lo
r1(config-if)# ip address 127.0.0.1/8
r1(config-if)# exit
r1(config)# int eth0
r1(config-if)# ip address 192.168.5.121/24

Zebra比较奇怪,不能使用ip address 192.168.5.121 255.255.255.0这种形式设置IP。测试一下,就设置成

和Linux中使用的一样。

保存我们刚才的配置:

r1(config-if)# exit
r1(config)# exit
r1# copy run start
Configuration saved to /usr/local/etc/zebra.conf
r1#


2、用Zebra做简单的RIP实验

RIP是应用较早、使用较普遍的IGP,适用于小型同类网络,是典型的距离向量(distance-vector)协 议。RIP通

过广播UDP报文来交换路由信息,每30秒发送一次路由信息更新。RIP提供跳跃计数(hop count)作为尺度来衡量

路由距离,跳跃计数是一个包到达目标所必须经过的路由器的数目。如果到相同 目标有二个不等速或不同带宽

的路由器,但跳跃计数相同,则RIP认为两个路由是等距离的。RIP最多支 持的跳数为15,即在源和目的网间所

要经过的最多路由器的数目为15,跳数16表示不可达。RIPv2支持 验证、密钥管理、路由汇总、无类域间路由

(CIDR)和变长子网掩码(VLSMs)。

Zebra支持RIPv2,使用ripd程序实现RIP路由功能,但ripd程序需要在zebra程序读取接口信息,所以zebra 一

定要在ripd之前启动。由于条件所限,下面的RIP实验是在两台单网卡的RedHat7.2下做的,所以只是 最简单的

演示。

按照上面基本配置的方法初始化第一台机器:

shell_1> cd /usr/local/etc
shell_1> cp zebra.conf.sample zebra.conf
shell_1> cp ripd.conf.sample ripd.conf
shell_1> zebra -d

进入zebra设置IP

shell_1> telnet localhost 2601
Password:
Router> en
Password:
Router# conf t
Router(config)# hostname r1
r1(config)# int eth0
r1(config-if)# ip address 192.168.5.121/24
r1(config-if)# ctrl+z
r1# copy run start

进入第一台机器的rip设置

shell_1> ripd -d
shell_1> telnet localhost 2602
Password:
ripd> en
ripd# conf t
ripd(config)# hostname r1_ripd !改个名字好辨认
r1_ripd(config)# router rip !启动rip
r1_ripd(config-router)# network 192.168.5.0/24 !RIPv1是有类别路由协议,RIPv2是无类别路由协议,

Zebra 默认支持RIPv2,指定网络需要子网掩码。

r1的RIP简单配置这样就可用了,下面来检验一下:

r1_ripd# sh ip protocols
Routing Protocol is "rip"
  Sending updates every 30 seconds with +/-50%, next due in 3 seconds
  Timeout after 180 seconds, garbage collect after 120 seconds
  Outgoing update filter list for all interface is not set
  Incoming update filter list for all interface is not set
  Default redistribution metric is 1
  Redistributing:
  Default version control: send version 2, receive version 2
    Interface        Send  Recv   Key-chain
    eth0             2     2
  Routing for Networks:
    192.168.5.0/24
  Routing Information Sources:
    Gateway          BadPackets BadRoutes  Distance Last Update
  Distance: (default is 120)

我们看到RIP已经起来了,是RIPv2。

r1_ripd# sh ip rip
Codes: R - RIP, C - connected, O - OSPF, B - BGP

   Network            Next Hop         Metric From            Time

由于就两个接口直连,没有其它网络,所以sh ip rip看不到什么。

Zebra对log处理可能有些问题,使用log stdout不能显示各种debug信息,所以只能记录到文件,在shell下 用

tail命令查看。

r1_ripd# debug rip events
r1_ripd# debug rip packet
r1_ripd(config)# log file /usr/local/etc/ripd.log

然后我们在shell下查看debug信息

shell_1> tail -f /usr/local/etc/ripd.log
--------------------------------8<---------------------------------------
2002/04/28 22:17:44 RIP: update timer fire!
2002/04/28 22:17:44 RIP: SEND UPDATE to eth0 ifindex 2
2002/04/28 22:17:44 RIP: multicast announce on eth0
2002/04/28 22:17:44 RIP: update routes on interface eth0 ifindex 2
2002/04/28 22:18:23 RIP: update timer fire!
2002/04/28 22:18:23 RIP: SEND UPDATE to eth0 ifindex 2
2002/04/28 22:18:23 RIP: multicast announce on eth0
2002/04/28 22:18:23 RIP: update routes on interface eth0 ifindex 2
2002/04/28 22:19:04 RIP: update timer fire!
2002/04/28 22:19:04 RIP: SEND UPDATE to eth0 ifindex 2
2002/04/28 22:19:04 RIP: multicast announce on eth0
2002/04/28 22:19:04 RIP: update routes on interface eth0 ifindex 2
--------------------------------8<---------------------------------------

RIP每隔30秒发送一次更新,在sh ip prot可以看到Sending updates every 30 seconds with +/-50%

第二台机器的设置

前面的初始化和第一台一样,不过这里名字设成r2便于辨认,IP设成了192.168.5.123/24。

进入第二台机器的rip设置

shell_2> ripd -d
shell_2> telnet localhost 2602
Password:
ripd> en
ripd# conf t
ripd(config)# hostname r2_ripd
r2_ripd(config)# router rip
r2_ripd(config-router)# network 192.168.5.0/24

执行完network命令,我们看到第一台机器的tail -f /usr/local/etc/ripd.log输出下面的信息:

--------------------------------8<---------------------------------------
2002/04/28 22:19:15 RIP: RECV packet from 192.168.5.123 port 520 on eth0
2002/04/28 22:19:15 RIP: RECV REQUEST version 2 packet size 24
2002/04/28 22:19:15 RIP:   0.0.0.0/0 -> 0.0.0.0 family 0 tag 0 metric 16
2002/04/28 22:19:15 RIP: update routes to neighbor 192.168.5.123
2002/04/28 22:19:35 RIP: update timer fire!
2002/04/28 22:19:35 RIP: SEND UPDATE to eth0 ifindex 2
2002/04/28 22:19:35 RIP: multicast announce on eth0
2002/04/28 22:19:35 RIP: update routes on interface eth0 ifindex 2
--------------------------------8<---------------------------------------

r1通过UDP广播接收到192.168.5.123的更新包,并且把192.168.5.123设为neighbor。

保存一下配置

r1_ripd# copy run start
Configuration saved to /usr/local/etc/ripd.conf
r2_ripd# copy run start
Configuration saved to /usr/local/etc/ripd.conf

Zebra还支持很多RIP功能,如果Filtering RIP Routes, RIP route-map, RIP Authentication等,有条件有时

间 的话可以做更复杂的实验。

3、用Zebra做OSPF实验

OSPF(开放最短路径优先)路由协议是一项链路状态型技术,是目前IGP中应用最广、性能最优的一个 协议,

解决了RIP不能解决的大型、可扩展的网络需求而写的,适用于大规模的网络。

Zebra支持OSPFv2和OSPFv3(用于IPv6的OSPF,CISCO还未对其封装),由于条件所限,下面的OSPF实 验同样是

在两台单网卡的RedHat7.2下做的。

Zebra使用ospfd程序实现OSPF路由功能,但ospfd需要从zebra程序获得接口信息,所以zebra程序必须在 ospfd

程序之前运行。ospfd不支持多个OSPF进程,我们不能指定OSPF进程号。

初始化第一台机器:

shell_1> cd /usr/local/etc
shell_1> cp zebra.conf.sample zebra.conf
shell_1> cp ospfd.conf.sample ospfd.conf
shell_1> zebra -d

进入zebra设置IP

shell_1> telnet localhost 2601
Password:
Router> en
Password:
Router# conf t
Router(config)# hostname r1
r1(config)# int eth0
r1(config-if)# ip address 192.168.5.121/24
r1(config-if)# ctrl+z
r1# copy run start

进入第一台机器的ospf设置

shell_1> ospfd -d
shell_1> telnet localhost 2604
Password:
ospfd> en
ospfd# conf t
ospfd(config)# hostname r1_ospfd !改个名字好辨认
r1_ospfd(config)# router ospf !启动ospf
r1_ospfd(config-router)# ospf router-id 192.168.5.121 !设置router-id
r1_ospfd(config-router)# network 192.168.5.0/24 area 0
!最关键的,来标识路由器上哪些IP网络号是OSPF的一部分,对于每个网络,我们必须标识该网络所属 的区域

。由于我们只有两台机器,当然只有一个网络,所以只需执行一个network命令就够了。

对于我们的小网络,ospf就算配好了,下面来检验一下:

r1_ospfd(config-router)# ctrl+z
r1_ospfd# sh ip ospf route
============ OSPF network routing table ============
N    192.168.5.0/24        [10] area: 0.0.0.0
                           directly attached to eth0

============ OSPF router routing table =============

============ OSPF external routing table ===========

r1_ospfd# sh ip ospf database

       OSPF Router with ID (192.168.5.121)

                Router Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum  Link count
192.168.5.121   192.168.5.121    126 0x80000002 0x8584 1

r1_ospfd# sh ip ospf int eth0
eth0 is up, line protocol is up

  Internet Address 192.168.5.121/24, Area 0.0.0.0
  Router ID 192.168.5.121, Network Type BROADCAST, Cost: 10
  Transmit Delay is 1 sec, State DR, Priority 1
  Designated Router (ID) 192.168.5.121, Interface Address 192.168.5.121
  No backup designated router on this network
  Timer intarvals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:07
  Neighbor Count is 0, Adjacent neighbor count is 0

由于网络里没有其它的路由器,r1就把自己选为DR(指定路由器)了。Zebra对log处理可能有些问题,使 用

log stdout不能显示各种debug信息,所以只能记录到文件,在shell下用tail命令查看。而且debug命令和 实

际路由器也有不同。

r1_ospfd# debug ospf event
r1_ospfd(config)# log file /usr/local/etc/ospfd.log

然后我们在shell下查看debug信息

shell_1> tail -f /usr/local/etc/ospfd.log
--------------------------------8<---------------------------------------
2002/04/28 14:24:27 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 14:24:37 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 14:24:47 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 14:24:57 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 14:25:07 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
--------------------------------8<---------------------------------------

我们错过了最开始的信息,看到路由器每隔10秒发送一个hello数据包。hello数据包通过多目组播地址

224.0.0.5被发送出去,如果我们打开debug ospf packet all就能很清楚的看到。

第二台机器的设置

前面的初始化和第一台一样,不过这里名字设成r2便于辨认,IP设成了192.168.5.123/24。

进入第二台机器的ospf设置

shell_2> ospfd -d
shell_2> telnet localhost 2604
Password:
ospfd> en
ospfd# conf t
ospfd(config)# hostname r2_ospfd
r2_ospfd(config)# router ospf
r2_ospfd(config-router)# ospf router-id 192.168.5.123
r2_ospfd(config-router)# network 192.168.5.0/24 area 0

执行完network命令,我们看到第一台机器的tail -f /usr/local/etc/ospfd.log输出下面的信息:

--------------------------------8<---------------------------------------
2002/04/28 14:25:51 OSPF: Packet 192.168.5.123 [Hello:RECV]: Options *|*|-|-|-|-|E|*
2002/04/28 14:25:51 OSPF: NSM[eth0:192.168.5.121:0.0.0.0]: start
2002/04/28 14:25:52 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 14:25:52 OSPF: couldn't find any VL to associate the packet with
2002/04/28 14:25:52 OSPF: DR-Election[1st]: Backup 192.168.5.123
2002/04/28 14:25:52 OSPF: DR-Election[1st]: DR     192.168.5.121
2002/04/28 14:25:52 OSPF: Packet[DD]: Negotiation done (Slave).
--------------------------------8<---------------------------------------

r1收到r2(192.168.5.123)发过来的hello数据包,交换信息后选举DR,由于本身192.168.5.121是DR了,所以

只选举了BDR就好了。这时在r1上就能看到r2了。

r1_ospfd# sh ip ospf neig

Neighbor ID     Pri   State           Dead Time   Address         Interface              RXmtL

RqstL DBsmL
192.168.5.123     1   Full/Backup     00:00:37    192.168.5.123   eth0:192.168.5.121     0     0 

   0

检验其它信息

r1_ospfd# sh ip ospf database

       OSPF Router with ID (192.168.5.121)

                Router Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum  Link count
192.168.5.121   192.168.5.121   1259 0x80000008 0x534e 1
192.168.5.123   192.168.5.123   1265 0x80000006 0x534a 1

                Net Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum
192.168.5.123   192.168.5.123   1265 0x80000001 0x5a5a

r1_ospfd# sh ip ospf int eth0
eth0 is up, line protocol is up

  Internet Address 192.168.5.121/24, Area 0.0.0.0
  Router ID 192.168.5.121, Network Type BROADCAST, Cost: 10
  Transmit Delay is 1 sec, State DR, Priority 1
  Designated Router (ID) 192.168.5.121, Interface Address 192.168.5.121
  Backup Designated Router (ID) 192.168.5.123, Interface Address 192.168.5.123
  Timer intarvals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:01
  Neighbor Count is 1, Adjacent neighbor count is 1

和前面的输出信息相比,发生了很多变化,两台路由器已经相互识别了。OSPF不象RIP一样,每隔30秒 给所有

的邻居广播一次完整的路由表,而是通过IP多目组播地址224.0.0.5每隔10秒发送一个很小的hello 数据包来维

护邻居关系,当链路发生变化的时候,才重新计算。

拔掉两台机器连接的网线,看ospfd.log的记录:

--------------------------------8<---------------------------------------
2002/04/28 16:25:53 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 16:25:57 OSPF: Packet 192.168.5.123 [Hello:RECV]: Options *|*|-|-|-|-|E|*
2002/04/28 16:26:03 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 16:26:13 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 16:26:23 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 16:26:33 OSPF: make_hello: options: 2, int: eth0:192.168.5.121
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): Start
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): looked through areas
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): bb_configured: 1
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): bb_act_attached: 1
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): areas_configured: 1
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): areas_act_attached: 1
2002/04/28 16:26:37 OSPF: nsm_change_status(): scheduling new router-LSA origination
2002/04/28 16:26:37 OSPF: DR-Election[1nd]: Backup 0.0.0.0
2002/04/28 16:26:37 OSPF: DR-Election[1nd]: DR     192.168.5.121
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): Start
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): looked through areas
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): bb_configured: 1
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): bb_act_attached: 1
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): areas_configured: 1
2002/04/28 16:26:37 OSPF: ospf_check_abr_status(): areas_act_attached: 1
2002/04/28 16:26:37 OSPF: Timer[router-LSA]: (router-LSA Refresh expire)
2002/04/28 16:26:37 OSPF: counting fully adjacent virtual neighbors in area 0.0.0.0
2002/04/28 16:26:37 OSPF: there are 0 of them
2002/04/28 16:26:37 OSPF: SPF: calculation timer scheduled
2002/04/28 16:26:37 OSPF: SPF: calculation timer delay = 5
2002/04/28 16:26:37 OSPF: ospf_flood_through_interface(): considering int eth0:192.168.5.121
2002/04/28 16:26:37 OSPF: ospf_flood_through_interface(): considering nbr 192.168.5.121
2002/04/28 16:26:42 OSPF: SPF: Timer (SPF calculation expire)
2002/04/28 16:26:42 OSPF: ospf_spf_calculate: Start
2002/04/28 16:26:42 OSPF: ospf_spf_calculate: running Dijkstra for area 0.0.0.0
2002/04/28 16:26:42 OSPF: SPF Result: 0 [R] 192.168.5.121
2002/04/28 16:26:42 OSPF: ========== OSPF routing table ==========
2002/04/28 16:26:42 OSPF: ========================================
2002/04/28 16:26:42 OSPF: ospf_process_stub():processing stubs for area 0.0.0.0
2002/04/28 16:26:42 OSPF: ospf_process_stub():processing router LSA, id: 192.168.5.121
2002/04/28 16:26:42 OSPF: ospf_process_stub(): we have 1 links to process
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): Start
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): processing route to 192.168.5.0/24
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): calculated cost is 0 + 10 = 10
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): installing new route
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): this network is on this router
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): the interface is eth0:192.168.5.121
2002/04/28 16:26:42 OSPF: ospf_intra_add_stub(): Stop
2002/04/28 16:26:42 OSPF: children of V:
2002/04/28 16:26:42 OSPF: ospf_spf_calculate: Stop
2002/04/28 16:26:42 OSPF: ospf_ia_routing():start
2002/04/28 16:26:42 OSPF: ospf_ia_routing():not ABR, considering all areas
2002/04/28 16:26:42 OSPF: Pruning unreachable networks
2002/04/28 16:26:42 OSPF: Pruning unreachable routers
2002/04/28 16:26:42 OSPF: Route: Router Routing Table free
2002/04/28 16:26:42 OSPF: SPF: calculation complete
--------------------------------8<---------------------------------------

我们看到r1生成一个LSA包,通知其它路由器,由于网络里只有自己了,又选自己为DR。r2也是一样。 我们再

插上网线,查看ospfd.log:

--------------------------------8<---------------------------------------
2002/04/28 16:52:08 OSPF: Packet 192.168.5.123 [Hello:RECV]: Options *|*|-|-|-|-|E|*
2002/04/28 16:52:08 OSPF: NSM[eth0:192.168.5.121:0.0.0.0]: start
2002/04/28 16:52:08 OSPF: DR-Election[1st]: Backup 192.168.5.123
2002/04/28 16:52:08 OSPF: DR-Election[1st]: DR     192.168.5.121
2002/04/28 16:52:08 OSPF: DR-Election[1st]: Backup 0.0.0.0
2002/04/28 16:52:08 OSPF: DR-Election[1st]: DR     192.168.5.123
2002/04/28 16:52:08 OSPF: DR-Election[2nd]: Backup 192.168.5.121
2002/04/28 16:52:08 OSPF: DR-Election[2nd]: DR     192.168.5.123
--------------------------------8<---------------------------------------

由于拔了网线,r1和r2都把自己选为DR,一个网络只能有一个DR,所以恢复连接后它们重新进行了DR选 举,由

于192.168.5.123的router id大,所以它被选为DR。

保存一下配置

r1_ospfd# copy run start
Configuration saved to /usr/local/etc/ospfd.conf
r2_ospfd# copy run start
Configuration saved to /usr/local/etc/ospfd.conf

以上只是演示了最简单的OSPF的配置,而OSPF在大型网络才广泛的使用,配置也复杂多很多。即使是 Zebra,

也还可用做复杂的多的OSPF实验。

4、用Zebra做BGP实验

RIP和OSPF都是内部网关协议(IGP),BGP属于外部网关协议(EGP)。BGP广泛用于Internet以连接 ISP,并将

企业与ISP互连。

当BGP的影响被完全了解,并且至少下列情况之一存在时,在AS中使用BGP才是最恰当的:
  1 AS允许数据包穿过它到达其它自治系统(例如,某个服务提供商)。
  2 AS有到其它自治系统的多条连接。
  3 必须对进入和离开AS的数据流进行控制。

对于互连的自治系统来说,BGP并不总是恰当的解决方案,如果有如下情况中的一个或多个时,不要使 用BGP:
  1 只有到Internet或另一AS的单一连接。
  2 无需考虑路由策略或路由选择。
  3 路由器缺乏经常性的BGP更新的内存或处理器。
  4 对路由过滤和BGP路径选择过程的了解十分有限。
  5 在自治系统间的带宽较低。
在这些情况下,应该使用静态路由。

Zebra支持BGP-4和BGP-4+,下面实验只是演示BGP的基本命令,以及debug的一些信息。一个比较复杂 的用

Zebra做BGP实验见http://www.unixreview.com/print/documentID=15977,有条件可以做一下。

Zebra使用bgpd程序实现BGP路由功能,但bgpd需要从zebra程序获得接口信息,所以zebra程序必须在 bgpd程序

之前运行。

初始化第一台机器:

shell_1> cd /usr/local/etc
shell_1> cp zebra.conf.sample zebra.conf
shell_1> cp bgpd.conf.sample bgpd.conf
shell_1> zebra -d

还有一个bgpd.conf.sample2配置样例是用于IPv6的。

进入zebra设置IP

shell_1> telnet localhost 2601
Password:
Router> en
Password:
Router# conf t
Router(config)# hostname r1
r1(config)# int eth0
r1(config-if)# ip address 192.168.5.121/24
r1(config-if)# ctrl+z
r1# copy run start

进入第一台机器的bgp设置

shell_1> bgpd -d

启动bgpd,我们看到TCP端口179已经打开。两台BGP路由器相互间建立一条TCP连接,交换消息以打开 和确认连

接参数。这两台路由器被称为对等路由器,或者邻居。

shell_1> telnet localhost 2605
Password:
bgpd> en
bgpd# conf t
bgpd(config)# hostname r1_bgpd
r1_bgpd(config)# router bgp 7675

配置样例里已经指定了AS为7675,我们懒的改就拿来用。AS是一个16bit的数字,其范围从1到 65535。RFC

1930给出了AS编号使用指南。从64512到65535的AS编号范围是留作私用的,类似私有IP。

r1_bgpd(config-router)# network 192.168.5.0/24
r1_bgpd(config-router)# neighbor 192.168.5.121 remote-as 7676

查看bgp信息:

r1_bgpd# sh ip bgp
BGP table version is 0, local router ID is 192.168.5.123
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.5.0      0.0.0.0                            32768 i

Total number of prefixes 1

把log记录到文件:

r1_bgpd# conf t
r1_bgpd(config)# log file /usr/local/etc/bgpd.log

打开debug选项:

r1_bgpd(config)# exit
r1_bgpd debug bgp events
r1_bgpd debug bgp keepalives
r1_bgpd debug bgp updates

然后在shell下用tail查看log记录:

shell_1> tail -f /usr/local/etc/bgpd.log
--------------------------------8<---------------------------------------
2002/04/29 19:13:08 BGP: 192.168.5.121 [Event] Connect start to 192.168.5.121 fd 10
2002/04/29 19:13:11 BGP: 192.168.5.121 [Event] Connect failed (Operation now in progress)
--------------------------------8<---------------------------------------

r1不能连接邻居192.168.5.121。

第二台机器的设置

前面的初始化和第一台一样,不过这里名字设成r2便于辨认,IP设成了192.168.5.123/24。

进入第二台机器的bgp设置

shell_2> bgpd -d
shell_2> telnet localhost 2605
Password:
bgpd> en
bgpd# conf t
bgpd(config)# hostname r2_bgpd

AS要设成不一样,所以修改一下:

r2_bgpd(config)# no router bgp 7675
r2_bgpd(config)# router bgp 7676
r2_bgpd(config-router)# network 192.168.5.0/24
r2_bgpd(config-router)# neighbor 192.168.5.123 remote-as 7675

这时第一台机器的log出现如下信息:

--------------------------------8<---------------------------------------
2002/04/29 19:16:35 BGP: [Event] BGP connection from host 192.168.5.121
2002/04/29 19:16:35 BGP: [Event] Make dummy peer structure until read Open packet
2002/04/29 19:16:35 BGP: 192.168.5.121 [Event] Transfer temporary BGP peer to existing one
2002/04/29 19:16:35 BGP: 192.168.5.121 [Event] Accepting BGP peer delete
2002/04/29 19:16:35 BGP: 192.168.5.121 send UPDATE 192.168.5.0/24 nexthop 192.168.5.123, origin

i, path
2002/04/29 19:16:35 BGP: 192.168.5.121 rcvd UPDATE w/ attr: nexthop 192.168.5.121, origin i, path

7676
2002/04/29 19:16:35 BGP: 192.168.5.121 rcvd 192.168.5.0/24
--------------------------------8<---------------------------------------

两台bgp已经互连了。再看一下第一台机器的bgp信息:

r1_bgpd# sh ip bgp
BGP table version is 0, local router ID is 192.168.5.123
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*  192.168.5.0      192.168.5.121                          0 7676 i
*>                  0.0.0.0                            32768 i

Total number of prefixes 1

r1_bgpd# sh ip bgp neighbors
BGP neighbor is 192.168.5.121, remote AS 7676, local AS 7675, external link
  BGP version 4, remote router ID 192.168.5.121
  BGP state = Established, up for 00:01:13
  Last read 00:00:13, hold time is 180, keepalive interval is 60 seconds
  Neighbor capabilities:
    Route refresh: advertised and received (old and new)
    Address family IPv4 Unicast: advertised and received
  Received 98 messages, 0 notifications, 0 in queue
  Sent 103 messages, 0 notifications, 0 in queue
  Route refresh request: received 0, sent 0
  Minimum time between advertisement runs is 0 seconds

For address family: IPv4 Unicast
  Community attribute sent to this neighbor (both)
  1 accepted prefixes

  Connections established 2; dropped 1
Local host: 192.168.5.123, Local port: 179
Foreign host: 192.168.5.121, Foreign port: 1029
Nexthop: 192.168.5.123
Read thread: on  Write thread: off

Zebra还支持很多BGP的特性,请参考GNU Zebra Manual,有条件的可以做一下那些实验。

Zebra的Mailing List比较活跃,有许多人在那里讨论Zebra的开发和配置等等,有问题的话,在那里应该 能得

到解答。

Reference

GNU Zebra Manual
http://www.pointless.net/~jasper/zebra-html/zebra_toc.html#SEC_Contents
组建可扩展的Cisco网络
http://www.unixreview.com/print/documentID=15977]


                       

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zebra基本配置 的相关文章

  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 定时器启动/停止参数

    自从加入这个社区以来 我在技能和进步方面取得了突飞猛进的进步 你们都是一个巨大的帮助 我无法提供一个计时器 该计时器已在启动和停止时实现了某些参数 我要么收到错误消息 局部变量计时器可能尚未初始化 要么没有收到错误消息 但什么也没有发生 也
  • 如何实现urllib2.urlopen的超时控制

    如何在Python中实现对urllib2 urlopen的控制 我只是想监控如果5秒内没有xml数据返回 则切断此连接并重新连接 我应该使用一些计时器吗 谢谢 urllib2 urlopen http www example com tim
  • 界面与组合

    我想我理解接口和抽象之间的区别 抽象设置默认行为 在纯抽象的情况下 行为需要由派生类设置 接口是您所需要的 无需基类的开销 那么接口相对于组合的优势是什么 我能想到的唯一优点是在基类中使用受保护的字段 我缺少什么 你的标题没有意义 你的解释
  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 让 Emacs ansiterm 和 Zsh 更好地发挥作用

    我一直在尝试在 emacs 会话中使用 Zsh 而无需 emacs 重新映射所有 Zsh 键 我发现 ansi term 对此非常有效 但是我仍然遇到一些问题 我输出了很多垃圾字符 我可以用以下方法修复它 Setup proper term
  • ANSI 转义码在行尾有奇怪的行为

    重现步骤 考虑以下 shell 命令 echo e e 41mTest nTest2 e 0mTest3 它打印Test并在下一行中Test2具有红色背景 使用 ANSI 转义码 Test2后面直接是Test3这是无色的 行为 第一次执行此
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • shell脚本“x$VARIABLE”中x的用途[重复]

    这个问题在这里已经有答案了 我正在查看一些 shell 脚本 comarison shcu 中 x 的用途是什么 if x USER x RUN AS USER then su RUN AS USER c CATALINA HOME bin
  • 如何在fish shell脚本中获取程序名称?

    在 bash 中 与在 ruby 中一样 程序名称由 0 给出 鱼里有什么 如果有必要 我可以执行以下操作 set PROGRAM ps no header o args p self egrep o S 2 但我确信程序名称必须已经在某个
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 在 shell 脚本中连接命令字符串

    我正在维护一个现有的 shell 脚本 它将命令分配给 shell 脚本中的变量 例如 MY COMMAND bin command dosomething 然后接下来 它通过执行以下操作将 参数 传递给 MY COMMAND MY ARG
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • C# 中 getter 和 setter 的接口

    当我读到这里时http msdn microsoft com en us library 75e8y5dd 28v VS 100 29 aspx http msdn microsoft com en us library 75e8y5dd
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • Auto-value-gson出现接口错误,注册一个InstanceCreator?

    我有一个如下所示的接口类 public interface Species String name And a Human实现的类 AutoValue使用类型适配器 AutoValue public abstract class Human

随机推荐

  • 关于IP分片的一篇小论文

    关键字 IP分片 MTU MSS 引言 分片是分组交换的思想体现 也是IP协议解决的两个主要问题之一 在IP协议中的分片算法主要解决不同物理网络最大传输单元 MTU 的不同造成的传输问题 但是分组在传输过程中不断地分片和重组会带来很大的工作
  • 使用C语言操作环境变量

    获取环境变量内容 char getenv char name 参数 name欲获取的环境变量名称 返回值 环境变量值 NULL表示没有找到环境变量 设置环境变量 int putenv char string 参数 string环境变量字符串
  • linuxsed替换字符串后保存_字符串方法——replace()

    1 字符串方法 replace str replace old new max 参数说明 Parameters old 被替换的字符串 new 新字符串 替换原来的old字符串 max 可选参数 替换不超过max次 例子 Example s
  • 什么是抖动?什么叫抖动

    什么是抖动 什么叫抖动 抖动的定义是 数字信号的各个有效瞬时对其当时的理想位置的短期性偏离 这意味着抖动是不希望有的数字信号的相位调制 相位偏离的频率称为抖动频率 与抖动有密切关系的第二个参数称为漂移 把它定义为 数字信号的各个有效瞬间相对
  • [NOI Online #3 入门组 T3]买表【二进制优化dp背包】

    题目链接 很可惜的一点就是 我正赛的时候好像把a和k看反了 于是一直想不到如何做 打了个暴力分 现在想想 暴力分也错了 因为a和k真的很关键 使得最后300变成200分 人生第一场OI就这样草草结束 或许这就是OI选手的刺激所在吧 得亏我不
  • DDR工作原理

    DDR SDRAM全称为Double Data Rate SDRAM 中文名为 双倍数据流SDRAM DDR SDRAM在原有的SDRAM的基础上改进而来 也正因为如此 DDR能够凭借着转产成本优势来打败昔日的对手RDRAM 成为当今的主流
  • csdn找到自己关注的人和关注自己的人-2021最新

    前言 csdn找到自己关注的人和关注自己的人 2021最新 入口 https my csdn net my follow 点进入以后是这样的 就是没办法查找具体某个人
  • JDK、IDEA等安装详解

    第一章 计算机基础知识 1 2 计算机简介 计算机俗称电脑 是第二次世界战争时 美国国防部利用它来进行弹道计算 第一台通用计算机叫做 ENIAC 当时计算机是一个庞然大物 用了18000个电子管 占地170平方米 重达30吨 耗电功率约15
  • nginx七层代理和四层转发的理解

    先来理解一下osi七层模型 应用层 应用层是ISO七层模型的最高层 它直接与用户和应用程序交互 提供用户与网络的接口 它包括各种应用协议 如HTTP FTP SMTP等 用于实现特定应用的功能和通信 表示层 表示层负责数据的格式转换 加密和
  • Introduction of moving block bootstrap (MBB)algorithm

    Because we can not use usual bootstrap sampling method to get subsamples from time series dataset then the MBB was propo
  • 软件测试人员的职业晋升之路

    关于软件测试行业的职业发展方向 在网络上总能看到各种各样的问题 有关注零基础能不能入行的 有关注25岁入行晚不晚的 还有关注35岁后的职业发展方向的 在此过程中 看到很多行业大佬分享了自己的工作经验 也给出了很多自己的建议 要想在测试行业有
  • Ubuntu18.04 安装 TensorFlow (GPU)

    重新在台式机上学习深度学习 Ubuntu18 04 Tensorflow gpu cuda8 0 cuDNN6 0 一 准备工作 有一些不是必需的 1 安装pip 打开终端输入命令 sudo apt get install python p
  • Netty实战(二)第一个Netty程序

    第一个Netty程序 一 环境准备 二 Netty 客户端 服务器概览 三 编写 Echo 服务器 3 1 ChannelHandler 和业务逻辑 3 2 引导服务器 四 编写 Echo 客户端 4 1 通过 ChannelHandler
  • AI芯片学习小结4-谷歌TPU与脉动阵列

    AI芯片学习小结4 谷歌TPU与脉动阵列 文章 In Datacenter Performance Analysis of a Tensor Processing Unit 时间 2017 Reference 深入理解Google TPU的
  • STM32 局部数组使用过大溢出到全局影响代码运行

    一 问题 在函数内定义局部数组大小为400 发现其影响了串口接收中断 二 原因 通过动态调试得知 其分配的局部数组地址与全局的串口结构体的空间部分重合造成了寄存器异常中断开启失败 出现此原因在于分配的栈不够造成局部数组溢出占用全局空间 如果
  • 基站信号强度些问题

    1 package myapplication com myjizhansj 2 3 import android content Context 4 import android graphics Color 5 import andro
  • 服务器装win7无限重启吗,win7系统重装系统后无限重启电脑的解决方法

    很多小伙伴都遇到过win7系统重装系统后无限重启电脑的困惑吧 一些朋友看过网上零散的win7系统重装系统后无限重启电脑的处理方法 并没有完完全全明白win7系统重装系统后无限重启电脑是如何解决的 今天小编准备了简单的解决办法 只需要按照1
  • 流处理架构选型

    greenplum flink 做流处理 从批处理ETL到流式处理 一个来自Netflix的案例 https juejin im entry 5aa73ccd6fb9a028c81285cb greenplum oracle12C 分布式R
  • 【项目设计】高并发内存池(二)[高并发内存池整体框架设计|threadcache]

    C 学习历程 入门 博客主页 一起去看日落吗 持续分享博主的C 学习历程 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 也许你现在做的事情 暂时看不到成果 但不要忘记 树 成长之前也要扎根 也要在漫长的时光 中沉淀养
  • Zebra基本配置

    前言 Zebra是一个路由软件包 提供基于TCP IP路由服务 支持RIPv1 RIPv2 RIPng OSPFv2 OSPFv3 BGP 4 和 BGP 4 等众多路由协议 Zebra还支持BGP特性路由反射器 Route Reflect