kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

VyOSでBGPを試してみる

f:id:kun432:20211003125250p:plain

前回、KubernetesのDynamic PVのためにCephを試してみたのに続いて、今度はLoadBalancer serviceのためにMetalLBを試したい、そしてできればL2モードじゃなくてBGPモードで試したい、ということで、VyOSでBPGをやってみました。

目次

必要なもの

  • virtualbox
  • vagrant
  • vagrant-vyosプラグイン
    • Vagrantfile内でconfig.vagrant.pluginsを指定してるのでvagrant upすればインストールされると思います。

VMが6台ぐらい立ち上がるので多少はマシンパワー必要かもです。

構成

構成については以下を参考にさせてもらいました。

上記ではhigebuさんのvyos boxを使っていて1.1系なのだけど、ネットワークのお勉強のために以前に1.3系のvagrant box作ってルータ作ったりしたので1.3系でやってます。

1.3のvagrant boxはvagrant cloudに公開しているのでVagrantfileで参照するだけで使えます。1.2ぐらいからコマンドが結構変わってみたいなので、BGPの知識がないこともあって結構調べるのが大変だった(そして合っているか自信がないので、間違ってたら指摘してください)

あと、多少自分的にわかりやすいようにAS番号とかネットワークセグメントは変えてます。こんな感じ。

f:id:kun432:20211003125517p:plain

実際のルーティングも確認したいので各ルータのネットワーク内に端末をおきました。

使い方

Vagrantfileや各ルータのセットアップを行うスクリプトなどはGitHubで公開しています。

クローンします。

$ git clone https://github.com/kun432/vagrant-vyos-bgp-sample.git
$ cd vagrant-vyos-bgp-sample

upします。普通にアップしてもいいんだけど、vagrantでvirtualbox providerの場合、シーケンシャルにしか起動しないので時間がかかる。並列でできるようにシェルスクリプトを書きました。中身は単純で、vm一覧を取得してxargsでvagrantに渡してるだけ。parallel増やすと並列度があがります。

#!/bin/bash

parallel=3
subcmds="$@"

vagrant status --machine-readable | \
  perl -wnlaF"," -e 'print $F[1] if $F[2] =~ /metadata/;' | \
  xargs -P${parallel} -I {} vagrant $subcmds {}

ということで、VM起動。

$ ./vagrant-ctrl.sh up

ルータ3台とPC3台が起動します。

$ vagrant status
(snip)

rt-1                      running (virtualbox)
rt-2                      running (virtualbox)
rt-3                      running (virtualbox)
pc-1                      running (virtualbox)
pc-2                      running (virtualbox)
pc-3                      running (virtualbox)

(snip)

ルータについてはscripts以下にあるスクリプトでセットアップしてます。rt-1の場合だとこういう感じ。

#!/bin/vbash

source /opt/vyatta/etc/functions/script-template

set interfaces loopback lo address 1.1.1.1/32

set protocols bgp 65001 neighbor 10.10.1.2 remote-as '65002'
set protocols bgp 65001 neighbor 10.10.1.2 update-source '10.10.1.1'
set protocols bgp 65001 address-family ipv4-unicast network '192.168.1.0/24'
set protocols bgp 65001 parameters router-id '1.1.1.1'

set protocols static route 192.168.1.0/24 blackhole distance '254'

commit
save

BGPの細かい設定の意味がまだよくわかってないけど、1.3の公式ドキュメントにあるサンプルをもとに作ってます。

docs.vyos.io

vyos1.1の場合だとこんな感じらしい。

set protocols bgp 65001 neighbor 10.10.1.2 remote-as '65122'
set protocols bgp 65001 neighbor 10.10.1.2 soft-reconfiguration inbound
set protocols bgp 65001 neighbor 10.10.1.2 update-source  '10.10.1.1'
set protocols bgp 65001 network 11.11.11.11/32
set protocols bgp 65001 parameters router-id '1.1.1.1'

広報する自分のネットワークを設定する箇所は、1.1だと

set protocols bgp 65001 network 11.11.11.11/32

だけど、1.3ではエラーになるのでこうなる。

set protocols bgp 65001 address-family ipv4-unicast network '192.168.1.0/24'

あと、今回は指定していないけど、経路情報を保存しておく以下の設定についても、1.1ではこうだけど、

set protocols bgp 65001 neighbor 10.10.1.2 soft-reconfiguration inbound

1.3だとこうなるみたい。1.3の情報がほとんどないのでこの辺は苦しい。

set protocols bgp 65001 neighbor 10.10.1.2 address-family ipv4-unicast network soft-reconfiguration inbound 

なにはともあれVMが上がってきたら疎通確認してみましょう。

vagrant@pc-1:~$ ping 192.168.2.11
PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.
64 bytes from 192.168.2.11: icmp_seq=1 ttl=62 time=1.30 ms
64 bytes from 192.168.2.11: icmp_seq=2 ttl=62 time=1.42 ms
64 bytes from 192.168.2.11: icmp_seq=3 ttl=62 time=1.56 ms
(snip)

vagrant@pc-1:~$ ping 192.168.3.11
PING 192.168.3.11 (192.168.3.11) 56(84) bytes of data.
64 bytes from 192.168.3.11: icmp_seq=1 ttl=61 time=9.71 ms
64 bytes from 192.168.3.11: icmp_seq=2 ttl=61 time=2.14 ms
64 bytes from 192.168.3.11: icmp_seq=3 ttl=61 time=1.77 ms
(snip)
vagrant@pc-2:~$ ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=62 time=1.24 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=62 time=1.75 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=62 time=2.38 ms
(snip)

vagrant@pc-2:~$ ping 192.168.3.11
PING 192.168.3.11 (192.168.3.11) 56(84) bytes of data.
64 bytes from 192.168.3.11: icmp_seq=1 ttl=62 time=1.04 ms
64 bytes from 192.168.3.11: icmp_seq=2 ttl=62 time=1.40 ms
64 bytes from 192.168.3.11: icmp_seq=3 ttl=62 time=2.43 ms
(snip)
vagrant@pc-3:~$ ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=61 time=1.66 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=61 time=2.38 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=61 time=1.90 ms
(snip)

vagrant@pc-3:~$ ping 192.168.2.11
PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.
64 bytes from 192.168.2.11: icmp_seq=1 ttl=62 time=1.43 ms
64 bytes from 192.168.2.11: icmp_seq=2 ttl=62 time=1.25 ms
64 bytes from 192.168.2.11: icmp_seq=3 ttl=62 time=1.44 ms
64 bytes from 192.168.2.11: icmp_seq=4 ttl=62 time=1.28 ms
(snip)

各ルータは以下のネットワーク間の疎通はOKですね。では各ルータもみていきます。rt-1から。

vagrant@rt-1.internal:~$ show ip bgp
BGP table version is 3, local router ID is 1.1.1.1, vrf id 0
Default local pref 100, local AS 65001
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

   Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.1.0/24   0.0.0.0                  0         32768 i
*> 192.168.2.0/24   10.10.1.2                0             0 65002 i
*> 192.168.3.0/24   10.10.1.2                              0 65002 65003 i

Displayed  3 routes and 3 total paths

rt-2, rt-3のネットワークがBGPで広報されているようです。そして実際のルーティングで、rt-2, rt-3のネットワークへの経路が10.10.1.2経由になっているのがわかりますね。

vagrant@rt-1.internal:~$ show ip route
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, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 03:31:36
C>* 1.1.1.1/32 is directly connected, lo, 03:30:27
C>* 10.0.2.0/24 is directly connected, eth0, 03:31:36
C>* 10.10.1.0/24 is directly connected, eth2, 03:30:31
S   192.168.1.0/24 [254/0] unreachable (blackhole), 03:30:27
C>* 192.168.1.0/24 is directly connected, eth1, 03:30:31
B>* 192.168.2.0/24 [20/0] via 10.10.1.2, eth2, 03:30:25
B>* 192.168.3.0/24 [20/0] via 10.10.1.2, eth2, 03:30:24

rt-2とrt-3も貼っときます。

vagrant@rt-2.internal:~$ show ip bgp
BGP table version is 3, local router ID is 2.2.2.2, vrf id 0
Default local pref 100, local AS 65002
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

   Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.1.0/24   10.10.1.1                0             0 65001 i
*> 192.168.2.0/24   0.0.0.0                  0         32768 i
*> 192.168.3.0/24   10.10.2.2                0             0 65003 i

Displayed  3 routes and 3 total paths

vagrant@rt-2.internal:~$ show ip route
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, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 04:41:13
C>* 2.2.2.2/32 is directly connected, lo, 04:40:02
C>* 10.0.2.0/24 is directly connected, eth0, 04:41:13
C>* 10.10.1.0/24 is directly connected, eth2, 04:40:07
C>* 10.10.2.0/24 is directly connected, eth3, 04:40:06
B>* 192.168.1.0/24 [20/0] via 10.10.1.1, eth2, 04:39:58
S   192.168.2.0/24 [254/0] unreachable (blackhole), 04:40:01
C>* 192.168.2.0/24 is directly connected, eth1, 04:40:06
B>* 192.168.3.0/24 [20/0] via 10.10.2.2, eth3, 04:39:58
vagrant@rt-3.internal:~$ show ip bgp
BGP table version is 3, local router ID is 3.3.3.3, vrf id 0
Default local pref 100, local AS 65003
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

   Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.1.0/24   10.10.2.1                              0 65002 65001 i
*> 192.168.2.0/24   10.10.2.1                0             0 65002 i
*> 192.168.3.0/24   0.0.0.0                  0         32768 i

Displayed  3 routes and 3 total paths

vagrant@rt-3.internal:~$ show ip route
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, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

S>* 0.0.0.0/0 [210/0] via 10.0.2.2, eth0, 04:44:21
C>* 3.3.3.3/32 is directly connected, lo, 04:43:11
C>* 10.0.2.0/24 is directly connected, eth0, 04:44:21
C>* 10.10.2.0/24 is directly connected, eth2, 04:43:15
B>* 192.168.1.0/24 [20/0] via 10.10.2.1, eth2, 04:43:05
B>* 192.168.2.0/24 [20/0] via 10.10.2.1, eth2, 04:43:05
S   192.168.3.0/24 [254/0] unreachable (blackhole), 04:43:11
C>* 192.168.3.0/24 is directly connected, eth1, 04:43:15

一応やりたかったことはできてますかね。

まとめ

VyOSでBGPを試してみました。とりあえず雰囲気はつかめたかなぁというところ。ネットワーク、もう少しちゃんと勉強しないとダメですね。

次はいよいよMetalLBだ。