作者:蔡伸,單位:中國移動智慧家庭運營中心成都分公司
FRRouting (FRR)可以在本機Linux/Unix進(jìn)行部署,使機器快速具備各種路由協(xié)議交互功能,讓設(shè)備成為一個簡單的企業(yè)界路由器。很多設(shè)備商的路由器產(chǎn)品就是基于FRR進(jìn)行二次開發(fā)的,可見對FRR的認(rèn)可度之高。
Part 01●??FRRouting概述?●
FRRouting (FRR) 是一個免費、開源的互聯(lián)網(wǎng)路由協(xié)議套件,適用于Linux和Unix平臺。它實現(xiàn)了BGP、OSPF、RIP、IS-IS、PIM、LDP、BFD、Babel、PBR、OpenFabric 和 VRRP 等路由協(xié)議,并提供了alpha版本支持EIGRP和NHRP。
FRR無縫集成了本機Linux/Unix IP網(wǎng)絡(luò)堆棧,使其成為通用路由堆棧,適用于各種用例,包括將主機、虛擬機和容器連接到網(wǎng)絡(luò)、通告網(wǎng)絡(luò)服務(wù)、LAN交換和路由、互聯(lián)網(wǎng)接入路由器和互聯(lián)網(wǎng)對等互連等能力。
簡而言之,F(xiàn)RR可以在本機Linux/Unix進(jìn)行部署,使機器快速具備各種路由協(xié)議交互功能,讓設(shè)備成為一個簡單的企業(yè)界路由器。很多設(shè)備商的路由器產(chǎn)品就是基于FRR進(jìn)行二次開發(fā)的,可見對FRR的認(rèn)可度之高。
FRR主要集成了網(wǎng)絡(luò)三層路由協(xié)議,其中最重要且常用的如下:
OSPF(Open Shortest Path First):OSPF路由協(xié)議是用于網(wǎng)際協(xié)議(IP)網(wǎng)絡(luò)的鏈路狀態(tài)路由協(xié)議。該協(xié)議使用鏈路狀態(tài)路由算法的內(nèi)部網(wǎng)關(guān)協(xié)議(IGP),在單一自治系統(tǒng)(AS)內(nèi)部工作。適用于IPv4的OSPFv2協(xié)議定義于RFC 2328,RFC 5340定義了適用于IPv6的OSPFv3。
IS-IS(Intermediate system to intermediate system):中間系統(tǒng)到中間系統(tǒng)是一種內(nèi)部網(wǎng)關(guān)協(xié)議,是電信運營商普遍采用的內(nèi)部網(wǎng)關(guān)協(xié)議之一。標(biāo)準(zhǔn)的IS-IS協(xié)議是由國際標(biāo)準(zhǔn)化組織制定的ISO/IEC 10589:2002 所規(guī)范的。但是標(biāo)準(zhǔn)的IS-IS協(xié)議是為無連接網(wǎng)絡(luò)服務(wù)(CLNS)設(shè)計的,并不直接適合于IP網(wǎng)絡(luò),因此互聯(lián)網(wǎng)工程任務(wù)組制定可以適用于IP網(wǎng)絡(luò)的集成化的IS-IS協(xié)議,稱為集成IS-IS,它由RFC 1195等RFC文檔所規(guī)范。由于IP網(wǎng)絡(luò)的普遍存在,一般所稱的IS-IS協(xié)議,通常是指集成IS-IS協(xié)議。
BGP(Border Gateway Protocol):邊界網(wǎng)關(guān)協(xié)議(BGP)是運行于 TCP 上的一種自治系統(tǒng)的路由協(xié)議。BGP 是一種用來處理像因特網(wǎng)大小的網(wǎng)絡(luò)的協(xié)議,也是一種能夠妥善處理好不相關(guān)路由域間的多路連接的協(xié)議。BGP 構(gòu)建在 EGP 的經(jīng)驗之上。BGP 系統(tǒng)的主要功能是和其他的 BGP 系統(tǒng)交換網(wǎng)絡(luò)可達(dá)信息。網(wǎng)絡(luò)可達(dá)信息包括列出的自治系統(tǒng)(AS)的信息。這些信息有效地構(gòu)造了 AS 互聯(lián)的拓?fù)鋱D并由此清除了路由環(huán)路,同時在 AS 級別上可實施策略決策。
Part 02●??FRRouting支持的特性?●
FRR支持豐富的特性和許多平臺,不同平臺支持的特性有所不同,下表為FRR具體支持的特性。
Part 03●??FRRouting的架構(gòu)?●
傳統(tǒng)的路由軟件通常是單個進(jìn)程程序,負(fù)責(zé)所有路由協(xié)議功能。相比之下,F(xiàn)RR使用了一種不同的方法。它由多個守護(hù)程序組成,共同構(gòu)建路由表。每個重要的協(xié)議都在它自己的守護(hù)程序中實現(xiàn),這些守護(hù)程序與一個中間守護(hù)程序(zebra)通信,協(xié)調(diào)路由決策并與數(shù)據(jù)平面通信。
FRR采用模塊化架構(gòu),具有高度的靈活性和可擴(kuò)展性。它的模塊化設(shè)計使得添加新的協(xié)議或功能非常容易。每個守護(hù)程序都實現(xiàn)了插件系統(tǒng),可以在運行時加載新功能,從而擴(kuò)展整個套件而無需重新編譯整個程序。
FRR的架構(gòu)具有模塊化特點,因此單個協(xié)議守護(hù)程序的錯誤、崩潰或漏洞通常不會影響其他協(xié)議,提高了整個系統(tǒng)的彈性和可靠性。另外,F(xiàn)RR的靈活性使得它可以根據(jù)不同網(wǎng)絡(luò)的特定路由需求進(jìn)行定制。FRR的整體框架如下圖:
Zebra:Zebra 是一個 IP 路由管理器。它提供內(nèi)核路由表更新、接口查找以及不同路由協(xié)議之間的路由重新分發(fā)。它是一個獨立進(jìn)程,所有進(jìn)程之間通信都通過zebra進(jìn)行。
BGPD、OSPFD:這些獨立的進(jìn)程代表了不同協(xié)議的處理進(jìn)程,以上兩個進(jìn)程分別實現(xiàn)了BGP和OSPF。
Part 04●?如何快速搭建FRRouting??●
(1)獲取FRRouting源碼
從FRR官方網(wǎng)站上獲取FRRouting的git地址或者安裝包
https://frrouting.org/
以GitHub獲取源碼安裝為例:
git clone https://github.com/FRRouting/frr.git
(2)創(chuàng)建configuration
FRRouing下載后會提供一個配置腳本,可自動檢測大多數(shù)主機配置。有幾個其他配置選項可用于自定義生成以包含或排除特定功能和依賴項。
./bootstrap.sh
在配置完成后,可以設(shè)置各類config屬性,如下表:
(3)打開內(nèi)核轉(zhuǎn)發(fā)功能
/etc/sysctl.conf或者/etc/sysctl.d/90-routing-sysctl.conf
打開ipv4和ipv6轉(zhuǎn)發(fā):
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1
(4)開始構(gòu)建
選擇配置選項后,運行配置腳本并傳遞所選選項,示例如下:
./configure
--prefix=/usr
--localstatedir=/var/run/frr
--sbindir=/usr/lib/frr
--sysconfdir=/etc/frr
--enable-pimd
--enable-watchfrr
...
配置軟件后,就可以在系統(tǒng)中構(gòu)建和安裝它了。
make && sudo make install
一切成功之后,F(xiàn)RRouting就安裝成功了,可以開始設(shè)置FRRouting的配置文件了。
(5)進(jìn)程配置文件設(shè)置
剛安裝完后,啟動 FRR 不會執(zhí)行任何操作。這是因為必須通過編輯配置目錄中的文件來顯式啟用守護(hù)程序。此文件通常位于 /etc/frr/daemons 中,用于確定通過 init 或 systemd 發(fā)出服務(wù)啟動/停止命令時激活哪些守護(hù)進(jìn)程。如下所示:
zebra=no
bgpd=no
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
staticd=no
pbrd=no
bfdd=no
fabricd=no
# If this option is set the /etc/init.d/frr script automatically loads
# the config via "vtysh -b" when the servers are started.
# Check /etc/pam.d/frr if you intend to use "vtysh"!
vtysh_enable=yes
zebra_options=" -s 90000000 --daemon -A 127.0.0.1"
bgpd_options=" --daemon -A 127.0.0.1"
ospfd_options=" --daemon -A 127.0.0.1"
ospf6d_options=" --daemon -A ::1"
ripd_options=" --daemon -A 127.0.0.1"
ripngd_options=" --daemon -A ::1"
isisd_options=" --daemon -A 127.0.0.1"
pimd_options=" --daemon -A 127.0.0.1"
ldpd_options=" --daemon -A 127.0.0.1"
nhrpd_options=" --daemon -A 127.0.0.1"
eigrpd_options=" --daemon -A 127.0.0.1"
babeld_options=" --daemon -A 127.0.0.1"
sharpd_options=" --daemon -A 127.0.0.1"
staticd_options=" --daemon -A 127.0.0.1"
pbrd_options=" --daemon -A 127.0.0.1"
bfdd_options=" --daemon -A 127.0.0.1"
fabricd_options=" --daemon -A 127.0.0.1"
#MAX_FDS=1024
# The list of daemons to watch is automatically generated by the init script.
#watchfrr_options=""
# for debugging purposes, you can specify a "wrap" command to start instead
# of starting the daemon directly, e.g. to use valgrind on ospfd:
# ospfd_wrap="/usr/bin/valgrind"
# or you can use "all_wrap" for all daemons, e.g. to use perf record:
# all_wrap="/usr/bin/perf record --call-graph -"
# the normal daemon command is added to this at the end.
將需要打開的進(jìn)程設(shè)置為“yes”,然后執(zhí)行服務(wù)啟動命令。
systemctl daemon-reload
systemctl start frr
(6)使用界面
FRR的使用界面基本同cisco的路由器配置界面一致,安裝完后通過在系統(tǒng)中敲入vtysh進(jìn)入FRRouting管理界面,如下圖:
圖片來自筆者測試截圖,Ubuntu18.04
敲入configure terminal進(jìn)入配置管理模式,敲入?顯示支持的配置模塊,如下圖:
圖片來自筆者測試截圖,Ubuntu18.04
至此,Linux-PC已經(jīng)能夠配置各種路由協(xié)議和各類路由設(shè)備對接了。
Part 05●??構(gòu)建實驗測試環(huán)境?●
圖片來自筆者測試截圖,eNSP構(gòu)建
其中外省一路由設(shè)備通過CLOUD1用安裝了FRR的Linux-PC模擬,其他路設(shè)備均為華為路由設(shè)備。
外省1的配置如下:
圖片來自筆者測試截圖,Ubuntu18.04
實驗結(jié)論:通過正常配置BGP命令,確保對端配置正常的情況下,在端到端進(jìn)行抓包,發(fā)現(xiàn)BGP完成了控制報文交互,BGP鄰居正常建立,端到端訪問正常,BGP發(fā)布的路由其他路由設(shè)備能正確學(xué)習(xí)到。
Part 06●??結(jié)語?●
FRR是一個非常出色的開源軟件,它可以將普通的Linux-PC快速轉(zhuǎn)變成一臺功能強大的企業(yè)級路由器,滿足日常網(wǎng)絡(luò)需求。盡管如此,為了提高FRR的性能和穩(wěn)定性,我們需要研發(fā)人員投入更多的時間和精力,在不斷地研究和開發(fā)上不斷優(yōu)化完善。
未來,隨著數(shù)字化時代的到來和互聯(lián)網(wǎng)應(yīng)用領(lǐng)域的不斷擴(kuò)大,F(xiàn)RR將迎來巨大的機遇和挑戰(zhàn)。我們期待看到更多的高質(zhì)量特性被添加到FRR中,從而滿足不斷變化的市場需求。同時,我們也預(yù)計FRR將吸引更多的行業(yè)專家參與其中,共同推動其發(fā)展,為用戶帶來更加優(yōu)質(zhì)、安全、高效的使用體驗。
參考文獻(xiàn)
[1] FRRouting技術(shù)文檔[EB/OL].[2023-06-20].https://docs.frrouting.org/projects/dev-guide/en/latest/.