自宅で誰にも迷惑をかけずにBGPフルルートを受信する方法 (Vultr)

ネットワーク

とても久しぶりにブログ更新します。
普段ネットワークエンジニアとしてAS運用などに携わっている身なので
自宅に フルルート 欲しいなぁなんて思ってました。

某NOCのRouterにSSHすることができたり、各キャリアで用意されたLooking Glassがあるとはいえ、
自宅でフルルートってカッコイイじゃないですか。

Xでみていると個人でASを取得してたり、某NOCとピアしてたりする人を結構見かけるわけですが、
自分は誰にも迷惑をかけずに1人でひっそりフルルートを見たいだけなのです。

そんな自分のような人がフルルートを受信して楽しめる方法を紹介します。

概要

自宅でひっそり誰にも迷惑をかけずにフルルートを受信したい。

必要なもの

  • フルルートを保持できるルーター (実機でも仮想でもなんでも良い)
  • クラウド(Vultr)に払うお金
  • 自分でBGPやGREの設定を行うことができる能力
  • 外部とGREなどで接続できる自宅のネット環境 (※自宅の機器でフルルートを保持する場合)

構成

Vultr: https://www.vultr.com

Vultrはオーストラリアの企業が運営しているVPSで、顧客がBGPで経路をもらえる面白いサービスを提供している。
今回はこのVultrを使って受信した経路を自宅に持ってくることでやりたいことを実現する。
※フルルートと記載していますが完全なフルルートではなく一部広報されていない経路もありそうです。

bgpmon

自宅におくフルルート受信用のルーター
我が家はSRX300にした。

FRRouting

Vultrで作ったインスタンス上で実行するルーティングソフトウェア
FRRoutingはVultrとbgpmonとピアすることになる。

Router

今回FRRoutingとbgpmonでピアを張るのにeBGP Multihopを利用する。
VPSとRouter間でGREを張り、L3到達性を確保する。

手順

Vultrのセットアップ

Vultrのアカウント作成

まずはVultrに登録してアカウントを作成する必要があります。
https://www.vultr.com

支払い方法についてはデポジットが可能なのでPayPalなどで適当に$10くらい入れておきます。
(個人の好きにしてください)

Vultrのインスタンス作成

アカウントが生成されたらインスタンスを作成します。
私はShared CPUを選択しTokyoでDeployするようにしました。

次にOSを選択します。ここではUbuntuを選択しました。(個人の好きにしてください)

次にPlanを選択します。 Regular Cloud Computeの55 GB SSDを選択します。
(画像は25 GB SSDになっていますが、Memoryが1GBなので厳しかった)

自動バックアップは不要なので外す。
IPv6アドレスはアタッチする。
SSH Keyを作成して選択。

以上で設定完了でDeployする。

VultrのBGP設定
https://docs.vultr.com/configuring-bgp-on-vultr

次にVultrでBGPに関する設定を行う。
マニュアルの通りだが、VultrのWebUIよりインスタンスの設定画面 > BGPに進み
BGP Setupに進み、Full Tableを受信する設定を入れる。
この時BYOIPは不要なのでNOにしておく。理由についてはいい感じの理由を記載する。
Requestを完了するとチケットが起票され、Open状態となる。

1日くらい放置して承認が完了すると、インスタンスの設定画面よりBGPパラメータが確認できる。
Please reboot the instance via the control panel to complete BGP setup.
とあるのでインスタンスのRestartも忘れずに行っておく。

Vultrのインスタンス設定
インスタンスのセキュリティ設定などを行う。
AWSやGCP同様Firewallの適用を行うことができる。
Network > Firewallと設定画面を進み、Firewallを行う。
Inbound IPv4 Rulesに SSH / GRE / ICMP などにアクセスできるよう設定をする。Sourceを自宅IPにしておく。
作成したらインスタンスに忘れずにアタッチしておく。

FRRoutingのセットアップ

FRRoutingのインストール

UbuntuにFRRoutingを入れていく。
https://docs.frrouting.org/en/latest/installation.html

apt update && apt upgrade

curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null

FRRVER="frr-stable"

echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr \
     $(lsb_release -s -c) $FRRVER | sudo tee -a /etc/apt/sources.list.d/frr.list

sudo apt update && sudo apt install frr frr-pythontools

インストールが完了したのちステータスを確認

root@frrouting:~# vtysh
frrouting# show version
FRRouting 10.0.1 (frrouting) on Linux(6.8.0-38-generic).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
configured with:
...

root@frrouting:~# systemctl status frr.service
● frr.service - FRRouting
     Loaded: loaded (/usr/lib/systemd/system/frr.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-07-12 22:42:27 UTC; 7min ago
       Docs: https://frrouting.readthedocs.io/en/latest/setup.html
    Process: 4844 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS)
   Main PID: 4854 (watchfrr)
     Status: "FRR Operational"
      Tasks: 8 (limit: 1061)
     Memory: 14.5M (peak: 25.3M)
        CPU: 369ms
     CGroup: /system.slice/frr.service
             ├─4854 /usr/lib/frr/watchfrr -d -F traditional zebra mgmtd staticd
             ├─4864 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
             ├─4869 /usr/lib/frr/mgmtd -d -F traditional -A 127.0.0.1
             └─4871 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1

Jul 12 22:42:27 frrouting staticd[4871]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
Jul 12 22:42:27 frrouting frrinit.sh[4891]: [4891|staticd] sending configuration
Jul 12 22:42:27 frrouting watchfrr[4854]: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
Jul 12 22:42:27 frrouting frrinit.sh[4873]: Waiting for children to finish applying config...
Jul 12 22:42:27 frrouting watchfrr[4854]: [QDG3Y-BY5TN] mgmtd state -> up : connect succeeded
Jul 12 22:42:27 frrouting frrinit.sh[4889]: [4889|watchfrr] done
Jul 12 22:42:27 frrouting watchfrr[4854]: [QDG3Y-BY5TN] staticd state -> up : connect succeeded
Jul 12 22:42:27 frrouting frrinit.sh[4891]: [4891|staticd] done
Jul 12 22:42:27 frrouting watchfrr[4854]: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify
Jul 12 22:42:27 frrouting frrinit.sh[4844]:  * Started watchfrr

FRRoutingの設定

BGPデーモンを有効にしておく。
/etc/frr/daemonsを修正

bgpd=yes
MAX_FDS=1024

FRR再起動

systemctl restart frr.service

FRRの設定を投入する。設定は個人の自由ですが自分はこんな感じにしました。
VultrとIPv4/IPv6でNeighborを張ります。
bgpmonとはIPv4のみNeighborを張り、MP-BGPでIPv6経路も広報します。
この時、bgpmon側でIPv6経路を受信できるようにnext-hopをbgpmonが持つ適当なアドレスにしておきます。

# vtysh
# configure

ip prefix-list ALL_ROUTE_V4 seq 5 permit 0.0.0.0/0 le 32
!
ipv6 prefix-list ALL_ROUTE_V6 seq 5 permit ::/0 le 128
!
router bgp XXXXXXXX view FRR
 bgp router-id xx.xx.xx.xx
 no bgp network import-check
 neighbor {Vultr向け} remote-as 64515
 neighbor {Vultr向け} description VULTR_v4_64515_{Vultr_v4}
 neighbor {Vultr向け} password *************
 neighbor {Vultr向け} ebgp-multihop 2
 neighbor {Vultr向け} graceful-restart
 neighbor {bgpmon向け} remote-as 65000
 neighbor {bgpmon向け} description izumin_v4_65000_{bgpmon}
 neighbor {bgpmon向け} ebgp-multihop
 neighbor {bgpmon向け} graceful-restart
 neighbor {Vultr_v6向け} remote-as 64515
 neighbor {Vultr_v6向け} description VULTR_v6_64515_{Vultr_v6}
 neighbor {Vultr_v6向け} password ************
 neighbor {Vultr_v6向け} ebgp-multihop 2
 neighbor {Vultr_v6向け} graceful-restart
 !
 address-family ipv4 unicast
  neighbor {Vultr向け} soft-reconfiguration inbound
  neighbor {Vultr向け} route-map BGP-RMAP-V4-VULTR-IN in
  neighbor {Vultr向け} route-map BGP-RMAP-V4-VULTR-OUT out
  neighbor {bgpmon向け} soft-reconfiguration inbound
  neighbor {bgpmon向け} route-map BGP-RMAP-V4-BGPMON-OUT out
  no neighbor {Vultr_v6向け} activate
 exit-address-family
 !
 address-family ipv6 unicast
  neighbor {bgpmon向け} activate
  neighbor {bgpmon向け} next-hop-self
  neighbor {bgpmon向け} route-map BGP-RMAP-V6-BGPMON-OUT out
  neighbor {Vultr_v6向け} activate
  neighbor {Vultr_v6向け} soft-reconfiguration inbound
  neighbor {Vultr_v6向け} route-map BGP-RMAP-V6-VULTR-IN in
  neighbor {Vultr_v6向け} route-map BGP-RMAP-V6-VULTR-OUT out
 exit-address-family
exit
!
route-map BGP-RMAP-V4-VULTR-IN permit 10
 match ip address prefix-list ALL_ROUTE_V4
exit
!
route-map BGP-RMAP-V4-VULTR-OUT deny 10
 match ip address prefix-list ALL_ROUTE_V4
exit
!
route-map BGP-RMAP-V6-VULTR-IN permit 10
 match ipv6 address prefix-list ALL_ROUTE_V6
exit
!
route-map BGP-RMAP-V6-VULTR-OUT deny 10
 match ipv6 address prefix-list ALL_ROUTE_V6
exit
!
route-map BGP-RMAP-V4-BGPMON-OUT permit 10
exit
!
route-map BGP-RMAP-V6-BGPMON-OUT permit 10
 set ipv6 next-hop global 2001:db8::1
exit
!
end
GREの設定

Vultrインスタンス

VultrのインスタンスでGREを設定する。

/sbin/modprobe ip_gre
ip tunnel add tunnel0_gre mode gre remote {自宅のGlobalIP} local {VultrのGlobalIP} ttl 255
ip link set tunnel0_gre up
ip addr add 192.168.255.5/30 dev tunnel0_gre
ufw disable

必要に応じて、/etc/network/if-up.d/gre-tunnelなどに記載しておいても良い。

自宅Router

自宅のルータにも設定を入れてあげる。自分の場合はISR1000でGREを終端した。

interface Tunnel2
 ip address 192.168.255.6 255.255.255.252
 ip tcp adjust-mss 1436
 tunnel source {自宅のGlobalIP}
 tunnel destination {VultrのGlobalIP}
bgpmonの設定

FRRoutingとピアをするbgpmon側でも設定を入れておく

set system services ssh
set system max-configurations-on-flash 5
set system max-configuration-rollbacks 5
set security forwarding-options family inet6 mode packet-based
set security forwarding-options family mpls mode packet-based
set security forwarding-options family iso mode packet-based
set interfaces ge-0/0/0 unit 0 family inet address xxx.xxx.xxx.xxx/xx
set interfaces lo0 unit 0 family inet6 address 2001:db8::1/128
set routing-options static route 0.0.0.0/0 next-hop xxx.xxx.xxx.xxx
set routing-options router-id xxx.xxx.xxx.xxx
set routing-options autonomous-system 65000
set protocols bgp group vultr type external
set protocols bgp group vultr multihop
set protocols bgp group vultr accept-remote-nexthop
set protocols bgp group vultr import ACCEPT-ALL
set protocols bgp group vultr family inet unicast no-install
set protocols bgp group vultr family inet6 unicast no-install
set protocols bgp group vultr neighbor 192.168.255.5 peer-as XXXXXXXX
set policy-options policy-statement ACCEPT-ALL term 1 from protocol bgp
set policy-options policy-statement ACCEPT-ALL term 1 then accept
状態の確認

FRRouiting

IPv4/IPv6ともにNeighborがUPしている。
受信経路はIPv4が96万くらいIPv6が20万くらい。
送信はUPさせたばかりなのでOutQにあるようにUPDATEが走っている。

frrouting# show bgp view FRR summary

IPv4 Unicast Summary:
BGP router identifier XX.XX.XX.XX, local AS number XXXXXXXX VIEW FRR vrf-id 0
BGP table version 88845731
RIB entries 1758607, using 161 MiB of memory
Peers 2, using 40 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
XXX.XXX.XXX.XXX 4      64515  31383106    165944 88845731    0    0 08w3d12h       956701        0 VULTR_v4_64515_169.2
XXX.XXX.XXX.XXX  4      65000     78190  27211814 88845731    0 10001 00:01:53     (Policy)   359922 izumin_v4_65000_192.

Total number of neighbors 2

IPv6 Unicast Summary:
BGP router identifier XX.XX.XX.XX, local AS number XXXXXXXX VIEW FRR vrf-id 0
BGP table version 407399224
RIB entries 382514, using 35 MiB of memory
Peers 2, using 40 KiB of memory

Neighbor          V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
XXX.XXX.XXX.XXX    4      65000     78190  27211814 407399224    0 10001 00:01:53     (Policy)    99797 izumin_v4_65000_192.
XXXX:XXXX:XXXX::1  4      64515  74632564    165947 407399224    0    0 08w3d12h       201174        0 VULTR_v6_64515_2001:

Total number of neighbors 2

bgpmon

izumin@bgpmon> show route summary
Autonomous system number: 65000
Router ID: XXX.XXX.XXX.XXX

inet.0: 956718 destinations, 956719 routes (956718 active, 0 holddown, 0 hidden)
              Direct:      1 routes,      1 active
               Local:      1 routes,      1 active
                 BGP: 956716 routes, 956715 active
              Static:      1 routes,      1 active

inet6.0: 201105 destinations, 201105 routes (201105 active, 0 holddown, 0 hidden)
              Direct:      2 routes,      2 active
                 BGP: 201103 routes, 201103 active

まとめ

以上の流れで自宅にフルルートを持ってくることができた。
あとは自宅のラボで好きに遊んだり、監視したりすれば良い。
仕事で広報した経路が自宅で見えたら キターッ! って感じで楽しいです。

おわり

タイトルとURLをコピーしました