アクセス観測

DMARCレポートが届いた

二日前の6月5日に、DKIMおよびDMARC導入 を行い運用を開始したのだが、昨夜21時頃のタイムスタンプで興味深いメールが届いた。

差出人は au(KDDI)である。

From: no-reply@ezweb.ne.jp
To: postmaster@sky.0t0.jp
件名: 集約レポート結果 2026/6/5 (1件)

添付されていたレポートファイル
(kddi.com!sky.0t0.jp!1780628123!1780628123.xml)
を本文下欄に掲載する。

DMARCを導入したのは今回が初めてであり、実際にレポートが届くと「きちんと機能しているのだな」と実感する。

レポート内容を見ると、送信元IPアドレスは 69.84.99.82 であり、当方のメールサーバーとは無関係である。

さらに、

  • envelope_from : sky.0t0.jp
  • header_from : sky.0t0.jp

となっており、当ドメインを差出人として使用したメールが送信されていたことが分かる。

しかし認証結果は、

  • SPF : SoftFail
  • DKIM : none
  • DMARC : fail

となっており、正規の送信メールではないことが確認できる。

つまり、

  • sky.0t0.jp を差出人に偽装したメールが送信された
  • SPFおよびDKIM認証に失敗した
  • DMARC評価によって不正メールとして判定された
  • auがDMARCレポートで通知してくれた

ということになる。

これまでも当サイトに対して様々な不審アクセスを観測しているが、今回はメールアドレスまで利用された形となる。

もちろんインターネット上ではメールアドレスの詐称自体は珍しいことではない。
しかし、自ドメインを騙った送信が実際に観測されると少々複雑な気分である。

そこでDMARCポリシーを

v=DMARC1; p=none

から、

v=DMARC1; p=reject; pct=100; rua=mailto:postmaster@sky.0t0.jp

へ変更した。

これにより、今後第三者が sky.0t0.jp を差出人として使用した場合でも、DMARCに対応した受信側では拒否されることになる。

DMARCレポートは地味な仕組みではあるが、「誰かが自分のドメインを騙っていないか」を確認できるため、個人運用のメールサーバーであっても導入する価値は大きいと感じた。

それにしても、なかなか陰湿な行為である(笑)

レポートファイル(kddi.com!sky.0t0.jp!1780628123!1780628123.xml)の内容

<?xml version="1.0" encoding="UTF-8"?>
<feedback>
  <report_metadata>
    <org_name>au.com</org_name>
    <email>noreply-dmarc-support@kddi.com</email>
    <report_id>20260605115523368832</report_id>
    <date_range>
      <begin>1780628123</begin>
      <end>1780628123</end>
    </date_range>
  </report_metadata>
  <policy_published>
    <domain>sky.0t0.jp</domain>
    <adkim>r</adkim>
    <aspf>r</aspf>
    <p>none</p>
    <sp>none</sp>
    <pct>100</pct>
    <fo>0</fo>
  </policy_published>
  <record>
    <row>
      <source_ip>69.84.99.82</source_ip>
      <count>1</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>fail</dkim>
        <spf>fail</spf>
        <reason>
          <type>other</type>
        </reason>
      </policy_evaluated>
    </row>
    <identifiers>
      <envelope_to>ezweb.ne.jp</envelope_to>
      <envelope_from>sky.0t0.jp</envelope_from>
      <header_from>sky.0t0.jp</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain/>
        <selector/>
        <result>none</result>
        <human_result/>
      </dkim>
      <spf>
        <domain>sky.0t0.jp</domain>
        <scope>mfrom</scope>
        <result>SoftFail</result>
      </spf>
    </auth_results>
  </record>
</feedback>

アクセス観測終了?!

去年7月から続くしつこい付きまといアクセス。

ここしばらくの間、ACMEチャレンジ以外のログを取得しない状態で、PORT80のみ常時公開していたが、本日付でサイトの運用を見直した。

公開状態のままではアクセスが絶えないため、通常は閉鎖し、証明書更新(ACME)のタイミングのみ短時間公開する構成に変更した。

これにより不要なアクセスを観測する機会はほぼなくなる。
いよいよ無意味なアクセス観測も終了だろうか?!

一方で、インターネット上では対象への執着に基づく監視行動や追跡行為が少なからず存在する。
興味深いのは、それらの行動が必ずしも合理的な目的に基づいていない点である。

行動科学の観点では、人は好意だけでなく嫌悪によっても対象へ注意を向け続けることが知られている。
対象を否定したいという感情が、結果として継続的な観察や監視を生み出し、本人の時間や認知資源を消費させる。

しかし、そのような行動は新たな知識や価値を生み出すことが少なく、多くの場合は生産性の低い活動に終始する。

限られた時間を何に使うかは個人の自由だが、他者への執着や監視に費やすより、自らの知識や経験を積み上げる方向へ向けた方が建設的であるように思う。

少なくとも私は、不要な雑音から距離を置き、自分の時間を自分のために使いたい。

伊吹山音頭

去年7月から続くしつこい付きまといアクセス。

未だに消えてないが、海外からのアクセスを専用サイトに閉じ込め、ACMEチャレンジ以外のLOGを取っていないので、詳細は不明な状態。

下記のパケットカウント、ルール14がその専用サイト宛のパケットだが、昨日24時間で120アクセスのみ。
少し前と比べると一桁少なくなっている。
このまま放置すれば、いずれ自然消滅か・・・

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1    7869K 6530M ACCEPT     0    --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2        0     0 DROP       6    --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            tcp dpts:137:139
3        0     0 DROP       17   --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            udp dpts:137:139
4        0     0 DROP       6    --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            tcp dpt:445
5        0     0 DROP       17   --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            udp dpt:445
6        0     0 DROP       6    --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            tcp dpt:111
7        0     0 DROP       17   --  br0    ppp0    0.0.0.0/0            0.0.0.0/0            udp dpt:111
8    26800   16M ACCEPT     0    --  br0    ppp0    192.168.1.0/24       0.0.0.0/0           
9      170  8763 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set firehol_level3 src
10      78  3968 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set firehol_level2 src
11       7   292 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set firehol_level1 src
12      10   436 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set gcloud src
13       0     0 DROP       0    --  ppp0   br0     0.0.0.0/0            0.0.0.0/0            match-set other_block src
14     120  7868 ACCEPT     6    --  ppp0   br0     0.0.0.0/0            192.168.1.1          tcp dpt:9080
15     113  6312 ACCEPT     0    --  ppp0   br0     0.0.0.0/0            192.168.1.1         

ちなみに、一日1~2回はスパムメールを送り付けようとしてくる。
DNSBL(ブラックリストデータベース)zen.spamhaus.orgを参照して、該当すれば拒否されるのだが、その際の応答メッセージを

アクセス観測終了

ほんの二日前、「Honeypot再起動」したばかりだが、そのアクセスLOGはゴミでしかない。
長年、このゴミを眺めることが半ば習慣になっていた。
例のつきまといアクセスと、それ以外を分離して観測するための構成でもあったのだが、ここにきて突然バカバカしさが勝ってきた。
ということで、今度こそ観測自体を廃止することにした(笑)

物理的なホストは用意せず、仮想ハニーポット(192.168.1.156)として設定。
仮想ハニーポット宛のパケットはFORWARDチェインにて無条件にDROPし、実体のない「ブラックホール」として動作させ、DROPカウントのみ確認できる構成とした。

156というIPアドレスは「イチコロ」をもじって割り当てている。
文字通りイチコロである(笑)

なお、本構成では「応答を返さない」ことを優先しており、スキャン元に対してはタイムアウトを誘発させるだけの受動的な防御となる。
ログを肥大化させず、リソース消費も最小限に抑える狙いである。

●PREROUTINGチェイン

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        4   172 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25 match-set firehol_level3 src to:192.168.1.156:25
2       28  1680 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25 match-set firehol_level2 src to:192.168.1.156:25
3        8   380 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25 match-set firehol_level1 src to:192.168.1.156:25
4       80  4752 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25 match-set gcloud src to:192.168.1.156:25
5      121  6642 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set firehol_level3 src to:192.168.1.156:80
6       86  4428 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set firehol_level2 src to:192.168.1.156:80
7        4   200 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set firehol_level1 src to:192.168.1.156:80
8       13   616 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set gcloud src to:192.168.1.156:80
9      194 10556 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set firehol_level3 src to:192.168.1.156:443
10      57  2916 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set firehol_level2 src to:192.168.1.156:443
11       4   200 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set firehol_level1 src to:192.168.1.156:443
12       4   204 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set gcloud src to:192.168.1.156:443
13       0     0 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 match-set jpnet src to:192.168.1.1:22
14       2   120 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:25 to:192.168.1.1:25
15       2    80 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set jpnet src to:192.168.1.1:80
16       2   120 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set searchengines src to:192.168.1.1:80
17      12   692 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set jpnet src to:192.168.1.1:443
18     171  9944 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set searchengines src to:192.168.1.1:443
19       0     0 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:587 match-set jpnet src to:192.168.1.1:587
20       0     0 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:993 match-set jpnet src to:192.168.1.1:993
21     121  6684 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:192.168.1.156:80
22     120  7996 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 to:192.168.1.156:443
23       5   232 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:587 to:192.168.1.156:587
24      10   460 DNAT       6    --  ppp0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:993 to:192.168.1.156:993

・ルール1~12
firehol_level1~3:FireHOL公開のブラックリストIPを仮想ハニーポット(192.168.1.156)へ
gcloud:スパム傾向の強いGoogle Cloud発を仮想ハニーポット(192.168.1.156)へ

Honeypot再起動

一週間ほど前、「翻弄の手仕舞い」の記事にあるように、つきまといアクセスや、スキャンアクセスの分離受信を廃止したのだが・・・
例のつきまといアクセスが一向に止まず、ログに残り続ける状態となっていた。
アクセスはHTTPSへ301リダイレクトされるため、最終的にはルーターでDROPされ、相手側は何も情報を得られない。
それにもかかわらず、執拗にアクセスを繰り返してくる。

結果として、ランダムなスキャンや攻撃アクセスよりも、つきまといアクセスのログが目立つ状況に・・・
これが不快で、じわじわとストレスが蓄積していく。

そこでiptablesの構成を変更し、Honeypot(観察用サーバー)を再起動。
再び分離受信を行うことにした。

ただし、「翻弄の手仕舞い」以前の状態、「正規サイトとハニーポット切り替え詳細」の記事にある設定へ単純に戻すと、目障りなつきまといアクセスまでHoneypot側のログに残ってしまう。
そこで今回は、FireHOLデータベースに登録されているIPレンジのホストのみを、Honeypot(観察用サーバー)へDNAT転送する構成とした。

つきまとい側は、DROPを避けるためFireHOLなどのブラックリストに該当しないホストを使ってくる。
そのため逆に、FireHOL該当ホストだけを通すことで、意図的に振り分けを行う形である。

この構成であれば、スキャンアクセスの収集は維持しつつ、例のつきまといアクセスの大半を除外できる。
さらに、FireHOLで検知されるホストの中身も確認できるため、一石二鳥だ。

●PREROUTINGチェイン

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        7   352 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:smtp match-set firehol_level3 src to:192.168.1.2:25
2        1    40 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:smtp match-set firehol_level2 src to:192.168.1.2:25
3        0     0 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:smtp match-set firehol_level1 src to:192.168.1.2:25
4       44  2268 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:http match-set firehol_level3 src to:192.168.1.2:80
5        1    52 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:http match-set firehol_level2 src to:192.168.1.2:80
6        0     0 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:http match-set firehol_level1 src to:192.168.1.2:80
7       49  2616 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:https match-set firehol_level3 src to:192.168.1.2:443
8       29  1596 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:https match-set firehol_level2 src to:192.168.1.2:443
9        7   384 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:https match-set firehol_level1 src to:192.168.1.2:443
10       1    60 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:ssh match-set jpnet src to:192.168.1.1:22
11       8   420 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:smtp to:192.168.1.1:25
12       0     0 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:http match-set jpnet src to:192.168.1.1:80
13       1    44 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:http match-set searchengines src to:192.168.1.1:80
14       0     0 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:https match-set jpnet src to:192.168.1.1:443
15      31  1728 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:https match-set searchengines src to:192.168.1.1:443
16       0     0 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:submission match-set jpnet src to:192.168.1.1:587
17       0     0 DNAT       tcp  --  ppp0   any     anywhere             anywhere             tcp dpt:imaps match-set jpnet src to:192.168.1.1:993

・firehol_level1~3 : FireHOLで公開されているブラックリストIPからのアクセスのみを Honeypot(192.168.1.2)へ振り分け
・jpnet:日本国内からのアクセスを Main Server(192.168.1.1)へ
・searchengines:主要検索エンジンのクローラを Main Server(192.168.1.1)へ