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 -p
rp_filter
の詳細な説明は、以下をご参照ください。ChatGPTによる解説です。
/etc/gai.conf の作成 (IPv4をIPv6より優先させたい場合)
BGP Unnumberedを利用する場合、IPv6を入れる必要があります。その優先順位は、/etc/gai.confに記載します。
■frr-linux01/frr-linux02共通
sudo vi /etc/gai.conf
precedence ::ffff:0:0/96 60
#precedence ::1/128 50
#precedence ::/0 40
#precedence 2002::/16 30
#precedence ::/96 20
precedence ::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 -y
FRRの事前設定
■frr-linux01/frr-linux02共通
最初に/etc/frr/daemons
を編集してBGPを有効にします。
sudo vi /etc/frr/daemons
bgpd = no
となっているので、yes
に変更します。
# no -> yes にする
bgpd=yes
FRRを起動させて、再起動しても起動できるように設定しておきます。
# FRRを起動させる
sudo systemctl start frr
# FRRを再起動しても起動するようにしておく
sudo systemctl enable frr
FRRの設定
今回設定する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
end
BGPの設定
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
end
BGP設定
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/A
BGPの広報経路の確認
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:43
ping確認
相手に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 101
Shellから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
!
end
frr-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