Quagga 路由軟體學習(by quqi99)

quqi99發表於2013-07-07

Quagga 路由軟體學習(by quqi99)

作者:張華  發表於:2013-07-07
版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告

 http://blog.csdn.net/quqi99 )

             
         Quagga是一個開源的基於Zebra實現了RIP, OSPF, BGP的動態路由軟體。它提供的CLI命令和Cisco IOS類似。
1 安裝
        再下載原始碼,解壓後執行下列命令:
sudo yum install readline-devel #開啟vty功能需要readline包
./configure --enable-vtysh  --enable-user=root --enable-group=root –enable-vty-group=root  --sysconfdir=/etc/quagga –libdir=/lib
make && sudo make install
     
      如果不是用root使用者,如使用quagga使用者,則還需要:
sudo useradd -r -d /usr/local/sbin -s /sbin/nologin quagga
sudo mkdir /var/run/quagga
sudo chown quagga /var/run/quagga
sudo chgrp quagga /var/run/quagga

       它有下列程式,根據需要啟動:
zebra: 路由介面宣告和靜態路由
bgpd: 支援BGP
ospfd: 支援OSPF
ospf6d: 支援IPv6 OSPF
ripd: 支援RIP v2
ripngd: 支援RIP IPv6

 2 配置並啟動Zemba軟路由
     建立配置檔案: sudo mv /etc/guagga/zebra.conf.sample /etc/guagga/zebra.conf
     在/etc/hosts檔案中新增一條記錄:192.168.99.100 Router
     執行命令sudo zemba -d啟動zemba服務.
     上面sudo zemba -d命令只是將我們的“路由器”(軟路由)執行起來了(也就是轉發那塊),但是它還無法正常工作,現在還要給它配置路由表。路由表可以手工配置,也可以執行動態路由協議,vk rip, ospf實現自動配置。
      我們先看看如何手工配置路由,即執行“telnet localhost 2601”命令進行類似ciso IOS的配置路由配置介面。
Router> en
         #進入特權模式
Password: 
Router# config t
  
Router(config)# 
  access-list  Add an access list entry
  banner       Set banner string
  debug        Debugging functions (see also 'undebug')
  enable       Modify enable password parameters
  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
  hostname     Set system's network name
  interface    Select an interface to configure
  ip           IP information
  ipv6         IPv6 information
  line         Configure a terminal line
  list         Print command list
  log          Logging control
  no           Negate a command or set its defaults
  password     Assign the terminal connection password
  quit         Exit current mode and down to previous mode
  route-map    Create route-map or enter route-map command mode
  router-id    Manually set the router-id
  service      Set up miscellaneous service
  show         Show running system information
  table        Configure target kernel routing table
  write        Write running configuration to memory, network, or terminal

#給介面配置IP地址:
Router(config)# interface eth0
Router(config-if)# ip address 192.168.2.1/24

配置一個路由器的常用方法:
Router(config)# hostname R1
R1(config)# int em1
R1(config-if)# ip address 172.18.186.107/23
R1(config-if)# no shutdown
R1(config-if)# exit

3 開啟RIP/OSPF內部動態路由協議
sudo mv /etc/guagga/ripd.conf.sample /etc/guagga/ripd.conf
sudo ripd -d
例子:三臺虛機,一臺做路由,兩臺做客戶端
路由器所在的Linux分別有兩個網路卡,eth0:192.168.1.1和eth1:192.168.10.1。
客戶端A 所在網段為192.168.1.0/24,IP為192.168.1.2。
客戶端B所在網段為192.168.10.0/24,IP為192.168.10.2。
在路由器的虛機上安裝guagga,並開啟zebma及rip兩個協議,這時候是可以從192.168.1.2 ping 通 192.168.10.2的。

檢視RIP路由表:
ripd> router rip

       OSPF也是一個內部動態路由協議,它是基於狀態的,一個路由器上知道全自治區域的所有路由資訊。而RIP是基於最短路徑的,只能有一個最短的路由。
sudo mv /etc/guagga/ospfd.conf.sample /etc/guagga/ospfd.conf
sudo ospfd -d
ospf的手工配置介面是:telnet 0 2604

指定在172.18.186.0/23和192.168.3.0/24兩個網路之間使用rip協議
ripd> en
ripd# conf t
ripd(config)# router rip
ripd(config-router)# network 172.18.186.0/23
ripd(config-router)# network 192.168.3.0/24
ripd(config-router)# end
ripd#

如果OSPF,則應該指定哪些網路位於同一個區域,因為它是面向狀態的內部路由協議:
network 172.18.186.0/23 area 0
network 192.168.3.0/24 area 0


3 開啟BGP外部動態路由協議
 sudo mv /etc/guagga/bgpd.conf.sample /etc/guagga/bgpd.conf
sudo bgpd -d
手工配置介面是:telnet 0 2605
例子:







下面只顯示R1的Zebra配置過程,R2請自行配置:
Router> en
Password: 
R1# conf t
R1(config)# hostname r1
r1(config)# int em1
r1(config-if)# ip address 172.18.186.100/23

下面只顯示R1的BGP配置過程,R2請自行配置:
[hua@laptop nova]$ telnet 0 2605
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.22).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password: 
bgpd> en
bgpd# conf t
bgpd(config)# hostname r1_bgpd
#指定自治系統號7675(自治系統號是一個16bit的數字,從1-65535,其中64512-65535保留為私有)
r1_bgpd(config)# router bgp 7675
r1_bgpd(config-router)# network 172.18.186.0/23
r1_bgpd(config-router)# neighbor 172.18.186.101 remote-as 7676
r1_bgpd(config-router)# exit
r1_bgpd(config)# exit
r1_bgpd# sh ip bgp neighbors
r1_bgpd# show ip bgp
BGP table version is 0, local router ID is 0.0.0.0
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 172.18.186.0/23  0.0.0.0                  0         32768 i

Total number of prefixes 1
r1_bgpd# 

Total number of prefixes 1

開啟debug功能,將日記儲存到/tmp/bgpd.log檔案中。
r1_bgpd# debug bgp events
BGP events debugging is on
r1_bgpd# debug bgp keepalives
BGP keepalives debugging is on
r1_bgpd# debug bgp updates
BGP updates debugging is on
r1_bgpd# conf t
         
r1_bgpd(config)# log file /tmp/bgpd.log
r1_bgpd(config)# exit

5 路由的獲取
     Linux下的路由可以通過netlink包程式設計獲取
Quagga不直接使用底層的路由表或者硬體轉發表,它自己維護的路由表是RIB表,包含除主機路由以外的所有路由(因為主機路由是通過ARP學到的,而ARP是OS底層實現的)。RIB表包括直連路由,靜態路由,動態路由。而OS維護的表是轉發表,即FIB表,Quagga負責維護RIB與FIB間的同步,也負責各種路由協議的路由表與RIB間的同步;Quagga提供了幾種方式與核心通訊,類UNIX系統下的常見方式ioctl, sysctl, proc, netlink都有支援。RIB表是radix樹結構,而FIB表是hash table結構。radix是一個二叉樹,如下圖所示:
 該radix二叉樹用結構休route_table表示,


 根節點用結構體route_node表示,包括四個成員,表示字首的prefix結構體,左孩子、右孩子和表示下一路的info指標,info可以是下一跳的介面,或者IP,也可以是黑洞,分別對應著三種路由目標的型別:IFNAME, GATEWAY, BLACKHOLE。


一點體會:
設想兩個異地的openstack雲通過quagga進行動態路由學習互訪的話:
1, 首先需要ISP給資料中心分配一個BGP號(向CNNIC申請自治域號)
2,資料中心內部用OSPF,資料中心(內網ip)和ISP(外網ip)之間走BGP協議, 所有浮動ip地址需重分發到BGP路由裡【實驗9.11.2】 配置BGP和NAT一起使用【IEEEnjoy.L.ZH】 http://blog.csdn.net/ieeenjoy/article/details/1558248
3,也需按如下方法在路由器中配置浮動ip池
在路由器上配置一個DNAT地址,這樣通過在公網上訪問61.135.99.3可以訪問到內網地址192.168.10.2
ip nat inside source static 192.168.10.2 61.135.99.3
或許配置一個浮動ip池:
MYNAT 66.122.33.98 66.122.33.126 netmask 255.255.255.224
access-list 10 per 172.16.0.0 0.0.255.255
ip nat inside source list 10 pool MYNAT overload
4, 更具體地詳見下面列出的參考資料




  6 Reference

1, Quagga使用及實驗說明:http://wenku.baidu.com/view/59dc823d0912a216147929b9.html
2, EBGP和IBGP的一篇好文章, IBGP路由的水平分割 http://shenrq.blog.51cto.com/25801/154285
3, 實驗9.11.2 配置BGP和NAT一起使用, http://blog.csdn.net/ieeenjoy/article/details/1558248
4, 配置靜態地址轉換------釋出公司內網網站到網際網路上 http://blog.csdn.net/zhengzizhi/article/details/17013473
5, Setting Up Network With ISP WAN and Public IP Block subnets running NAT, http://www.dslreports.com/faq/15918
6, Cisco 2811 PPPOE+NAT 配置例項, http://iflaugh.blog.51cto.com/846701/172556
7, Neutron/DynamicRouting/TestingDynamicRouting https://wiki.openstack.org/wiki/Neutron/DynamicRouting/TestingDynamicRouting

相關文章