はじめに
こんにちは、さかなです。
普段は自宅サーバーを運用したり、Proxmox VEをいじったり、VPNを張ったり、たまに「普通の家庭には存在しない謎の経路制御」を家でやっています。
今回は DN42 について書きます。
私は現在、DN42上で AS4242423510 を持っています。
ただし、この記事を書いている時点ではネットワークを整備中のため、一時的に落としています。
落ちているASの人間がDN42の記事を書くなという説はありますが、ネットワーク屋は一度壊してからが本番だと思うので許してください(?)。
将来的にはDN42だけでなく、いわゆる The Internet、つまり本物のインターネット側にも進出していきたいと思っています。
DN42はそのための練習場として、かなり面白いです。
本物のAS運用、BGP、経路制御、ピアリング、ROA、DNS、トンネル、障害対応。
それらを「実験用ネットワーク」という形で体験できます。
自宅サーバーをやっていて、
「VPN張れた!」
「WireGuard動いた!」
「じゃあ次はBGP喋らせるか」
となった人は、だいぶ末期です。ようこそ。
DN42とは
DN42は、簡単に言うと BGPで遊べる実験用ネットワーク です。
通常のインターネットとは別の世界にあり、参加者同士がWireGuardなどのVPNトンネルを張り、その上でBGPを喋らせて経路交換します。
雰囲気としては、
こんな感じです。
普通のVPNと違うのは、単に「相手のLANに入る」だけではなく、自分のAS番号とIPプレフィックスを持って、BGPで経路を広報するところです。
つまり、気分だけならISPです。
実際には実験用ネットワークなので、公共インターネットの経路を流したり、逆にDN42の経路をインターネットへ漏らしたりしてはいけません。
ルートリークは、ネットワーク界の「机の上に置いた味噌汁をLANケーブルで倒す」みたいなものです。
やると悲しい。
必要なもの
DN42に参加するには、最低限こんなものが必要です。
- 24時間動かせるLinux/BSDルーター、またはVPS
- WireGuardなどのトンネル技術
- BGPを喋れるルーティングデーモン
- Git
- SSH鍵またはGPG鍵
- ちょっとした根性
BGPデーモンは、だいたい次のどちらかが多いと思います。
- FRRouting
- BIRD
私は普段、DN42用のルーターとしてVyOSを使っています。
VyOSはCisco IOSっぽい設定スタイルで、ネットワーク機器を触ったことがある人にはかなり馴染みやすいです。
DN42 WikiにもVyOS向けの設定例があり、WireGuard peer向けのfirewall baselineやBGP設定の考え方も載っています。
DN42参加の全体像
DN42に参加する流れはこんな感じです。
見た目は長いですが、やっていることは意外とシンプルです。
- DN42の台帳に自分のASとPrefixを登録する
- 誰かとVPNを張る
- BGPで経路交換する
これだけです。
それと、Commitの署名は絶対なのでお忘れなく。
「これだけ」と言いながら、実際にやると普通にハマります。
ネットワークはそういうものです。
1. DN42 Registryを用意する
DN42では、AS番号やIPアドレスなどの情報を registry で管理しています。
これはGitリポジトリになっていて、参加者はリポジトリをforkし、自分の情報を追加してPull Requestを出します。DN42公式のGetting Startedにも、registryはGitで管理されていて、forkして変更し、PRを出してレビューを受ける流れだと書かれています。
やることはだいたいこうです。
git clone https://git.dn42.dev/dn42/registry.git
cd registry
実際には自分のアカウントでforkして、そこにpushする形になります。
2. maintainer objectを作る
最初に作るのが mntner です。
これは「このリソースは誰が管理しているか」を示すものです。
例として、TECHFISH-MNT みたいな名前を使うとします。
mntner: TECHFISH-MNT
admin-c: TECHFISH-DN42
tech-c: TECHFISH-DN42
auth: ssh-ed25519 <your-public-key>
mnt-by: TECHFISH-MNT
source: DN42
auth にはSSH公開鍵を入れます。
ここで登録した鍵を使って、あとからcommit署名を確認します。DN42のRegistry Authenticationでは、mntner の auth 属性がmaintainer本人確認のための公開鍵を定義し、PR時には署名で変更の正当性を確認する仕組みだと説明されています。
3. person objectを作る
次に person object を作ります。
person: TechFish
e-mail: example@example.com
nic-hdl: TECHFISH-DN42
mnt-by: TECHFISH-MNT
source: DN42
ここは自分の連絡先情報です。
なお、DN42 Registryは公開情報です。
ここに書いたメールアドレスなどの連絡先は外から見えるので、普段使いの個人メールではなく、DN42用の連絡先を用意するのがおすすめです。
インターネットっぽくなってきました。
「お前は誰だ」
「このASは誰が面倒見てるんだ」
「この経路おかしくないか」
というときに必要になります。
ネットワーク運用において連絡先はかなり大事です。
BGPは喋りますが、謝罪はしてくれません。
4. AS番号を登録する
次に aut-num を作ります。
DN42では AS424242xxxx のようなAS番号が使われます。
私の場合はこれです。
aut-num: AS4242423510
as-name: AS-TECHFISH-DN42
admin-c: TECHFISH-DN42
tech-c: TECHFISH-DN42
mnt-by: TECHFISH-MNT
source: DN42
Getting Startedでは、AS番号はDN42のASN空間から選び、基本的には 4242420000-4242423999 の範囲を使うように案内されています。
自分のAS番号を決めるときは、既に使われていないか必ず確認します。
AS番号は名前みたいなものなので、被ると地獄です。
人間界でいうと、クラスに同じ名前の人が3人いるくらい混乱します。
BGP界ではもっと面倒です。
5. IP Prefixを登録する
次に、自分がDN42内で使うIPアドレス範囲を登録します。
IPv6の場合は inet6num を作ります。
DN42ではIPv6にULA、つまり fd00::/8 の範囲を使います。公式FAQでも、DN42はIPv6をサポートしていて、ULAである fd00::/8 を使うと説明されています。
例:
inet6num: fdxx:xxxx:xxxx:0000:0000:0000:0000:0000 - fdxx:xxxx:xxxx:ffff:ffff:ffff:ffff:ffff
cidr: fdxx:xxxx:xxxx::/48
netname: TECHFISH-NETWORK
descr: TechFish DN42 Network
country: JP
admin-c: TECHFISH-DN42
tech-c: TECHFISH-DN42
mnt-by: TECHFISH-MNT
status: ASSIGNED
source: DN42
IPv4も使いたい場合は inetnum を作ります。
ただし、DN42のIPv4空間は貴重なので、必要以上に大きく取らない方が良いです。
公式Getting Startedでは、IPv4は /27 以下をデフォルトにし、必要なら /26 まで考える、/25 より大きい割り当ては慎重に、という感じのガイドラインになっています。
自宅サーバー1〜数台なら、正直 /28 でも十分です。
IPアドレスを雑に取りすぎると、あとから自分で自分に「お前、何してんの?」となります。
6. route / route6 objectを作る
Prefixを登録しただけではまだ足りません。
そのPrefixをどのASがoriginするのかを示す route / route6 object が必要です。
IPv6なら route6 です。
route6: fdxx:xxxx:xxxx::/48
origin: AS4242423510
max-length: 48
mnt-by: TECHFISH-MNT
source: DN42
IPv4なら route です。
route: 172.xx.xx.0/27
origin: AS4242423510
max-length: 27
mnt-by: TECHFISH-MNT
source: DN42
ここを忘れると、せっかくBGPで広報してもフィルタされる可能性があります。
公式Getting Startedでも、route6 / route objectはROAチェックに使われ、これを飛ばすと多くのpeerにフィルタされる可能性があると書かれています。
つまり、Prefix登録は「この土地を使います」
route objectは「この土地から道路を伸ばします」
みたいな感じです。
土地だけ持っていても、道路がなければ誰も来られません。
7. commitを署名してPull Requestを出す
DN42 registryへの変更は、commit署名が必要です。
GPGでもSSHでもできます。
最近ならSSH署名が楽だと思います。
git config --global gpg.format ssh
git config --global user.signingKey ~/.ssh/id_ed25519.pub
git commit -S -m "Add TECHFISH-MNT resources"
署名したらpushしてPull Requestを出します。
git push origin main
あとはレビューを待ちます。
ここでschemaエラーやformatエラーが出ることがあります。
公式Getting Startedでは、PR前に以下のようなチェック用スクリプトを使うことが案内されています。
./fmt-my-stuff TECHFISH-MNT
./check-my-stuff TECHFISH-MNT
./check-pol origin/master TECHFISH-MNT
これをやらずに出すと、CIに怒られます。
CIに怒られるのは慣れている人も多いと思います。
GitHub Actions、Gitea Actions、Jenkins、自宅サーバー民はだいたい何かしらに怒られて生きている。
8. Peerを探す
Registryが通ったら、次はpeerを探します。
DN42では、誰かとWireGuardなどでトンネルを張って、その上でBGPを喋ります。
公式Getting Startedでも、DN42ではpeeringとtransitの区別が薄く、多くの場合peerがupstream providerのように振る舞うと説明されています。また、なるべく近い地域・低遅延のpeerを探すことも推奨されています。
ここで初心者が思いがちなのがこれです。
「え、知らない人にpeerしてくださいって言うの……?」
怖いですね。
でも安心してください。
DN42には Automatic Peering という仕組みがあります。
9. Auto Peeringがあるので安心
DN42には、手動で「peerしてください!」とお願いしなくても、Webフォームなどから半自動・全自動でpeeringできる仕組みがあります。
DN42 WikiにはAutomatic Peeringのページがあり、特に Fully self-service の一覧には、即時・無人でpeeringできるサービスが載っています。
つまり、最初のpeer探しで、
「英語でメールを書いて、知らない海外のネットワーク管理者に話しかけて、返事を待って……」
みたいな精神的ハードルを下げられます。
もちろん、manual peeringもDN42の楽しさの一部です。
でも最初はauto peeringで1本つなぐのがかなりおすすめです。
最初の1peerが張れると、急に世界が見えます。
BGP sessionがEstablishedになった瞬間は、普通にテンションが上がります。
BGP neighbor is 172.xx.xx.xx, remote AS 424242xxxx
BGP state = Established
これを見た瞬間、だいたい人間はこうなります。
「うおおおおおおおおおおおおおおおおおおおお」
ネットワークエンジニアの咆哮です。
10. WireGuard Tunnelを張る
Peerが決まったら、WireGuardでトンネルを張ります。
DN42 WikiのWireGuardページでは、DN42のpeeringではBGPデーモンにルーティングさせるため、基本的にpeeringごとに1 interfaceを使う考え方が説明されています。
ざっくり設定例はこんな感じです。
[Interface]
PrivateKey = <your-private-key>
ListenPort = <your-port>
[Peer]
PublicKey = <peer-public-key>
Endpoint = <peer-endpoint>:<peer-port>
AllowedIPs = 0.0.0.0/0, ::/0
AllowedIPs はpeerのnext-hopだけではなく、DN42全体の経路を流せるようにする必要があります。
DN42 Wikiでも、AllowedIPs にはDN42全体の範囲、たとえば 172.20.0.0/14 や fd00::/8 を含める必要があると説明されています。
ここをミスると、BGPは張れているのに通信できない、みたいな地味に嫌な状態になります。
ネットワークで一番嫌なのは「なんか動いてるように見えるけど動いてない」です。
11. FRRやBIRDでBGPを設定する
トンネルが張れたら、次はBGPです。
これはあくまで雰囲気です。
実運用では、
- prefix-list
- route-map
- bogon filter
- max-prefix
- next-hop
- community
- RPKI/ROA相当のチェック
などをちゃんと考える必要があります。
特に大事なのは、インターネット側とDN42側の経路を絶対に混ぜないこと です。
DN42は実験用ネットワークです。
0.0.0.0/0 を雑に流したり、public internetの経路をDN42へ漏らしたり、逆にDN42の経路を外へ漏らしたりすると、だいぶ良くないです。
BGPは便利ですが、雑に扱うと世界に迷惑をかけられるタイプの便利さです。
包丁みたいなものです。
料理もできるし、まな板も破壊できます。
12. 疎通確認する
BGP sessionが張れたら確認します。
FRRならこんな感じです。
vtysh
show bgp summary
show bgp ipv6 summary
show bgp ipv4 unicast
show bgp ipv6 unicast
WireGuard側はこうです。
wg show
pingもします。
ping 172.xx.xx.xx
ping6 fdxx:xxxx:xxxx::1
ここで通ればかなり嬉しいです。
通らなかったら、だいたい次を見ます。
- WireGuardのhandshakeはあるか
- peerのendpointは合っているか
- AllowedIPsは広すぎず狭すぎず正しいか
- BGP neighborのremote-asは合っているか
- 自分のprefixをnetworkしているか
- route objectを作っているか
- filterで自分のprefixを落としていないか
- LinuxのIP forwardingが有効か
- firewallで落としていないか
ネットワーク障害は、だいたい「そんなところ?」という場所にいます。
そしてだいたい自分が悪いです。
つらい。
DN42に参加して何が楽しいのか
DN42は、ただBGPを喋らせるだけの遊びではありません。
自分のASを持つと、ネットワークの見え方がかなり変わります。
今までは、
「インターネットにつながっている」
だったのが、
「経路を受け取って、選んで、流している」
になります。
これはかなり大きいです。
自宅サーバーでWebサービスを立てるのも楽しいです。
でもDN42は、もう少し下のレイヤーで遊べます。
- 自分のAS
- 自分のPrefix
- 自分のルーティングポリシー
- 自分のpeer
- 自分の障害
- 自分のLooking Glass
- 自分のDNS
- 自分の謎ネットワーク
完全に沼です。
そして、自宅サーバー民は沼が好きです。
将来はThe Internetへ
私は今、DN42では AS4242423510 を持っています。
今はネットワーク整備中で一時的に落としていますが、これからちゃんと整備していきたいと思っています。
そして将来的には、DN42だけではなく The Internet にも進出したいです。
本物のASを持ち、public prefixを持ち、upstreamと契約して、BGPでインターネットに経路を流す。
もちろん、現実のインターネットはDN42よりずっと責任が重いです。
お金もかかります。
手続きもあります。
ルートリークしたら普通に怒られます。
たぶん胃も痛くなります。
でも、DN42で学べることは確実にその入口になります。
BGPを知識として知っているのと、実際にpeerを張って経路が流れてくるのを見るのは、全然違います。
DN42は、ネットワークの教科書を現実に引きずり出してくる場所です。
私はThe internetでASをしていないのでこんな偉そうに言える立場ではないと思いますが。
まとめ
DN42に参加する流れは、ざっくりこうです。
DN42は、BGPやAS運用を実際に体験できるかなり面白い実験用ネットワークです。
最初は難しく見えますが、やることを分解すると、
- registryに自分の情報を登録する
- peerとトンネルを張る
- BGPを喋らせる
という流れです。
そして、peer探しにはAutomatic Peeringという仕組みもあります。
「BGPやってみたいけど、本物のインターネットはまだ怖い」
という人には、DN42はかなり良い遊び場だと思います。
自宅サーバーをやっている人、WireGuardに飽きてきた人、ip route を見てニヤニヤできる人は、ぜひDN42に来てみてください。
たぶん楽しいです。
これがネットワークです。