在 Linux 上使用開源軟體建立 SDN

2020-05-09 09:37:00

使用開源路由協定棧 Quagga,使你的 Linux 系統成為一台路由器。

網路路由協定分為兩大類:內部網路關協定和外部閘道器協定。路由器使用內部網路關協定在單個自治系統內共用資訊。如果你用的是 Linux,則可以通過開源(GPLv2)路由協定棧 Quagga 使其表現得像一台路由器。

Quagga 是什麼?

Quagga 是一個路由軟體包,並且是 GNU Zebra 的一個分支。它為類 Unix 平台提供了所有主流路由協定的實現,例如開放最短路徑優先(OSPF),路由資訊協定(RIP),邊界閘道器協定(BGP)和中間系統到中間系統協定(IS-IS)。

儘管 Quagga 實現了 IPv4 和 IPv6 的路由協定,但它並不是一個完整的路由器。一個真正的路由器不僅實現了所有路由協定,而且還有轉發網路流量的能力。 Quagga 僅僅實現了路由協定棧,而轉發網路流量的工作由 Linux 核心處理。

架構

Quagga 通過特定協定的守護程式實現不同的路由協定。守護程式名稱與路由協定相同,加了字母“d”作為字尾。Zebra 是核心,也是與協定無關的守護行程,它為核心提供了一個抽象層,並通過 TCP 通訊端向 Quagga 用戶端提供 Zserv API。每個特定協定的守護程式負責執行相關的協定,並基於交換的資訊來建立路由表。

Quagga architecture

環境

本教學通過 Quagga 實現的 OSPF 協定來設定動態路由。該環境包括兩個名為 Alpha 和 Beta 的 CentOS 7.7 主機。兩台主機共用存取 192.168.122.0/24 網路。

主機 Alpha:

IP:192.168.122.100/24 閘道器:192.168.122.1

主機 Beta:

IP:192.168.122.50/24 閘道器:192.168.122.1

安裝軟體包

首先,在兩台主機上安裝 Quagga 軟體包。它存在於 CentOS 基礎倉庫中:

yum install quagga -y

啟用 IP 轉發

接下來,在兩台主機上啟用 IP 轉發,因為它將由 Linux 核心來執行:

sysctl -w net.ipv4.ip_forward = 1sysctl -p

設定

現在,進入 /etc/quagga 目錄並為你的設定建立組態檔。你需要三個檔案:

  • zebra.conf:Quagga 守護程式的組態檔,你可以在其中定義介面及其 IP 地址和 IP 轉發
  • ospfd.conf:協定組態檔,你可以在其中定義將通過 OSPF 協定提供的網路
  • daemons:你將在其中指定需要執行的相關的協定守護程式

在主機 Alpha 上,

 [root@alpha]# cat /etc/quagga/zebra.confinterface eth0 ip address 192.168.122.100/24 ipv6 nd suppress-rainterface eth1 ip address 10.12.13.1/24 ipv6 nd suppress-rainterface loip forwardingline vty[root@alpha]# cat /etc/quagga/ospfd.confinterface eth0interface eth1interface lorouter ospf network 192.168.122.0/24 area 0.0.0.0 network 10.12.13.0/24 area 0.0.0.0line vty[root@alphaa ~]# cat /etc/quagga/daemonszebra=yesospfd=yes

在主機 Beta 上,

[root@beta quagga]# cat zebra.confinterface eth0 ip address 192.168.122.50/24 ipv6 nd suppress-rainterface eth1 ip address 10.10.10.1/24 ipv6 nd suppress-rainterface loip forwardingline vty[root@beta quagga]# cat ospfd.confinterface eth0interface eth1interface lorouter ospf network 192.168.122.0/24 area 0.0.0.0 network 10.10.10.0/24 area 0.0.0.0line vty[root@beta ~]# cat /etc/quagga/daemonszebra=yesospfd=yes

設定防火牆

要使用 OSPF 協定,必須允許它通過防火牆:

firewall-cmd --add-protocol=ospf –permanentfirewall-cmd –reload

現在,啟動 zebraospfd 守護程式。

# systemctl start zebra# systemctl start ospfd

用下面命令在兩個主機上檢視路由表:

[root@alpha ~]# ip route show  default via 192.168.122.1 dev eth0 proto static metric 10010.10.10.0/24 via 192.168.122.50 dev eth0 proto zebra metric 2010.12.13.0/24 dev eth1 proto kernel scope link src 10.12.13.1192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100

你可以看到 Alpha 上的路由表包含通過 192.168.122.50 到達 10.10.10.0/24 的路由項,它是通過協定 zebra 獲取的。同樣,在主機 Beta 上,該表包含通過 192.168.122.100 到達網路 10.12.13.0/24 的路由項。

[root@beta ~]# ip route showdefault via 192.168.122.1 dev eth0 proto static metric 10010.10.10.0/24 dev eth1 proto kernel scope link src 10.10.10.110.12.13.0/24 via 192.168.122.100 dev eth0 proto zebra metric 20192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100

結論

如你所見,環境和設定相對簡單。要增加複雜性,你可以向路由器新增更多網路介面,以為更多網路提供路由。你也可以使用相同的方法來實現 BGP 和 RIP 協定。