技業LOG
はじめに
~昨今はOSSでの開発が熱い~
昨今クラウドや仮想基盤などのデータセンターネットワークを支えるためのさまざまな技術が登場しています。Googleなどの Over The Top(OTT)や国内外のクラウドベンダー、コンテンツ事業者などにおいて柔軟かつスケールアウト可能なネットワークを実現するためのIP-CLOSアーキテクチャやルーティングプロトコルをサーバー上まで延伸するBGP on the hostなどが様々なシーンで普及しており、SONiCやFRRouting(以下FRRと記述)などのOSS(オープンソースソフトウェア)の開発が進められています。
今回はこのソフトウェアらを用いたネットワークの構築方法を紹介するため、SONiCというマイクロソフト他ベンダーが開発しているホワイトボックススイッチ向けオープンソースネットワークOSのVM版を用いてIP-CLOSというデータセンターネットワークの構築手法に基づきネットワーク構築し、その後FRRをインストールしたLinux VMを同ネットワークと接続しBGP on the hostという方式でLinuxサーバー上までBGPを延伸します。
これらは全てEVE-NGと呼ばれるネットワークエミュレーター上で構築します。
ネットワークの設計について
~ネットワーク構築は効率的に~
今回はシンプルかつスケール可能なネットワークシステムを目指し、2層のIP-CLOSネットワークを構築し、前述の通りサーバー含めて全てフルL3かつeBGPで接続します。この方式によってベンダー独自の冗長プロトコルが不要となり、VLAN管理やL2ループリスクを排除することができます。
またBGP Unnumberedという技術を利用することによって単にスケールするのみではなく設計や管理のシンプル化を図ります。IPv6 Link-LocalアドレスとRFC5549というBGPの拡張機能によってスイッチ~スイッチ間およびスイッチ~サーバー間でIPv6リンクローカルを用いて自動的にBGPピアが確立されるようになります。これによりIPv4アドレスを設定する必要が無くなり、IPv4アドレスの管理や設計も楽になります。
いずれもスイッチ/サーバーで共通の設計とし、下記構成の構築を行います。
今回構築するネットワークシステム全体
なおIP-CLOSやSONiC、FRRなどに関する詳細は最後に記載する参考URLをご覧下さい。
環境
今回の環境は次の通りです
項目 | ソフトウェア名 | バージョン |
---|---|---|
仮想環境 | VMware ESXi | 非公開 |
ネットワークエミュレーター | EVE-NG Free EVE Community Edition |
Version 2.0.3-112 |
データセンタースイッチ | SONiC-VS | Branch 202106 |
Linuxホスト | Ubuntu Linux | 18.04.4 LTS ※ |
ルーティングソフトウェア | FRRouting | 8.2-dev |
- ※EVE-NGのVMには8vCPU、32GB Ramを割り当て
構築手順のアジェンダ
下記の手順にて構築を行います。
- EVE-NG環境構築
- EVE-NGへのSONiCイメージファイル登録
- EVE-NGでのトポロジー構築
- SONiC初期設定
- BGP IPv6 link-localとRFC5549を用いたIP-CLOSネットワークの構築
- BGP on the Host構成を用いたIP-CLOSネットワークとLinuxサーバーの接続
手順
1. EVE-NG環境構築
公式サイトからOVFファイルをダウンロードします。
https://www.eve-ng.net/index.php/download/
「Free EVE Community Edition Version 2.0.3-112」のEVE-NG OVFをMEGA mirrorかGoogle mirrorのどちらからをダウンロードし、VMWare ESXi環境にインストールします。具体的なインストール手順はこのブログでは省略しますが下記CookbookやWEBにたくさん情報がありますのでそちらを参考にして下さい。
https://www.eve-ng.net/index.php/documentation/community-cookbook/
インストール完了後、EVE-NGのIPアドレスへssh出来れば無事完了です。
yuhei@MBP ~$ ssh root@10.X.X.X(EVE-NGのIPアドレス) root@10.1.11.131's password: Welcome to Ubuntu 16.04.7 LTS (GNU/Linux 4.20.17-eve-ng-ukms+ x86_64)
* Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Last login: Wed Jan 5 18:23:15 2022 from 10.X.X.X root@eve-ng:~#
2. EVE-NGへのSONiCイメージファイル登録
EVE-NGへSSHログインし作業、まずはSONiCイメージ保存用ディレクトリを作成します。
ディレクトリの命名規則としてXXX-YYYのようにイメージ名とバージョンがハイフンで区切られている必要があるため注意して下さい。
mkdir /opt/unetlab/addons/qemu/mssonic-202106
SONiCのイメージファイルは開発者の方が非公式でビルドされているサイトから取得します。今回はBranch 202106のsonic-vs.img.gzを取得します。
https://sonic.software/
ダウンロード完了後、sonic-vs-img.gzをeve-ng/opt/unetlab/addons/qemu/mssonic-202106内へ配置、解凍、ファイル名変更します。
mv sonic-vs-img.gz /opt/unetlab/addons/qemu/mssonic-202106/ cd /opt/unetlab/addons/qemu/mssonic-202106 gunzip sonic-vs.img.gz mv sonic-vs.img virtioa.qcow2
SONiCのEVE-NG用テンプレートをダウンロードし/opt/unetlab/html/templates/intel配下に設置します。
wget https://github.com/ercintorun/MsSonicEveNG/blob/main/mssonic.yml mv mssonic.yml /opt/unetlab/html/templates/intel/
EVE-NG設定をリフレッシュし、SONiCのイメージを利用出来るようにします。
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
3. EVE-NGでのトポロジー構築
ここではEVE-NGのWEB GUIへアクセスし作業します。
WEBブラウザを開き、EVE-NGをインストールしたホストへHTTPアクセスします。
http://EVE-NGホストアドレス
初期パスはadmin / eveです。
ログイン後、Add new labアイコンをクリックしラボを新規作成します。
必須項目のNameを入力します。名前はなんでも構いません。
ラボ作成完了すると真っ白なキャンバスが表示されます。
キャンバス上で右クリックし「Node」から「SONiC Virtual Switch_Router」を選択します。2.で無事にSONiCのイメージが追加されていれば青字となっています。
Name/Prefixにノード名を入力しSaveします。Node数分実施して下さい。
今回はspine01、spine02、leaf01、leaf02、leaf03、leaf04の6台を作成しました。
マネジメントネットワーク接続のためキャンバス上で右クリックし「Network」を選択、Typeを「Management(Cloud0)」としSaveします。
ノード配置が終わったらこの状態になっています。
右クリック→「Text」でASN***のようなメモを表示することもできます。
続いて配線を行います。ノードアイコンをロールアップするとオレンジのマークが表示されるため、同マークをつかんで接続先にドラッグすると配線できます。
配線を行います
- 各ノードのeth0_ManagementをNetへ接続して下さい。
- 各ノード間のリンクを接続して下さい。
配線が完了するとこのようなトポロジーになります。接続ポート番号はこちらの図を参考にして下さい。
各ノードのアイコンを右クリックし「Start」を押しノードを起動します。
起動後にノードをダブルクリックすると仮想コンソール接続出来ます。
仮想コンソール接続について、MACの場合はhomebrewなどでtelnetのインストールが必要となります。
次のようなログインプロンプト出ていれば起動と接続完了です。
Trying 10.X.X.X... Connected to 10.X.X.X. Escape character is '^]'.
sonic login:
4. SONiC初期設定
GUIからアイコンダブルクリックしてコンソールログインし作業を進めます。
初期パスはadmin / YourPaSsWoRd です。
まずはパスワード変更します。
admin@sonic:~$ passwd Changing password for admin. Current password: New password: Retype new password: passwd: password updated successfully
Management VRFを作成し、eth0を同VRFにattachします。
sudo config vrf add mgmt
Management IPを設定します。
これにより次以降の作業はコンソール接続ではなくssh接続にて実施可能です。
10.X.X.X/YYはSONiCの管理用IPアドレス、10.Z.Z.Zはデフォルトゲートウェイです。
sudo config interface ip add eth0 10.X.X.X/YY 10.Z.Z.Z
Loopback IPを設定します。初期値の削除と新規設定を行います。
10.1.0.1/32は固定値ですが100.X.X.X/YYは各ノード内でユニークな値としてください。
今回は以下値としました。
ノード名 | Loopback IPアドレス |
---|---|
Spine01 | 100.64.0.1/32 |
Spine02 | 100.64.0.2/32 |
Leaf01 | 100.64.0.3/32 |
Leaf02 | 100.64.0.4/32 |
Leaf03 | 100.64.0.5/32 |
Leaf04 | 100.64.0.6/32 |
sudo config interface ip remove Loopback0 10.1.0.1/32 sudo config interface ip add Loopback0 100.X.X.X/YY
ホスト名を設定します。
sudo config hostname spine02
InterfaceからデフォルトIPv4設定を削除します。32ポート分全ての設定を削除する必要はありませんが、最低限今回利用する4ポート分は必ず設定削除してください。
sudo config interface ip remove Ethernet0 10.0.0.0/31 sudo config interface ip remove Ethernet4 10.0.0.2/31 sudo config interface ip remove Ethernet8 10.0.0.4/31 sudo config interface ip remove Ethernet12 10.0.0.6/31
全InterfaceでIPv6 link-localを有効にします。
sudo config ipv6 enable link-local
ここで一旦コンフィグ保存します。
sudo config save
SONiCの設定ファイル/etc/sonic/config_db.jsonを編集します。
- "BGP_NEIGHBOR"行をコメントアウトします。
- "bgp_asn" : "65100", 行を削除します。
- "mac"の6オクテット目をユニークなものへ変更します。
- "type": "LeafRouter"の後に","を追加した後、改行し"docker_routing_config_mode"を追加します。
sudo vi /etc/sonic/config_db.json
--- 以下変更内容 --- { "//BGP_NEIGHBOR": { # <<< コメントアウト "10.0.0.1": { "asn": "65200", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.0", "name": "ARISTA01T2", "nhopself": 0, "rrclient": 0 }, /// 省略 /// "DEVICE_METADATA": { "localhost": { "bgp_asn": "65100", # <<< 行削除 "buffer_model": "traditional", "default_bgp_status": "up", "default_pfcwd_status": "disable", "hostname": "spine02", "hwsku": "Force10-S6000", "mac": "52:54:00:12:34:56", # <<< 6octet目を「56」からユニークなものへ変更 "platform": "x86_64-kvm_x86_64-r0", "type": "LeafRouter", "docker_routing_config_mode": "split" #<<< 追加 } },
config_db.json変更後、コンフィグリロードします。
sudo config reload -y -f
5. BGP IPv6 link-localとRFC5549を用いたIP-CLOSネットワークの構築
ここではBGP設定を行います。SONiCではLinux上で様々な機能がコンテナ動作しておりBGPもその一つです。 SONiCのbgp container内ではFRRが動作しており、同FRRを用いてBGP設定を行います。後に構築するLinuxサーバー上でも同じFRRを利用します。
SONiCのシステムアーキテクチャー
BGP設定に入る前に補足として通常のSONiCシェルプロンプトは下記の通りですが、
admin@spine02:~$
FRRではこのようなプロンプトへ変化しますのでご注意ください。
admin@spine02:~$ vtysh
Hello, this is FRRouting (version 7.5.1-sonic). Copyright 1996-2005 Kunihiro Ishiguro, et al.
spine02#
BGP設定を行います。SpineとLeafで設定が異なるため注意して下さい。
Spine用設定
- bgp router-idは各ノードで設定したloopback IPアドレスを入力してください。
vtysh
conf t
no router bgp router bgp 65000 bgp router-id 100.64.0.2 bgp always-compare-med no bgp ebgp-requires-policy no bgp default ipv4-unicast neighbor Ethernet0 interface remote-as 65001 neighbor Ethernet4 interface remote-as 65002 neighbor Ethernet8 interface remote-as 65003 neighbor Ethernet12 interface remote-as 65004 ! address-family ipv4 unicast neighbor Ethernet0 activate neighbor Ethernet4 activate neighbor Ethernet8 activate neighbor Ethernet12 activate exit-address-family ! end
Leaf用設定
- bgp router-idは各ノードで設定したloopback IPアドレスを入力してください。
- eBGPのためBGP AS番号はノード毎にユニークである必要があります。今回以下の通り設定しました。
ノード名 | BGP AS番号 |
---|---|
Leaf01 | 65001 |
Leaf02 | 65002 |
Leaf03 | 65003 |
Leaf04 | 65004 |
vtysh
conf t
no router bgp router bgp 65002 bgp router-id 100.64.0.4 bgp always-compare-med no bgp ebgp-requires-policy no bgp default ipv4-unicast neighbor Ethernet0 interface remote-as 65000 neighbor Ethernet4 interface remote-as 65000 ! address-family ipv4 unicast neighbor Ethernet0 activate neighbor Ethernet4 activate exit-address-family ! end
最後にFRRでコンフィグ保存します。
write memory
全ノードでBGP設定完了後、「Total number of neighbors 4」として全てのBGPピアが上がっていることを確認します。
この時点ではまだ送受信経路が無いためPrefixが0となっています。
spine02# sh bgp summary
IPv4 Unicast Summary: BGP router identifier 100.64.0.2, local AS number 65000 vrf-id 0 BGP table version 0 RIB entries 0, using 0 bytes of memory Peers 4, using 85 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Ethernet0 4 65001 21 35 0 0 0 00:18:20 0 0 Ethernet4 4 65002 38 39 0 0 0 00:19:49 0 0 Ethernet8 4 65003 12 12 0 0 0 00:09:58 0 0 Ethernet12 4 65004 3 4 0 0 0 00:00:16 0 0
Total number of neighbors 4 spine02#
6. BGP on the Host構成を用いたIP-CLOSネットワークとLinuxサーバーの接続
ここまででIP-CLOSネットワークの構築が完了したため、EVE-NGのトポロジーにLinuxホストを2台追加し、BGP on the host構成化します。
まずはLinuxホストの追加を行います。2台分追加してください。
- Name/Prefixを入力してください。
- Ethernetsを3へ変更してください。
- ConsoleをRDPへ変更してください。
EVE-NG標準のLinuxはVNC or RDP対応、telnetは未対応です。
続いて配線を行います。EVE-NGでは起動中ノードの配線変更が出来ないため、一旦各LeafをStopしてから配線を行ってください。
- Eth0をNetへ接続して下さい。
- eth1とeth2をLeafのEthernet2と接続して下さい。
配線完了後、追加したLinuxホストと先ほど一旦stopしたleafノードを起動します。
起動後、Linuxホストのアイコンをロールオーバーするとブラウザ画面にURLとポートが表示されるため、同アドレスとポートを狙ってRDPします。
初期パスは root / eveです。
RDPログイン後、デスクトップ画面の右クリックからターミナルを起動し/etc/netplan/01-netcfg.yamlを編集、管理用IPなどインターフェース設定を行います。YAML記法のためインデントに注意してください。
sudo vi /etc/netplan/01-netcfg.yaml --- network: version: 2 renderer: NetworkManager ethernets: eth0: addresses: [10.X.X.X/YY] gateway4: 10.Z.Z.Z nameservers: addresses: [10.A.B.C] search: [] optional: true eth1: dhcp4: false dhcp6: false link-local: [ipv6] eth2: dhcp4: false dhcp6: false link-local: [ipv6]
続いてLoopbackアドレス設定も実施します。
vi /etc/netplan/02-lo.yaml --- network: version: 2 renderer: networkd ethernets: lo: match: name: lo addresses: [ 100.X.X.X/YY ]
100.X.X.X/YYはIP-CLOS側も含め各ノード内でユニークな値としてください。
今回は次の値としました。
ノード名 | Loopback IPアドレス |
---|---|
Linux01 | 100.64.255.1/32 |
Linux02 | 100.64.255.2/32 |
インターフェース設定を反映します。次以降はssh接続にて作業継続します。
sudo netplan apply
ホスト名変更を変更します
sudo hostnamectl set-hostname Linux01
--- root@ubuntu:~# hostnamectl Static hostname: Linux01 Icon name: computer-vm Chassis: vm Machine ID: af1a32c72d434ad5afe533049e8de9b6 Boot ID: f3bf449d86a240ac833e9d2027de6042 Virtualization: kvm Operating System: Ubuntu 18.04.4 LTS Kernel: Linux 4.15.0-96-generic Architecture: x86-64
Proxy環境の場合以下を追加してください。
~/.bashrc
export HTTP_PROXY=http://<proxy_address>:<port> export HTTPS_PROXY=http://<proxy_address>:<port>
/etc/apt/apt.conf
Acquire::http::Proxy "http://<proxy_address>:<port>"; Acquire::https::Proxy "http://<proxy_address>:<port>";
/etc/wgetrc
http_proxy = http://<proxy_address>:<port> https_proxy = http://<proxy_address>:<port>
Git
git config --global http.proxy http://<proxy_address>:<port> git config --global https.proxy http://<proxy_address>:<port>
Timezoneを変更します。
timedatectl set-timezone Asia/Tokyo
NTP設定を変更します。
sudo vi /etc/systemd/timesyncd.conf --- NTP=<ntp_address>
NTP設定変更後にサービス再起動を行います。
sudo systemctl restart systemd-timesyncd.service
apt-get updateでパッケージリスト最新化します。
sudo apt-get update
以降はFRRの公式マニュアルに基づきインストールを行います。今回は公式マニュアルを見ずにインストールを行えるよう手順を全て記載します。
参考:FRR公式ページのインストール手順
http://docs.frrouting.org/projects/dev-guide/en/latest/building-frr-for-ubuntu1804.html
必要なパッケージを事前にapt-get installします。
sudo apt-get install \ git autoconf automake libtool make libreadline-dev texinfo \ pkg-config libpam0g-dev libjson-c-dev bison flex \ libc-ares-dev python3-dev python3-sphinx \ install-info build-essential libsnmp-dev perl libcap-dev \ libelf-dev libunwind-dev
libyancgインストールに必要なパッケージをバイナリインストールします。
apt-get install cmake libpcre2-dev\
libyangは公式マニュアル記載のOption 1:Binary Installに基づきdebパッケージをダウンロードしインストールします。まずはダウンロードを行います。
wget https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-7/Ubuntu-18.04-x86_64-Packages/libyang-tools_2.0.7-1~ubuntu18.04u1_all.deb wget https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-7/Ubuntu-18.04-x86_64-Packages/libyang2-dev_2.0.7-1~ubuntu18.04u1_amd64.deb wget https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-7/Ubuntu-18.04-x86_64-Packages/libyang2-tools_2.0.7-1~ubuntu18.04u1_amd64.deb wget https://ci1.netdef.org/artifact/LIBYANG-LIBYANGV2/shared/build-7/Ubuntu-18.04-x86_64-Packages/libyang2_2.0.7-1~ubuntu18.04u1_amd64.deb
ダウンロードしたlibyangのパッケージをインストールします。
dpkg -i *.deb
Protobufをインストールします。
sudo apt-get install protobuf-c-compiler libprotobuf-c-dev
ZeroMQをインストールします。
sudo apt-get install libzmq5 libzmq3-dev
FRRユーザーとグループを追加します。
sudo groupadd -r -g 92 frr sudo groupadd -r -g 85 frrvty sudo adduser --system --ingroup frr --home /var/run/frr/ \ --gecos "FRR suite" --shell /sbin/nologin frr sudo usermod -a -G frrvty frr
GitでFRRのコードをcloneします。
git clone https://github.com/frrouting/frr.git frr
コンパイルとインストールを行います。なおmakeはそこそこ時間かかります。
cd frr ./bootstrap.sh ./configure \ --prefix=/usr \ --includedir=\${prefix}/include \ --bindir=\${prefix}/bin \ --sbindir=\${prefix}/lib/frr \ --libdir=\${prefix}/lib/frr \ --libexecdir=\${prefix}/lib/frr \ --localstatedir=/var/run/frr \ --sysconfdir=/etc/frr \ --with-moduledir=\${prefix}/lib/frr/modules \ --with-libyang-pluginsdir=\${prefix}/lib/frr/libyang_plugins \ --enable-configfile-mask=0640 \ --enable-logfile-mask=0640 \ --enable-snmp=agentx \ --enable-multipath=64 \ --enable-user=frr \ --enable-group=frr \ --enable-vty-group=frrvty \ --enable-systemd=yes \ --with-pkg-git-version \ --with-pkg-extra-version=-FRR_NTTPCVer make sudo make install
FRRのコンフィグファイルをインストールします。
sudo install -m 775 -o frr -g frr -d /var/log/frr sudo install -m 775 -o frr -g frrvty -d /etc/frr sudo install -m 640 -o frr -g frrvty tools/etc/frr/vtysh.conf /etc/frr/vtysh.conf sudo install -m 640 -o frr -g frr tools/etc/frr/frr.conf /etc/frr/frr.conf sudo install -m 640 -o frr -g frr tools/etc/frr/daemons.conf /etc/frr/daemons.conf sudo install -m 640 -o frr -g frr tools/etc/frr/daemons /etc/frr/daemons
BGPデーモンが起動するよう設定ファイルを変更します。
bgpd=noとなっている箇所をyesへ変更します。
vi /etc/frr/daemons --- bgpd=yes
なおFRR公式マニュアルで記述のある/etc/sysctl.confやモジュールのロード類は今回不要のため行いません。
サービスファイルをインストールします。
sudo install -m 644 tools/frr.service /etc/systemd/system/frr.service sudo systemctl enable frr
FRRサービスを開始します。
systemctl start frr
vtyshで入れればインストール完了です。
root@Linux01:~/frr# vtysh
Hello, this is FRRouting (version 8.2-dev-FRR_NTTPCVer-g9f9efe7ef). Copyright 1996-2005 Kunihiro Ishiguro, et al.
This is a git build of frr-8.2-dev-294-g9f9efe7ef Associated branch(es): local:master github/frrouting/frr.git/master
Linux01#
念の為リブートを行います。
sync; sync; sync; reboot
LinuxホストでBGP設定を行います。
前述のSONiC同様にFRRなのでほぼ同じ設定方法となり、相違点としては経路フィルタリングを行なっている点です。
ネットワーク設計ポリシーとしてはサーバー間アドレス重複を防ぐためIP-CLOS側で経路フィルタリングを行なった方が良いかもしれませんが今回はLinuxホスト側でフィルタリングを行いました。
LinuxホストのFRRでコンフィグを行う上でloopbackアドレスとリモートAS番号は適宜変更して下さい。今回は下記パラメーターとしています。
項目 | Linux01 | Linux02 |
---|---|---|
BGP AS番号 | 65100 | 65200 |
Loopbackアドレス | 100.64.255.1 | 100.64.255.2 |
eth1のremote-as | 65001 | 65003 |
eth2のremote-as | 65002 | 65004 |
具体的なFRR設定はこちらです。
vtysh
conf t
ip prefix-list lo-out seq 5 permit 100.64.255.1/32 ! route-map lo-out permit 10 match ip address prefix-list lo-out exit ! router bgp 65100 bgp router-id 100.64.255.1 no bgp ebgp-requires-policy no bgp default ipv4-unicast neighbor eth1 interface remote-as 65001 neighbor eth2 interface remote-as 65002 ! address-family ipv4 unicast redistribute connected route-map lo-out neighbor eth1 activate neighbor eth2 activate exit-address-family exit ! end
最後にFRRでコンフィグ保存します。
write memory
続いて、SONiCの各Leafノード側でも BGP設定を追加します。
- router bgp xxxは各Leafノード自身のAS番号を入力してください。
- remote-asは各LinuxホストのAS番号を入力してください。
vtysh
conf t
router bgp 65001 neighbor Ethernet8 interface remote-as 65100 ! address-family ipv4 unicast neighbor Ethernet8 activate exit-address-family ! exit ! end
最後にFRRでコンフィグ保存します。
write memory
全ノードでのコンフィグが完了するとLinuxホスト上のFRRでBGPピアが上がっていることを確認出来ます。
Linux01# sh bgp summary
IPv4 Unicast Summary (VRF default): BGP router identifier 100.64.255.1, local AS number 65100 vrf-id 0 BGP table version 2 RIB entries 3, using 552 bytes of memory Peers 2, using 1447 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc eth1 4 65001 90 90 0 0 0 01:25:15 1 2 N/A eth2 4 65002 90 90 0 0 0 01:25:14 1 2 N/A
Total number of neighbors 2
Linuxホストでもう片方のLinuxホストからのBGP経路を受け取れていれば成功です。
下記例ではLinux01のFRRシェルにてLinux02のLoopbackアドレス100.64.255.2/32をBGP学習できていることが確認できます。
Linux01# sh ip bgp BGP table version is 2, local router ID is 100.64.255.1, vrf id 0 Default local pref 100, local AS 65100 Status codes: s suppressed, d damped, h history, * valid, > best, = multipath, i internal, r RIB-failure, S Stale, R Removed Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self Origin codes: i - IGP, e - EGP, ? - incomplete RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path *> 100.64.255.1/32 0.0.0.0 0 32768 ? *> 100.64.255.2/32 eth1 0 65001 65000 65003 65200 ? <<< * eth2 0 65002 65000 65003 65200 ? <<<
Displayed 2 routes and 3 total paths Linux01#
Next-hopがIPv6 link-localとなっていることも確認できます。
Linux01# sh ip route /// snip /// B>* 100.64.255.2/32 [20/0] via fe80::5054:ff:fe33:3333, eth1, weight 1, 00:02:11 Linux01#
上記はいずれもFRR CLI(vtysh)における各種テーブルの確認でした。
コントロールプレーン(FRR)として該当経路100.64.255.2/32のNext-hopをlink-local宛として学習していますが、データプレーン(Linux Kernel)ではvia 169.254.0.1 dev eh1としてOS上で上手く工夫してルーティングテーブルに落とし込んでいることが分かります。
root@Linux01:~# ip route | grep 100.64 100.64.255.2 via 169.254.0.1 dev eth1 proto 186 metric 20 onlink
おわりに
本記事ではSONiCやFRRなどのオープンソースソフトウェアを用いたデータセンターネットワークの構築手法について紹介いたしました。誰もが入手出来るソフトウェアのみを利用しているため、是非SONiCやFRRを気軽に試して頂ければと思います。
また今回ご紹介した手順は基本的に人が手動で操作することを前提としていますが、これらは是非自動化したいポイントです。今後AnsibleやZTPなどにより構築を自動化する手法についても機会があれば紹介出来ればと思います。
参考
NVIDIA社が公開しているO'REILLY BGP in the Data Centerドキュメント
https://www.nvidia.com/ja-jp/networking/border-gateway-protocol/
SONiCのIPv6 Link-localデザインドキュメント
https://github.com/Azure/SONiC/blob/master/doc/ipv6/ipv6_link_local.md
AristaさんのIPv6 Link-localやRFC5549を用いたBGP接続に関する解説
https://www.janog.gr.jp/meeting/janog45/application/files/2015/7964/7529/janog45-shtsuchi-routingip-00.pdf
SONiCの開発ロードマップ
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning
技業LOG
この記事に関連するサービスはこちら
InfoSphere®
障害に強い安定稼働の法人向けインターネットサービス
Master'sONE®ネットワーク
高い可用性とセキュリティ。広帯域でクラウド接続に適した、品質保証型ネットワークサービス
WebARENA®
社内システムから事業基盤まで。
共用 / 仮想専用サーバー、ハウジングなど、信頼性と拡張性に富んだデータセンターサービス