Rspamd 1.7系のアクション設定の変更

Rspamdでは迷惑メールの判定アクションでこれまでReject(破棄)とAdd header (迷惑メールフラグ付加)のようなアクション別に点数を指定するような設定になっていた。
自動の迷惑メール判定はRspamdに限らずだけど誤判定のFalse Positiveが怖い。False Negativeであれば迷惑メールが普通にメールボックスに届くだけなので問題とはならないが、False Positiveが発生するともしかしたら重要なメールが迷惑メールと判定される可能性がある。しかも、RspamdのRejectは「受信したメールをメールボックスに届けないで破棄」なので誤判定の結果その(重要な)メールが消滅することになる。自分専用のメールサーバでもこれはイヤだが、他人のメールも預かるメールサーバでは絶対にマズい。
そこで、Rspamdを運用する際はRejectの判断基準点としてとんでもなく高い数値を指定して実質無効にして、Add headerに迷惑メール判定のしきい値となる数値を指定するという使い方が多かったのではないかと思う。

しかし、このやり方だと届いたメールのメールヘッダには迷惑メールの判定結果と判定基準点が記載されるので、例えば下。

正常なメール(非迷惑メール):
X-Spamd-Result: default: False [6.77 / 100.00]

Rejectは100点(見かけ上の判定基準点)、Add headerは10点(非表示で本当の判定基準点)、このメールは6.77点で非迷惑メールとして判定された。これは見ためには矛盾した結果ではない。

迷惑メール:
X-Spamd-Result: default: False [11.06 / 100.00]
X-Spam: Yes

Rejectは100点(見かけ上の判定基準点)、Add headerは10点(非表示で本当の判定基準点)、このメールは11.06点で迷惑メールとして判定された。これはメールサーバの管理者から見ると10点(Add header)の基準点を超えたので迷惑メールとして判断されたのは正しいのだが、メールの利用者から見ると表示されている100点の基準点に遥かに届かないのに迷惑メールとして判定されているように見える。見かけ上は矛盾しているので気持ち悪い。

これまで、Rspamdではこの表示の矛盾が嫌だなと思っていたのだが、1.7.0から?1.7.1からこのアクションの点数にnullを指定できるようになった。ただし、1.7.1までは設定でnullを指定する方法があるというのはサポートフォーラムみたいなところに書かれた情報しかなかったのとrspamadm configtestによる設定内容の正常性確認でエラーとして指摘されたので本当に使って良いのか怪しい状態だった。1.7.2ではrspamadm configtestでもエラーとならず、changelogにも書かれて正式に使えるものとなったみたい。

/usr/local/etc/rspamd/local.d/actions.conf
1
2
3
4
reject = null;
add_header = 10;
greylist = null;
他省略

上のように設定した場合、Rejectは無効になりAdd headerは10点になる。設定する側からすると大きな数値を指定して実質無効にするのとnullを指定して無効にするのはそれほど違うというわけではない。
しかし、メールヘッダが変わる。

正常なメール(非迷惑メール):
X-Spamd-Result: default: True [1.55 / 10.00]

Add headerが判定基準点となりそれが10点で、メールは1.55点と判断されたので非迷惑メールという判定になった。これは問題無い。

迷惑メール:
X-Spamd-Result: default: False [28.93 / 10.00]
X-Spam: Yes

Add headerが判定基準点となりそれが10点で、メールは28.93点と判断されたので基準点超えで迷惑メールになった。これは設定をする側はもちろんメール利用者にとっても矛盾の無い情報。

これが当然というか今までが異常だっただけだが、嬉しい変更といえる。

同様にGreylistingもこれまでは非常に高いスコアを指定することで無理やり動作させないようにしていたが、nullを指定することで実質無効にできる(みたい)。数時間ではあるが試した限りでは期待通りの動作をしている。

関連記事:

VolumioのIPアドレスを調べて接続する

名前解決というとhostsファイルやDNSで行うのが一般的だけど、実は知らないうちに?でも意外と多く利用されている名前解決方法もある。今回は2つ挙げる。
  • mDNS (multicast Domain Name System)
  • LLMNR (Link-Local Multicast Name Resolution)

どちらも名前に「マルチキャスト」が含まれているが、要するにどちらもネットワークのセグメント内で自分の名前(ホスト名)を名乗り合うことでネームサーバ無しに名前解決するものだと思えば良い。
「やぁやぁ、セグメント内のやつは音にも聞け、我こそはローカル村のhoge(hoge.local)也・・・」「しかと憶えたぞ(キャッシュした)」そんな仕組み。ただし名乗る前に名前がコンフリクトしないように根回しする。「俺、ジーパン刑事デカって呼んで欲しいんだけどLAN内には他にジーパン刑事は居ないよね?」「えっ?2号までいるの・・じゃあ俺はジーパン刑事3号でいくか。」ってのをやってる。

mDNSはAppleのBonjourに含まれているのでApple製品では特に意識せずに使える。AvahiはそのBonjourのZeroconf仕様を実装したものでLinuxなどで使われるようになっている。ただし、Linuxなどでは必ず使えるようになっているとは限らない。avahiが入っていて/etc/nsswitch.confの設定がしてあれば使える筈。
LLMNRはWindowsで使われる名前解決。以前はNetBIOSとかLMHOSTSの名前解決方法もあった(今も無くなってはない)けど今後はLLMNRになるのかな。でも、Windows10ではmDNSも使えるからLLMNR普及するのかしら?
とにかく、根は似たようなものだけど例によってAppleとMicrosoftで実装が違うと思えば良さげ。

VolumioとmDNSとAndroid

Volumioではavahiデーモンが動いているのでLAN(同一セグメント)内でmDNSが使える環境からは volumio.local というホスト名を指定することで接続できる。だから、MacとかiPhone, Windows, Linux(の多く)では特に意識せず普通に接続できる。

しかし、対応していない端末というのも結構ある。利用者の多いOSではAndroidとか(これも一応Linuxだけど)。AndroidもmDNSに1㍉も対応していないということではないけどmDNS対応として作ったアプリでしか使えないという。それって結局は使えないってことだと思うけど。

つまり、AndroidではmDNS対応アプリ以外では volumio.local というホスト名では Volumioには接続できない。
ネットワークの知識があればVolumioに割り当てられたIPアドレスを調べることができるだろうけど、そうではない場合またはIPアドレスを調べられる環境ではないということもあるかも。
そこでAndroidでVolumioのIPアドレスを調べてブラウザで表示する方法。

Service Browser 1
Service Browser
をインストールする。

Service Browser 2
Service Browserアプリを開くとネットワークの同一セグメント内に居るmDNS対応のホストがリスト表示される。ただし、サービス(ポート)別に表示されるので同じホストが複数表示されていることもある筈。
Volumioを探すのであればズバリVolumioという文字列が含まれているのがそれだけど、本当にアクセスしたいのはそのHTTPポートなので本当は2番めの赤枠。ただし、この時点では2番めがVolumioの端末かどうかはわからない。(他のホストのHTTPサービスかもしれない)
とりあえず一番上の _Volumio._tcp をクリックしてみた。

Service Browser 3
volumio.localのIPアドレスが表示されるので憶える。

Service Browser 4
さらにそのvolumio とIPアドレスをクリックすると詳細が表示される。1つ前の画面でIPアドレスを知ることができたならこの画面を見る必要はない。

機能としては次のアプリも同じ。見た目が違うだけという感じ。

ZeroConf Browser 1
ZeroConf Browser
をインストールする。

ZeroConf Browser 2
ZeroConf Browserアプリを開くとネットワークの同一セグメント内に居るmDNS対応のホストがリスト表示される。ただし、サービス(ポート)別に表示されるので同じホストが複数表示されていることもある筈。
Volumioを探すのであればズバリVolumioという文字列が含まれているのがそれだけど、本当にアクセスしたいのはそのHTTPポートなので本当は2番めの赤枠。ただし、この時点では2番めがVolumioの端末かどうかはわからない。(他のホストのHTTPサービスかもしれない)
とりあえず一番上の _VOLUMIO をクリックしてみた。

ZeroConf Browser 3
volumio.localのIPアドレスが表示されるので憶える。

VolumioのIPアドレスがわかったのでブラウザにそれを入力してVolumioを表示する。

ZeroConf Browser 1
ブラウザがChromeのGoogleの画面だと一番上にURLの入力欄が無いので検索窓に入力することになる。Googleの画面以外では上部に表示されるURL入力欄に入力する。

ZeroConf Browser 2
IPアドレスを入力する。

ZeroConf Browser 3
Volumioが表示される。

こんだけのことなのでわからないということはないと思う。

おまけ

気をつけたいのはmDNSを使おうとする環境では他の名前解決方法で ホスト名.local のような名前が引けないようにしなければならないこと。つまりmDNSを使おうとしているのに例えばローカル用のDNSサーバとかActiveDirectoryで hoge.local のようなレコードが登録されていていてそれが使えるとダメ。まぁ、そんな環境であれば、もう名前が引けてる筈だから更にmDNSを使おうという話にならないと思うけど。

LinuxからVolumioのIPアドレスを調べる場合。

$ ping -c 1 volumio.local
PING volumio.local (192.168.2.220) 56(84) bytes of data.
64 bytes from 192.168.2.220: icmp_seq=1 ttl=64 time=2.80 ms
非常に簡単。
関連記事:
Up