とても久しぶりにブログ更新します。
普段ネットワークエンジニアとして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にした。フルルート受けれる機器ならなんでも良い。
XでSRX300でフルルート保持できるのかというコメントを見かけましたが、
スペック表見る限り26万程度のようです。
この記事ではno-installでFIBに入れてないですし転送性能を保証するものではありません。
show route receive-protocol bgp {neighbor}
show route aspath-regex {AS_PATH}
などは動作しました。後ろの方のIPも見えているのでおそらく確認はできそう。
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
まとめ
以上の流れで自宅にフルルートを持ってくることができた。
あとは自宅のラボで好きに遊んだり、監視したりすれば良い。
仕事で広報した経路が自宅で見えたら キターッ! って感じで楽しいです。
おわり