VirtualBoxにRocky Linux9.4を入れてFRRを使ってBGP Unnumberedをしてみた
Windows11環境のVirtualBoxにRocky Linux 9.4にFRRを入れてBGP Unnumberedを試してみました。
VirtualBoxにRocky Linux 9.4を入れる手順は以下のページに書いてあります。
Virtual Box Rocky Linux 9.4をインストールしてみた | ランスルネット (runsurunet.com)
今回設定するBGPの方針としては、主に以下の通りです。
- サーバ2台 それぞれNICを2つ使ってBGP Unnumberedを利用する
- 広報する経路は、サーバ自身のdummy0のIPのみに絞る
- 受信する経路は、Private IP アドレス全てを許可する
Contents
BGPの構成図
2台のRocky Linux 9.4でBGP Unnumberedの設定をします。

Virtualboxのネットワークの構成
Virtualboxの場合、ゲストOS(Rocky Linux 9.4)の2台のネットワークを論理的に接続するのには、少し癖があるので、今回設定した内容を記載しておきます。
内部ネットワーク
それぞれのゲストOSがBGP Unnumberedを接続する方法として、今回は 内部ネットワークを選択しました。それぞれの内部ネットワークは名前を変えて別にしています。

その他のネットワークの設定
インターネット接続用にはNATssh、ssh用にはホストオンリーアダプターにしています。表にまとめると以下のように設定しています。
| アダプター1 | アダプター2 | アダプター3 | アダプター4 | |
| frr-linux01 | NAT | ホストオンリー アダプター | 内部ネットワーク (frr-eth1) | 内部ネットワーク (frr-eth2) | 
| frr-linux02 | NAT | ホストオンリー アダプター | 内部ネットワーク (frr-eth1) | 内部ネットワーク (frr-eth2) | 
| 用途 | インターネット 通信(dnf用) | ssh用 | BGP Unnumbered | BGP Unnumbered | 
Virtualboxのネットワークの設定は、過去のページが参考になるかと思います。
Virtual Box Rocky Linux 9.4をインストールしてみた | ランスルネット (runsurunet.com)
Oracle VM VirtualBox ネットワークアダプターの種類の説明 | ランスルネット (runsurunet.com)
FRRのインストール
dummy0の設定
FRRでBGP Unnumberedを使用する場合、仮想インタフェースが必要になります。loopbackでもいいのですが、今回はdummy0を作成します。
■frr-linix01
nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 172.16.0.1/32■frr-linix02
nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 172.16.0.2/32■確認
ip aでdummy0が追加されていること、IPが設定されていることを確認します。
ip a
余談:loopbackでもBGP Unnumberedは利用できます。ただ、keepalivedなど一部dummyを認識しないものがあります。
/etc/syscl.conf の設定
BGP Unnumberedのようなサーバが複数のNICを持っている場合、rp_filterを無効にする必要があります。rp_filterは、セキュリティを強化する設定です。NIC#1に入ってきたものは、NIC#1から返答しなければならないが、違う場合は破棄をしていまいます。これを無効化する設定をします。
■frr-linux01/frr-linux02共通
vi で/etc/sysctl.confを開きます。
sudo vi /etc/sysctl.conf以下の内容を貼り付けます。3行目、4行目はenp0s9と enp0s10はNIC名です。値の0は無効、途中
net.ipv4.conf.all.rp_filter= 0
net.ipv4.conf.default.rp_filter= 0
net.ipv4.conf.enp0s9.rp_filter = 0
net.ipv4.conf.enp0s10.rp_filter = 0/etc/sysctl.confの内容を反映させます
sudo sysctl -prp_filterの詳細な説明は、以下をご参照ください。ChatGPTによる解説です。
/etc/gai.conf の作成 (IPv4をIPv6より優先させたい場合)
BGP Unnumberedを利用する場合、IPv6を入れる必要があります。その優先順位は、/etc/gai.confに記載します。
■frr-linux01/frr-linux02共通
sudo vi /etc/gai.confprecedence ::ffff:0:0/96  60
#precedence  ::1/128       50
#precedence  ::/0          40
#precedence  2002::/16     30
#precedence ::/96          20precedence ::ffff:0:0/96  60 がIPv4を優先させる設定です。
gai.confのマニュアルはこちら。
gai.conf(5) – Linux manual page (man7.org)
dnfを使ってFRRをインストール
■frr-linux01/frr-linux02共通
dnfでfrrをインストールします。
sudo dnf install frr -yFRRの事前設定
■frr-linux01/frr-linux02共通
最初に/etc/frr/daemonsを編集してBGPを有効にします。
sudo vi /etc/frr/daemonsbgpd = no  となっているので、yesに変更します。
# no -> yes にする
bgpd=yesFRRを起動させて、再起動しても起動できるように設定しておきます。
# FRRを起動させる
sudo systemctl start frr
# FRRを再起動しても起動するようにしておく
sudo systemctl enable frrFRRの設定
今回設定するBGPの方針としては、主に以下の通りです。
- サーバ2台 それぞれNICを2つ使ってBGP Unnumberedを利用する
- 広報する経路は、サーバ自身のdummy0のIPのみに絞る
- 受信する経路は、Private IP アドレス全てを許可する

FRRの設定は、vtyshと入力して設定していきます。
sudo vtysh■frr-linux01の設定
ip prefix-listとroute-mapの設定
ip prefix-listのDummy0とset srcは、サーバ自身のdummy0のIP 172.16.0.1にします。
conf t
ip prefix-list Dummy0 seq 5 permit 172.16.0.1/32
ip prefix-list Private_IP_Addresses seq 5 permit 10.0.0.0/8 le 32
ip prefix-list Private_IP_Addresses seq 10 permit 172.16.0.0/12 le 32
ip prefix-list Private_IP_Addresses seq 15 permit 192.168.0.0/16 le 32
route-map Redistribute_dummy_interface permit 10
 match interface dummy0
exit
route-map Dummy_SET_SRC permit 10
 match tag 101
 set src 172.16.0.1
exit
!
route-map SERVER_IN permit 10
 set tag 101
exit
endBGPの設定
conf t
router bgp 64901
 bgp router-id 172.16.0.1
 bgp log-neighbor-changes
 bgp bestpath as-path multipath-relax
 neighbor SERVER peer-group
 neighbor SERVER remote-as external
 neighbor SERVER advertisement-interval 0
 neighbor SERVER timers 1 3
 neighbor SERVER timers connect 5
 neighbor SERVER capability extended-nexthop
 neighbor enp0s9 interface peer-group SERVER
 neighbor enp0s10 interface peer-group SERVER
 !
 address-family ipv4 unicast
  redistribute connected route-map Redistribute_dummy_interface
  neighbor SERVER soft-reconfiguration inbound
  neighbor SERVER prefix-list Dummy0 out
  neighbor SERVER prefix-list Private_IP_Addresses in
  neighbor SERVER route-map SERVER_IN in
 exit-address-family
exit
end最後にDummy_SET_SRCのroute-mapを設定します。
conf t
ip protocol bgp route-map Dummy_SET_SRC
end設定保存
今回のインストールしたFRRのバージョン8.5.3 では /etc/frr/frr.conf に設定保存されます。※別のバージョンでは、BGP/OSPFなど各daemonによってファイルが分かれています。
sudo write memory■frr-linux02の設定
ip prefix-listとroute-mapの設定
ip prefix-listのDummy0とset srcは、サーバ自身のdummy0のIP 172.16.0.2にします。
conf t
ip prefix-list Dummy0 seq 5 permit 172.16.0.2/32
ip prefix-list Private_IP_Addresses seq 5 permit 10.0.0.0/8 le 32
ip prefix-list Private_IP_Addresses seq 10 permit 172.16.0.0/12 le 32
ip prefix-list Private_IP_Addresses seq 15 permit 192.168.0.0/16 le 32
route-map Redistribute_dummy_interface permit 10
 match interface dummy0
exit
route-map Dummy_SET_SRC permit 10
 match tag 101
 set src 172.16.0.2
exit
!
route-map SERVER_IN permit 10
 set tag 101
exit
endBGP設定
conf t
router bgp 64902
 bgp router-id 172.16.0.2
 bgp log-neighbor-changes
 bgp bestpath as-path multipath-relax
 neighbor SERVER peer-group
 neighbor SERVER remote-as external
 neighbor SERVER advertisement-interval 0
 neighbor SERVER timers 1 3
 neighbor SERVER timers connect 5
 neighbor SERVER capability extended-nexthop
 neighbor enp0s9 interface peer-group SERVER
 neighbor enp0s10 interface peer-group SERVER
 !
 address-family ipv4 unicast
  redistribute connected route-map Redistribute_dummy_interface
  neighbor SERVER soft-reconfiguration inbound
  neighbor SERVER prefix-list Dummy0 out
  neighbor SERVER prefix-list Private_IP_Addresses in
 exit-address-family
exit最後にDummy_SET_SRCのroute-mapを設定します。
conf t
ip protocol bgp route-map Dummy_SET_SRC
end設定保存
sudo write memory設定内容の解説
通信確認
BGPの状態確認
FRRから以下のコマンドで確認をします。
show ip bgp summary以下のようになっていればBGPが確立できています。BGPが出来ていない時は、State/PfxRcdがActive、Connectだったりしますここでは、受け取っている経路の数 1 となっているので正常です。
frr-linux02# show ip bgp summary
IPv4 Unicast Summary (VRF default):
BGP router identifier 172.16.0.2, local AS number 64902 vrf-id 0
BGP table version 2
RIB entries 3, using 576 bytes of memory
Peers 2, using 1449 KiB of memory
Peer groups 1, using 64 bytes of memory
Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
enp0s9          4      64901      2401      2400        0    0    0 00:40:00            1        1 N/A
enp0s10         4      64901      2401      2400        0    0    0 00:40:00            1        1 N/ABGPの広報経路の確認
2つのNIC enp0s9とenp0s10の広報経路を確認します。
show ip bgp neighbors enp0s9 advertised-routes
show ip bgp neighbors enp0s10 advertised-routesサーバ自身のdummy0 だけ広報していれば成功です。frr-linux02であれば、172.16.0.2が広報されていればOKです。
frr-linux02# show ip bgp neighbors enp0s10 advertised-routes
BGP table version is 2, local router ID is 172.16.0.2, vrf id 0
Default local pref 100, local AS 64902
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
 *> 172.16.0.2/32    ::                       0         32768 ?BGPの受信経路の確認
2つのNIC enp0s9とenp0s10の受信経路を確認します。
show ip bgp neighbors enp0s9 routes
show ip bgp neighbors enp0s10 routes相手のサーバのdummy0 だけ広報していれば成功です。frr-linux02であれば、frr-linux01のdummy0172.16.0.1が受信されていればOKです。
frr-linux02# show ip bgp neighbors enp0s09 routes
% Malformed address or name: enp0s09
frr-linux02# show ip bgp neighbors enp0s9 routes
BGP table version is 2, local router ID is 172.16.0.2, vrf id 0
Default local pref 100, local AS 64902
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
 *> 172.16.0.1/32    enp0s9                   0             0 64901 ?BGPテーブルとルーティングテーブルの確認
frr-linux02から見て、frr-linux01のdummy0172.16.0.1のNext-hopがenp0s9とenp0s10の2つが見えていればOKです。multipathされていることがわかります。
frr-linux02# show ip bgp
BGP table version is 2, local router ID is 172.16.0.2, vrf id 0
Default local pref 100, local AS 64902
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
 *= 172.16.0.1/32    enp0s10                  0             0 64901 ?
 *>                  enp0s9                   0             0 64901 ?
 *> 172.16.0.2/32    0.0.0.0                  0         32768 ?同じくルーティングテーブルもfrr-linux02から見て、frr-linux01のdummy0172.16.0.1のNext-hopがenp0s9とenp0s10の2つが見えていればOKです。
frr-linux02# show ip route bgp
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure
B>* 172.16.0.1/32 [20/0] via fe80::1584:623d:e26a:b35a, enp0s9, weight 1, 00:51:43
  *                      via fe80::43ee:e1c1:3d95:3cff, enp0s10, weight 1, 00:51:43ping確認
相手にpingが通れば成功です。
[aa@frr-linux01 ~]$ ping 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 バイト応答 送信元 172.16.0.2: icmp_seq=1 ttl=64 時間=1.01ミリ秒
64 バイト応答 送信元 172.16.0.2: icmp_seq=2 ttl=64 時間=0.832ミリ秒
64 バイト応答 送信元 172.16.0.2: icmp_seq=3 ttl=64 時間=0.849ミリ秒
64 バイト応答 送信元 172.16.0.2: icmp_seq=4 ttl=64 時間=0.975ミリ秒ip protocol bgp route-map Dummy_SET_SRCの設定
今回にように仮想インターフェースを設定した場合、どこの送信元にすればいいかわからないようです。そのため、サーバ自身がpingをしても失敗します。これを防ぐために、BGPの経路を受け取ってカーネルに入れる前に送信元インターフェース のIPを設定しておきます。
## FRR #### 
router bgp 64902
 address-family ipv4 unicast
   neighbor SERVER route-map _SERVER_IN in
route-map Dummy_SET_SRC permit 10
 match tag 101
 set src 172.16.0.1
!
route-map SERVER_IN permit 10
 set tag 101Shellからip routeコマンドをしたときに bgp src 172.16.0.1となっているのがわかります。
## FRR #### 
[aa@frr-linux01 ~]$ ip route
default via 10.0.2.2 dev enp0s3 proto dhcp src 10.0.2.15 metric 101
172.16.0.2 nhid 86 proto bgp src 172.16.0.1 metric 20 <======== ここ
        nexthop via inet6 fe80::c8f:b654:e1a0:87a4 dev enp0s9 weight 1
        nexthop via inet6 fe80::17ad:9581:1bbe:e93f dev enp0s10 weight 1以下のページを参考にしました。感謝です。
Tips of Routing on the Host #Network – Qiita
最終的なFRRのコンフィグ
frr-linux01
## FRR #### 
frr-linux01# show running-config
Building configuration...
Current configuration:
!
frr version 8.5.3
frr defaults traditional
hostname frr-linux01
no ipv6 forwarding
!
router bgp 64901
 bgp router-id 172.16.0.1
 bgp log-neighbor-changes
 bgp bestpath as-path multipath-relax
 neighbor SERVER peer-group
 neighbor SERVER remote-as external
 neighbor SERVER advertisement-interval 0
 neighbor SERVER timers 1 3
 neighbor SERVER timers connect 5
 neighbor SERVER capability extended-nexthop
 neighbor enp0s9 interface peer-group SERVER
 neighbor enp0s10 interface peer-group SERVER
 !
 address-family ipv4 unicast
  redistribute connected route-map Redistribute_dummy_interface
  neighbor SERVER soft-reconfiguration inbound
  neighbor SERVER prefix-list Private_IP_Addresses in
  neighbor SERVER prefix-list Dummy0 out
  neighbor SERVER route-map SERVER_IN in
 exit-address-family
exit
!
ip prefix-list Private_IP_Addresses seq 5 permit 10.0.0.0/8 le 32
ip prefix-list Private_IP_Addresses seq 10 permit 172.16.0.0/12 le 32
ip prefix-list Private_IP_Addresses seq 15 permit 192.168.0.0/16 le 32
ip prefix-list Dummy0 seq 5 permit 172.16.0.1/32
!
route-map Redistribute_dummy_interface permit 10
 match interface dummy0
exit
!
route-map SERVER_IN permit 10
 set tag 101
exit
!
route-map Dummy_SET_SRC permit 10
 match tag 101
 set src 172.16.0.1
exit
!
ip protocol bgp route-map Dummy_SET_SRC
!
endfrr-linux02
## FRR #### 
frr-linux02# show running-config
Building configuration...
Current configuration:
!
frr version 8.5.3
frr defaults traditional
hostname frr-linux02
no ipv6 forwarding
!
router bgp 64902
 bgp router-id 172.16.0.2
 bgp log-neighbor-changes
 bgp bestpath as-path multipath-relax
 neighbor SERVER peer-group
 neighbor SERVER remote-as external
 neighbor SERVER advertisement-interval 0
 neighbor SERVER timers 1 3
 neighbor SERVER timers connect 5
 neighbor SERVER capability extended-nexthop
 neighbor enp0s9 interface peer-group SERVER
 neighbor enp0s10 interface peer-group SERVER
 !
 address-family ipv4 unicast
  redistribute connected route-map Redistribute_dummy_interface
  neighbor SERVER soft-reconfiguration inbound
  neighbor SERVER prefix-list Private_IP_Addresses in
  neighbor SERVER prefix-list Dummy0 out
  neighbor SERVER route-map SERVER_IN in
 exit-address-family
exit
!
ip prefix-list Private_IP_Addresses seq 5 permit 10.0.0.0/8 le 32
ip prefix-list Private_IP_Addresses seq 10 permit 172.16.0.0/12 le 32
ip prefix-list Private_IP_Addresses seq 15 permit 192.168.0.0/16 le 32
ip prefix-list Dummy0 seq 5 permit 172.16.0.2/32
!
route-map Redistribute_dummy_interface permit 10
 match interface dummy0
exit
!
route-map SERVER_IN permit 10
 set tag 101
exit
!
route-map Dummy_SET_SRC permit 10
 match tag 101
 set src 172.16.0.2
exit
!
ip protocol bgp route-map Dummy_SET_SRC
!
endさいごに
普段のメインの仕事は、ネットワークエンジニアなのでサーバ側のFRRの設定は苦労するかと思いましたが、インターネット上にそこそこ情報があったので何とか設定出来ました。大変助かりました。先人の方々に感謝です。次は、以前作成したSONiC VM版とLinuxのFRRでBGP Unnumberedにチャレンジしたいと思います。
Windows 11 Home環境 Virtual BoxでSONiC Community版でBGP Unnumberedをしてみた Part1 | ランスルネット (runsurunet.com)
Windows 11 Home環境 Virtual BoxでSONiC Community版でBGP Unnumberedをしてみた Part2 | ランスルネット (runsurunet.com)
参考ページ
設定がうまくいかない時など参考にしたサイト様です。ありがとうございました。
Dummyインターフェースの設定
第17章 ダミーインターフェイスの作成 | Red Hat Product Documentation
gai.confの設定
/etc/gai.conf | きみとぼくとめもと (techack.net)
rp_filterやfrrの仮想インタフェースを送信元にする設定
Tips of Routing on the Host #Network – Qiita

