第39話 ネットワーク・ダウン
馬を飛ばして二日。
ネットワーク連合の中枢都市ポート・ハブに到着した時、街は混乱の渦中にあった。
普段なら光の糸のように街を走り回る通信魔法の軌跡が——一本もない。転送門は沈黙し、伝令鳥だけが空を飛び回っている。アナログな通信手段だ。鳥が飛べる距離には限界がある。
「ひどいな……」ガルドが呟いた。
ポート・ハブは五大王国への転送ゲートが集結する要衝だ。商人、冒険者、外交官——あらゆる人間が行き交う都市のはずが、今は通りに座り込んだ人々が途方に暮れている。
「荷物が届かない」「家族と連絡が取れない」「商取引が全部止まってる」
悲鳴に近い声が、あちこちから聞こえた。
「マスター」メモリが俺の肩で小さく言った。「この街のコード、かなり荒れています。ネットワーク層が——ほぼ全損です」
俺はデバッガーズ・アイを起動した。
街全体を覆う源コードが見える。通常なら青く安定しているはずの通信関連のコードが——赤黒く点滅していた。
[NETWORK_HUB: PORT_HUB]
STATUS: CRITICAL
Active_Connections: 3/12,847
Relay_Tower_Online: 2/847
Packet_Loss_Rate: 99.97%
DDoS_Detection: POSITIVE
Attack_Vector: Distributed - Multiple sources
「パケットロス九十九・九七パーセント」
俺は読み上げた。
「ほぼ全滅だ」
連合議長パケット卿の執務室は、戦場のような慌ただしさだった。
壁一面に張られた地図の上に、赤い点が無数に灯っている。停止した中継塔の位置だ。ほぼ全てが赤だった。
「よく来てくれた、冒険者殿」
パケット卿は痩せた初老の男だった。鷲鼻に小さな眼鏡。神経質そうな指が、絶えず地図の上を動いている。
「三日前から始まった。最初は辺境の中継塔が数基停止した程度だった。だが——一日で五十基。二日目で三百基。そして昨日——残り全てが落ちた」
「指数関数的な拡大ですね」シェルが言った。
「その通りだ。我々の技師が復旧を試みたが——直してもすぐに再停止する。まるで——」
「治療しても再感染する、と」
俺が言うと、パケット卿が頷いた。
「中継塔を見せてくれ」
ポート・ハブの外周に、中継塔が建っていた。
石造りの塔の頂上に、青い結晶が嵌め込まれている。通信魔法の中継装置——この世界のルーターだ。
結晶は消灯していた。死んだ目のように、灰色の表面を晒している。
俺はデバッガーズ・アイで塔のコードを読んだ。
[RELAY_TOWER #0042]
STATUS: OFFLINE (OVERLOADED)
QUEUE: 847,291,003 pending packets
PROCESSING_CAPACITY: 10,000/sec
INCOMING_RATE: 2,400,000/sec
ERROR: Buffer overflow - Queue exceeded maximum capacity
ATTACK_SIGNATURE: DDoS (Distributed Denial of Service)
SOURCE: [MULTIPLE - 12,847 unique origins detected]
「DDoS攻撃だ」
俺は宣告した。
「大量のゴミデータが全方位から同時に送り込まれている。中継塔の処理能力を遥かに超えたデータ量が押し寄せて、正規の通信パケットが処理できなくなっている」
パケット卿が眉をひそめた。「ゴミデータ? 意図的な攻撃だと?」
「間違いない。このパターンは——DDoS。分散型サービス拒否攻撃。前の世界でも、サーバーを落とすのに使われた手法だ」
「復旧しても再停止するのは——」
「攻撃が続いているからだ。蛇口を開きっぱなしで、バケツの水を掻き出しているようなものだ。蛇口を閉めない限り、永遠に溢れ続ける」
パケット卿の顔が蒼白になった。
「攻撃元を特定できるか」
問題はそこだった。
DDoS攻撃の厄介なところは、攻撃元が分散していることだ。一万二千以上のソースから同時に攻撃が来ている。一つ一つを潰しても追いつかない。
「シェル」
「はい」
「クエリ魔法で攻撃元を追跡できるか」
シェルが手帳を開き——すぐに閉じた。
「できません。クエリ魔法は通信ネットワークを経由して情報にアクセスします。そのネットワーク自体がダウンしている以上——」
「オフラインか」
「はい。私の魔法は——今、ほぼ使えません」
シェルの声に、わずかな苛立ちが混じった。情報魔法使いが情報にアクセスできない。武器を取り上げられたようなものだ。
俺は考えた。
ネットワークがダウンしている。オンラインでの追跡は不可能。だが——
「オフラインで追跡する方法がある」
俺は中継塔の根元にしゃがみ込んだ。
「中継塔にはログが残っている。どのパケットが、いつ、どの方向から来たか。タイムスタンプ付きで記録されているはずだ」
パケット卿が頷いた。「各塔にローカルログはある。だが量が膨大で——」
「量は問題じゃない。パターンが大事だ」
俺はデバッガーズ・アイで中継塔のローカルログにアクセスした。
[LOCAL_LOG: RELAY_TOWER #0042]
...
[T-00:00:03] PKT_IN: src=UNKNOWN_847 → size=64KB → JUNK
[T-00:00:03] PKT_IN: src=UNKNOWN_2941 → size=64KB → JUNK
[T-00:00:02] PKT_IN: src=UNKNOWN_119 → size=64KB → JUNK
[T-00:00:02] PKT_IN: src=UNKNOWN_7720 → size=64KB → JUNK
[T-00:00:01] PKT_IN: src=UNKNOWN_4455 → size=64KB → JUNK
...
[Total junk packets in last hour: 8,640,000]
ゴミパケットの洪水。しかし——全てが完全に同時ではない。
「メモリ」
「はい、マスター」
「各中継塔のログを比較する。攻撃パケットのタイムスタンプを分析して、最初に攻撃を受けた塔——攻撃の起点を逆算する。できるか」
メモリの目が光った。
「できます! 各塔のローカルログにアクセスして、タイムスタンプの差分から伝播パターンを再構築します。ネットワークが生きていなくても——物理的に塔を巡れば、ログは読めます」
「全塔を回る必要はない」俺は言った。「サンプリングでいい。東西南北に散った塔のログを数十基分読めば、三角測量の原理で発信源を特定できる」
五人で手分けした。
ガルドとアリアが東方面の塔を。シェルと俺が西方面を。メモリが上空から全体の座標計算を担当する。
馬で塔を回り、ログを手作業で読み取る。地道な作業だった。
前の世界で障害対応をしていた時を思い出す。ネットワーク障害が起きた時、ダッシュボードが死んでいたら、物理的にサーバールームに行ってログを見る。泥臭い作業だ。でもそれが一番確実だ。
三時間後。
俺たちは中継塔二十三基分のログを持って、パケット卿の執務室に戻った。
「メモリ、分析を」
「はい!」
メモリの瞳が全力で明滅した。回路模様が体中を走り回る。
二十三基のタイムスタンプデータが、メモリの頭の中で重ね合わされていく。
「パケットの到達時間差から——攻撃波の伝播パターンを再構築します。最初に攻撃を受けた塔は——中継塔#0721。位置は——北北東、距離約二百キロ」
「その方角にある塔の次に攻撃を受けたのは?」
「中継塔#0688。#0721の二十七ミリ秒後。位置は——北方向へさらに百五十キロ」
俺は地図の上に点を打った。
「次は?」
「中継塔#0655。さらに十九ミリ秒後。位置——」
メモリが座標を読み上げるたびに、俺は地図に点を打つ。
点が線になった。線が矢印になった。
矢印が指し示す方向——攻撃の波が広がった中心点。全ての攻撃パケットが最初に発信された場所。
俺は矢印の収束点に印をつけた。
地図を見た。
心臓が冷えた。
収束点は——ロジカ王国だった。
それだけじゃない。
ロジカ王国の——王都ロジカリスの——ほぼ中心。
王宮だ。
部屋が静まり返った。
パケット卿が地図と俺の顔を交互に見ている。ガルドが腕を組んだまま固まった。シェルが眼鏡を押し上げた——その手が、微かに震えていた。
メモリが俺の肩で小さくなっている。
俺は——アリアの顔を見た。
アリアは——地図の上の印を見つめていた。
自分の国。自分の家。
攻撃の発信源が、そこにある。
「アリア——」
俺が名前を呼んだ。
アリアは一瞬だけ目を閉じた。
長い瞬きだった。
目を開けた時——その目に、涙はなかった。
代わりに——決意があった。
「行きましょう」
アリアが言った。
静かな声だった。震えてはいなかった。
「行って——確かめましょう」
パケット卿に応急処置の方法を伝えた。
「ゴミパケットのパターンは六十四キロバイト固定だ。この特徴を持つパケットをフィルタリングして、到達前にドロップする設定を各塔に入れてくれ。完璧じゃないが——少なくとも正規の通信パケットの一部は通るようになる」
// EMERGENCY FILTER RULE
IF packet.size == 64KB
AND packet.header.checksum == [NULL]
THEN DROP packet
// This will reduce attack traffic by ~80%
// Legitimate packets with same size will also be dropped (false positive ~2%)
パケット卿は即座に技師を集め、手動で——物理的に各塔を回って——フィルタを適用する作業を開始した。
ネットワークが死んでいるから、設定変更すらオフラインでやるしかない。
アナログだ。泥臭い。でもそれしかない。
「ありがとう、冒険者殿」パケット卿が俺の手を握った。「ロジカ王国で——何が起きているのか、確かめてきてくれ」
「ああ」
俺は頷いた。
そしてアリアを見た。
アリアは——もう、俺を見ていなかった。
北の方角を——ロジカ王国の方角を——見つめていた。
ロジカ王国への道中。
転送魔法が使えないから、馬で二日の旅になる。
初日の夜。野営の焚き火の前で、俺とアリアが並んで座っていた。ガルド、シェル、メモリは先に眠っている。
アリアが——口を開いた。
「もし兄が——ヴァリドが関わっていたら、私は——」
声が途切れた。
俺は焚き火を見つめたまま言った。
「まだ確定じゃない。攻撃の発信源が王都だとしても、王宮内の誰かが——ヴァリドじゃない可能性もある」
「……ええ」
「でも」
俺は続けた。
「事実は事実として向き合わないと」
アリアが小さく笑った。苦い笑みだった。
「あなたは強いですね。感情に流されずにいられて」
「……強いんじゃない」
俺は言った。
「前にも同じ失敗をしたことがあるだけだ。問題を感情で処理しようとして、もっと大きな問題になった」
前の世界の記憶が蘇る。
上司が書いたコードにバグがあった。深刻な設計ミスだった。俺は気づいていた。だが——上司との関係を気にして、指摘しなかった。「まあ、本番で問題が出る前に誰かが見つけるだろう」と。
結果——本番環境で大規模障害が発生した。数百万ユーザーに影響が出た。復旧に三日かかった。
あの時、最初に気づいた段階で報告していれば——一時間で直せた問題だった。
「見て見ぬふりをするのが一番まずい」俺は言った。「事実から目を逸らすと、問題は必ず大きくなる。プログラムでも、人間関係でも——同じだ」
アリアが俺を見た。
焚き火の光が、アリアの目に映っている。
「……ありがとうございます」
アリアが言った。
「事実を確かめに行きます。何が起きていても——向き合います」
「ああ」
俺は頷いた。
それ以上の言葉は、要らなかった。
次回、第40話「インサイダー」——ロジカ王都に帰還した蓮たちが目にするもの。そしてアリアの兄、ヴァリド王子の変貌。




