アクセス観測

つきまといアクセスの排除完了

  1. 現状

2025年7月下旬頃から、特定の組織的な挙動に起因する可能性がある不審なアクセスが継続していました。
これに対し、先日新たに攻撃ログ収集用のサーバーを構築したことで、本ブログを含む正規サイトの運用を「国内限定」に制限しつつ、不審な挙動を分離・監視できる体制が整いました。

そもそも、私のサーバーには外部からのアクセスは極めて限定的です。
そのため、攻撃ログの観測・分析そのものが運用上の主要な意義となっていますが、国内限定とした場合、これらのアクセスも同時に遮断されてしまいます。

そこで、攻撃ログの観測・分析専用サーバーを別IPで構築することにより、正規サイトを国内限定とすることによるデメリットを補完する構成としました。

現在の正規サイト用ルーター構成では、iptables を用いて以下のように防御を構築しており、海外VPS経由の「つきまといアクセス」は事実上排除されています。
本運用は、今後も恒久的な措置として継続する予定です。

Chain INPUT (policy DROP 2198 packets, 142K bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     114K   19M ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2     4572  519K ACCEPT     0    --  br0    *       0.0.0.0/0            0.0.0.0/0
3      750 34579 DROP       0    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            match-set firehol_level1 src
4      451 22657 DROP       0    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            match-set firehol_level2 src
5     1521 82559 DROP       0    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            match-set firehol_level3 src
6        0     0 ACCEPT     17   --  ppp0   *       0.0.0.0/0            0.0.0.0/0            state NEW udp dpt:500
7        0     0 ACCEPT     17   --  ppp0   *       0.0.0.0/0            0.0.0.0/0            state NEW udp dpt:4500
8        2    80 ACCEPT     17   --  ppp0   *       0.0.0.0/0            0.0.0.0/0            state NEW udp dpt:1194
9        0     0 ACCEPT     0    --  lo     *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     229K  154M ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2       49  2060 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set firehol_level1 src
3       57  2924 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set firehol_level2 src
4       66  3448 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set firehol_level3 src
5        0     0 DROP       6    --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            tcp dpts:137:139
6        0     0 DROP       17   --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            udp dpts:137:139
7        5   260 DROP       6    --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            tcp dpt:445
8        0     0 DROP       17   --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            udp dpt:445
9        0     0 DROP       6    --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            tcp dpt:111
10       0     0 DROP       17   --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            udp dpt:111
11    4384 2676K ACCEPT     0    --  br0    ppp0    192.168.1.0/24       0.0.0.0/0
12       0     0 DROP       0    --  ppp0   br0     0.0.0.0/0            192.168.1.1          match-set other_block src
13      22  1320 DROP       0    --  ppp0   br0     0.0.0.0/0            192.168.1.1          match-set gcloud src
14       0     0 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:22 match-set jpnet src
15       2   112 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:25
16       0     0 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:80 match-set jpnet src
17       2   120 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:80 match-set searchengines src
18       0     0 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:443 match-set jpnet src
19     134  7784 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:443 match-set searchengines src
20       0     0 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:587 match-set jpnet src
21       0     0 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:993 match-set jpnet src
22      10   500 DROP       6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:22
23      47  2764 DROP       6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:80
24      83  4528 DROP       6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:443
25       2    96 DROP       6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:587
26       1    52 DROP       6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:993

Chain OUTPUT (policy ACCEPT 118K packets, 8744K bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     0    --  *      lo      0.0.0.0/0            0.0.0.0/0

・ipset の内容
firehol_level1~3 : FireHOL で公開されているブラックリストを DROP
jpnet : 日本国内からのアクセスのみ許可
searchengines : 主要サーチエンジンのみ許可

聖域の3分間を狙うハイエナたち

導入:午前0時の「呼吸」

SSL証明書の更新(ACME)のため、深夜0時、わずか3分間だけ正規サイト(sky.0t0.jp)のPort 80が開放される。
それは、サーバーが深呼吸をするような、一瞬の隙である。

通常は閉ざされた門。
この3分間のみ、外界との接続が許可される「例外領域」となる。


観測ログ:正規サイトとハニーポット

ハニーポット(pacific.sky.0t0.jp)

43.166.247.82 - - [19/Mar/2026:00:00:18 +0900] "GET / HTTP/1.1" 200 717 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"

00時00分18秒:未だ執拗にアクセスしてくる13_2_3の獣

状況:
開門から約18秒後、IP直打ちと見られるアクセスがハニーポットに到達。

注視点:
User-Agentに含まれる「iPhone OS 13_2_3」は過去にも観測されているパターンであり、同一系統の自動化クライアントが継続的に動作している可能性が高い。

当該アクセスはハニーポット上で正常処理(200応答)され、以下のメッセージが返却されている。

Welcome to a quiet place.
Are you lost again ?

これは誘導・観測を目的とした意図的な応答である。

正規サイト(sky.0t0.jp)

research2.hadrian.io - - [19/Mar/2026:00:01:48 +0900] "GET / HTTP/1.1" 301 547 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0"

00時01分48秒:Hadrianの影

状況:
開門から約1分48秒後、正規サイトに対してスキャンアクセスを確認。

深淵 迎賓館 閉館

ほんの二日前に深淵 迎賓館を再開したばかりだが・・・

そもそもの経緯は、正規サイト(このブログを含むサイト)に付きまとうように、しつこくアクセスしていた連中を、アクセス制御を工夫することで 深淵 迎賓館という餌を与えて引っ越しさせた というものである。

ポンポンスポポンと手玉に取って弄んだ訳だ。

しかしながら、ろくでもない連中の相手をしていても、不快なだけである。

ということで、LOG収集用サイトを一新。
テーマは「海辺で寛ぐ」。

その名も 「Seaside Lounge」。

ちょっとした気分転換も兼ねて、リゾート風のフロントページに作り替えてみた(笑)

「Seaside Lounge」フロントページ
seaside lounge

ドメイン名(URL)も seaside から始まる構成にしてある。

ただし、彼らとは二度と関わりたくないので、URL は公開しない。

見つけられるものなら、どうぞご自由に。
もっとも、見つけたところで歓迎されるとは限らないが。

深淵 迎賓館を再開

獣たちの引越し - 完結編に書いたように、海外から流れ込むスキャンアクセスや攻撃アクセスの受け皿として用意していた別ホストを、一旦停止していた。

しかし、メインサイトの方はサーチBot以外のアクセスがほとんど無い。
あまりに静かすぎるので、「深淵 迎賓館」を再開することにした。

「深淵 迎賓館」フロントページ
geihinkan
チェックアウトの項目を追加。
チェックアウトすると、警察庁のサイバー警察局(https://www.npa.go.jp/bureau/cyber/)に転送される仕組み(笑)

ここは、闇の縁をさまよう獣たちの足跡を観測する場所。
探索や攻撃のログを、静かに記録している。

迎賓館は不定期に閉じられることもあるが、それもまた観測の一部。
獣たちが再び現れれば、また扉を開けるつもりである。

普段は誰もいない別室にあるサーバー置き場のレイアウト。
(テーブルの下にテーブルがある、ちょっと変わった机)

サーバー置き場

手前左の真っ黒な樹脂ケースが「深淵サーバー」。
今日もどこかの獣が、ここを覗きに来ているかもしれない。

獣たちの引越し - 完結編

しばらくの間、私は小さな観測実験を行っていた。

正規サーバー sky.0t0.jp を守るため、海外から流れ込むスキャンアクセスや攻撃アクセスを、別の場所へ誘導する仕組みを作ったのである。
その受け皿として用意したのが、別ホスト deep.0t0.jp。 いわば「深淵サーバー」であった。

その詳細については、下記の記事を参照願いたい。
「獣たちの引越し - 物理隔離とハニーポットによる静かなサーバー運用」

そこにはハニーポットを置き、インターネットの闇を彷徨う存在たちを静かに迎え入れる。
世界中のスキャナや攻撃ボットは、IPの海を漂いながら開いた扉を探している。
ログには彼らの足跡が次々と刻まれていった。

ポートスキャン。
脆弱性探索。
奇妙なUser-Agentによる記事のスクレイピング。

それらはまるで、暗闇の中を徘徊する獣の群れのようであった。

しかし一方で、正規サーバー sky.0t0.jp 側では、ある単純な条件を設けていた。
アクセスを国内IPに限定したのである。

するとどうなったか。

海外から流れ込んでいたスキャンや攻撃アクセスは、ほぼ完全に姿を消した。
ログには穏やかな通常アクセスだけが残った。

つまり、無差別にインターネットを徘徊している獣たちの多くは、日本国内ではなく、海外ネットワークのどこかからやって来ていたのである。

役目は果たされた。

獣たちはすでに引っ越し、観測も十分に行った。
それ以上、この装置を動かし続ける理由はない。

そこで私は、サブルーターと deepサーバー の電源を落とした。

静かになったログを眺めながら、ふと思う。

もちろん、日本国内にも不正アクセスを行う者は存在するだろう。
しかし少なくとも、無差別に世界中の扉を叩き続けるような振る舞いは、極めて少ないように見える。

それは技術の問題ではない。
回線速度でも、コンピューターの性能でもない。

もっと古いもの――
社会の中に長く積み重なってきた、倫理や文化の層なのかもしれない。

他人の家の門を勝手に叩かない。
鍵穴を覗かない。
許されていない場所には踏み込まない。

そんな当たり前の感覚が、まだわずかに残っている。

もしそれが日本人の持つ品格の名残だとするならば、それは案外、世界の中で貴重なものなのかもしれない。

そして今、深淵は静かに閉じられた。

獣たちの引越しは、これにて完結である。