spamhaus のDQSキー取得
spamhaus はパブリックDNSを拒否
自宅メールサーバでの運用で、spamassassin などの設定をしていても、迷惑メールがそれなりに届く。
傾向としては、Google や Amazon のクラウドサーバから、SPF や DKIM を正規に取得した使い捨てドメインから送られてくる。このため、OpenDMARC などを設定してもダメ。Gemini に聞いたら、使い捨てドメインからの RBL のデータベースが得意な、spamhaus を薦めてくれる。
ただ、spamhaus は、以前にも設定したけど問い合わせを拒絶されたので、設定から外していた。改めて確認すると spamhaus は、無料サービスだけど大量の問い合わせをさばききれないので、8.8.8.8 や 1.1.1.1 のような パブリックDNS を経由した問い合わせには、答えを返さない運用をしているらしい。私の拒絶経験もコレが原因。
んで、色々調べると、無償サービスだけどユーザ登録して DQS キーを使えば、パブリックDNS経由での問い合わせでも拒否されないらしい。(最初、ユーザ登録とか嫌いなので、パブリックDNSを使わないキャッシュDNSサーバを立てようか…とも思ったけどシステムが複雑になるだけ)
spamhaus のユーザ登録とDQSキー生成
spamhaus の登録ページにアクセス(Spamhaus DQS Sign Up )し、DQS キーの発行を行う。
postfix に登録
postfix の main.cf の smtpd_recipient_restrictions に 以下のように登録。xxx…xxx の部分に発行した DQS キーを記載する。
((( /etc/postfix/main.cf )))
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client xxxxxxxxxxxxxxxxxxxxxxxxxx.zen.dq.spamhaus.net=127.0.0.[2..11],
check_policy_service unix:private/policy-spf,
permit
追記 2026-05-07 spamhausの効果覿面
spamhaus を RBD に登録してから、効果覿面。使い捨てドメインからのメールがきれいさっぱり止まっていて、最近は spam なしが続いている。
Ubuntu 26.04 で独自パッケージ設定が無効化
Ubuntu 26.04 をインストールしたら、nodejs, vscode, google-chrome などの インストール用の設定が無効化されている。まあ、競合する可能性あるだろうし、無効化されても文句はいえん。ということで、設定のやり直しをして、古い sources.list を削除
((( node.js ))) $ curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - $ sudo apt-get install -y nodejs build-essential ((( vscode ))) $ curl -fsSL https://packages.microsoft.com/keys/microsoft.asc \ | sudo gpg --dearmor -o /usr/share/keyrings/microsoft.gpg $ sudo apt install code ((( google-chrome ))) $ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb $ sudo apt install ./google-chrome-stable_current_amd64.deb ((( 古い sources.list を削除 ))) $ cd /etc/apt/sources.list.d/ $ sudo rm *.distUpgrade ((( パッケージ更新の確認 ))) $ sudo apt upgrade -U
UPS交換(Linux 7.0による警告対策)
UPSが大量の警告
Ubuntu 26.04 の導入により Linux の Kernel も linux-image-7.0.0-14-generic になったが、移行後の Load Average が高い。
原因を調べると(後述)、apcupsd で kernel が以下の警告を毎秒くらいの頻度で出ている。APC ES 750 を使っているけど、4byte の返答があるはずなのに2byteしか返ってこないという内容らしい。このため、syslog のファイル出力でシステム負荷が 0.4 ほどに上がっている。
4月 24 23:05:29 ... kernel: hid-generic ... :Event data for report 22 was too short (4 vs 2)
以前の Kernel なら、同様のエラーはでていたのかもしれないが、syslog に警告を記録していなかったから、問題にはならなかった。Kernel が 7.0 になり、この辺の対応がきちんとするようになったのが原因のようだ。

しかたがないので、syslog でこのメッセージを記録しないように設定したけど、それでも 負荷が 0.2 ほどになる。
以前の Kernel なら、0.1 程度だったので、 なんとなくヤな感じ。
負荷の原因の見つけ方
今回、UPS の原因を見つけるにあたり、Gemini を活用しまくり。top の出力を Gemini にかけて、pidstat, vmstat などの結果を確認して…の繰り返し。
$ top
$ htop # あまり重い処理がみつからない
$ sudo pidstat 2 5 # 2秒おきの集計を5回表示
$ sudo vmstat 1 5 # 負荷の原因が、計算かディスク待ちか
$ sudo iotop -o # どのプロセスが入出力しているか
# ここで、systemd-jounald が原因というのが判明
$ sudo journalctl -f # Syslog を確認
# ここで、UPS のログが見つかる
UPSのエラー対策
UPS のエラー警告だけど、UPS の状況を確認すると、apcaccess コマンドの結果が、「ONLINE:つながってるけど NOBATT:バッテリーがつながっていない」との出力がでている。充電電圧も出力されていてバッテリーは動いているはずなのに…。Gemini に聞いても「UPS のよくある故障だし、Syslog を無視するようにして問題なく、他の機能が正しく動いているなら無視していい」とのアドバイス。
$ apcaccess : STARTTIME: 2026-04-24 17:54:04 +0900 MODEL : APC ES 750G STATUS : ONLINE NOBATT
Syslog をフィルタリングしてディスクI/Oが改善しているとはいえ、以前より負荷が高い状態は気持ち悪いので、USPを交換した際の予備(バッテリー交換済み APC ES 550)があったので、元に戻した。
交換したら、UPS の警告は出なくなり、Syslog フィルタリング処理も不要になって、負荷も 0.1 程度に落ち着いたので、これで良し!!

Ubuntu 26.04 LTS リリース
Ubuntu 26.04 LTS が4/23にリリースされた(る?)。
ひとまずお試しと思うが、4/23 21:00 (JST) では、do-release-upgrade を実行しても、何も起こらない。
do-release-upgrade –devel-release
ということで、数時間フライング。ただし、影響を気にして WSL 環境に入れる。Windows App 的には、Ubuntu 24.04 なんだけど、Ubuntu 25.10 に更新済み。んで、今回の更新で Ubuntu 26.04 LTS となる。
$ sudo apt upgrade -U $ sudo do-release-upgrade --devel-release $ cat /etc/os-release PRETTY_NAME="Ubuntu 26.04 LTS" NAME="Ubuntu" VERSION_ID="26.04" VERSION="26.04 (Resolute Raccoon)" :

メインサーバの更新は一苦労
WSL 環境は、無事に 26.04 に更新できたので、メインの自宅サーバを更新。
ただ、こっちは面倒だった。サーバは、複数のネットワークインタフェースを Policy-routing させているけど、パッケージ更新中に netplan の関係で、インターネットにつながる設定を消してしまったのか、途中でネットワークが切れ、do-release-upgrade の最中に reboot せざるおえなくなった。
なんとか、復帰させたのはいいけど、最後は apache2 + wordpress のトラブル。
WordPress を起動したけど、データベース接続エラーが出てしまう。確認をすすめると、mariadb が後方互換で datadir = /var/lib/mysql で動いていたけど、datadir = /var/lib/mariadb がデフォルトの設定にされていた。いろいろ試していたけど、/var/lib/mysql の中身をごっそり /var/lib/mariadb にコピーしなおして無事復旧。
do-release-upgrade の最中に reboot したから、mariadb の正しい移行に失敗したんだろうな。
dmarc=fail p=none の受け取り拒否
自宅メールサーバでは、Postfix + Postgrey + amavisd + OpenDMARC + Spamassassin で運用しているが、
From 偽装は OpenDMARC で reject などができるようになった。
しかしながら、spammer は dmarc=fail 判定されても相手にメールが届くようにするため、ポリシー p=none のドメイン名探し、そのドメイン名を From にして、しつこく何度も送ってくる。
特定ドメインの dmarc=fail, p=none は受け取り拒否
しかたがないので、Postfix の OpenDMARC判定後に Postfix の header_checks の機能で p=none で送られてきたドメインは REJECT するようにしてみた。
((( /etc/postfix/main.cf )))
header_checks = regexp:/etc/postfix/header_checks
((( /etc/postfix/header_checks )))
/^Authentication-Results:.*dmarc=fail.*p=none.*header\.from=monex\.com/ \
REJECT DMARC authentication failed for specific domain.
spammerは怪しいドメインを次々みつけてくる
header_checks で運用してたけど、spammer は次々と怪しいドメイン(p=noneのドメイン)を見つけてきて、すり抜けてくるメールを送ってくる。このままじゃ、header_checks ファイルを日々更新することになりそう。
しかたがないので、dmarc=fail, p=none は SpamAssassin で Spam スコアを上げて、迷惑メールに確実に落とすことを目標にしたほうが良さそう。
((( /etc/spamassassin/local.cf の末尾に追記 ))) # DMARC失敗 (p=none) を検知するルール header LOCAL_DMARC_FAIL_NONE Authentication-Results =~ /dmarc=fail \(p=none/ describe LOCAL_DMARC_FAIL_NONE DMARC validation failed with p=none score LOCAL_DMARC_FAIL_NONE 3.5 # (参考) DMARC失敗 (p=quarantine) の場合もスコアを上げたい場合 header LOCAL_DMARC_FAIL_QUAR Authentication-Results =~ /dmarc=fail \(p=quarantine/ describe LOCAL_DMARC_FAIL_QUAR DMARC validation failed with p=quarantine score LOCAL_DMARC_FAIL_QUAR 5.0
DMARCレポートの修正
最近、dmarc のメールが届かないと思ってたら、中で使っている munpack がインストールされていない。インストールしようにも apt で見つからない。Ubuntu/debian のパッケージから消えたようだ。Gemini に代替品を聞いたら ripmime を紹介される。
((( ripmime をインストール ))) $ sudo apt install ripmime ((( 修正 ))) # 標準入力のメールから添付ファイルを抽出 - system( "/usr/bin/munpack -q -C $tmpdir > /dev/null 2>&1" ) ; + system( "/usr/bin/ripmime -q -i - -d $tmpdir > /dev/null 2>&1" ) ;
ついでに、DMARC のポリシーを p=quarantine から p=reject に変更しておいた。
spam が google などのクラウドばっかり
自宅サーバへの spam は、spamassasin などでかなり除去できるようにしてあるけど、それでも相変わらず届いている。送り元の IP アドレスを調べて 完全拒否などもしているけど、それでも届くのか。
送り元の確認
あらためて、送り元を確認したら、google クラウドサーバとか amazon クラウド。IPアドレスでは消せないなぁ。
$ cd ~/Maildir/.Junk/cur
$ grep "Received: from" * \
| grep -v 127. \
| awk -F [][] '{print $2}' \ [,]を区切り文字として真ん中を取り出す
| sort | uniq -c | sort -r
6 202.238.198.26
1 54.169.135.62
1 52.76.242.183
1 35.236.54.228
1 35.236.40.141
1 35.226.131.57
1 34.96.185.118
1 34.176.225.88
1 34.163.22.216
1 34.155.225.82
:

OpenDMARC fail で消せばいい
メール確認してたら、OpenDMARC が fail 返しているじゃん。こんなの Reject されてると思ってたけど、
“Authentication-Results: OpenDMARC; dmarc=fail (p=reject dis=none) header.from=monex.co.jp”
opendmarc.conf を確認したら、デフォルトのままで reject してなかった。ということで reject するように設定変更。
((( /etc/opendmarc.conf ))) # 認証に失敗したメールを拒否するように変更 RejectFailures true $ sudo systemctl restart opendmarc
職場からのメールは、fukui-nct.ac.jp 発信のメールが、fukui.kosen-ac.jp で届くので、dmarc=fail で失敗判定なんだけど (p=none) なので、普通に届く。
んで、自宅ドメインは…. p=quarantine 「隔離」設定になってるな。そろそろ reject「拒否」にしてもいいかも。
squidからtinyproxyに移行
Squid が遅い
Poicy Routing を導入して proxy 経由のアクセスを別ポートにすることができたけど、squid で動かしている中で、speed test を実行すると、何もなしで 1Gbps 近くでるものの、Proxy 経由にすると squid の性能が低いためか、10Mbps 程度しかでない。
tinyproxy をインストール
あまりにも遅いので、Squid 以外の Proxy サーバを探す。proxy による caching 効果は最近はほとんどないので、proxy パケットを捌くだけのものを調べると HAproxy が高性能らしいけど、reverse proxy 用途で設定がややこしそう。tinyproxy も候補にあがったので、こちらを導入
((( tinyproxy をインストール ))) $ sudo apt remove squid $ sudo apt install tinyproxy ((( /etc/tinyproxy/tinyproxy.conf ))) User tinyproxy Group tinyproxy Port 3128 # squid 互換の proxy ポート Bind 192.168.1.51 # outgoing ポートを 専用ポートにする Timeout 600 DefaultErrorFile "/usr/share/tinyproxy/default.html" StatFile "/usr/share/tinyproxy/stats.html" LogFile "/var/log/tinyproxy/tinyproxy.log" LogLevel Info PidFile "/run/tinyproxy/tinyproxy.pid" MaxClients 100 Allow 127.0.0.1 Allow ::1 Allow 192.168.11.0/24 ViaProxyName "tinyproxy"
policy-routing で Squid を別ポートに振分け
自宅のプロバイダ接続のルータは、上流2.5Gbps だけど、DHCPなどの設定の自由度が低いため、内側に WiFi ルータを置いた2段構成。ただし、上流ルータの LAN ポートが 1Gbps なので、2.5Gbps を活かせていない。
自宅サーバを使わない catvstb は、上流ルータの WiFi ポートを指定することで、内側 WiFi を使わないようにして、少しはトラヒックを分割した。
でも、さらなるトラヒックを活かすべく、内側ルータ内のサーバに2本目の LAN ポートを設け、内側 WiFi ルータを経由せずに上流ルータにつながるようにして、Squid の Proxy サーバのトラヒックだけこちらに流したい。
policy-routing の設定
設定の要点を Gemini に伝え、現状の netplan の設定を伝えて、policy routing の設定を提示してもらった。

---
network:
version: 2
renderer: NetworkManager
ethernets:
enp2s0:
match:
macaddress: "4C:CC:6A:F9:B0:84"
addresses: [192.168.11.3/24]
nameservers:
addresses: [192.168.11.3]
routes:
- to: default
via: 192.168.11.1
metric: 100 # メインの優先度を高く設定
enxc8a362ed15ee:
match:
macaddress: "c8:a3:62:ed:15:ee"
addresses: [192.168.1.51/24]
routes:
# メインのルーティングテーブルにはデフォルトゲートウェイを書かない
# 代わりに、Squid専用の「テーブル200」の中にだけゲートウェイを作る
- to: default
via: 192.168.1.254 # 上流ルーター
table: 200
routing-policy:
# 192.168.1.51 を「出発地」とするパケットだけをテーブル200へ飛ばす
- from: 192.168.1.51
table: 200
適用して、問題がなさそうなので、squid に以下の設定を追加。
((( /etc/squid/conf.d/policy-routing.conf ))) tcp_outgoing_address 192.168.1.51
動作を確認
Proxy ナシの Chrome と Proxy アリの Firefox を起動して、YouTube を閲覧中。catvstb でも 上流ルータをそのまま使って YouTube を視聴中。CATVSTB=赤、SquidProxy=青、通常パケット=水色でトラヒックが分散されている。自宅外からWebサーバが閲覧できることも確認できた。満足…

HTTP3+QUIC 対応で FireWall に udp/443 を追加しただけ
HTTP3+QUIC だと、QUIC 用に UDP/443 を使うらしい。
サーバの設定は後で見直すとして、ひとまず FireWall + 自宅ルータの DMZ 設定で、UDP/443 を追加してみた。
んで、apache2 で HTTP3+QUICK を探すと、標準モジュールでは対応していないとな。さすがに apache を手作業インストールで運用する気はおこらんなぁ…
