Do I have email ??
皆さん、FreeBSD にログオンしたときにこのようなメッセージにであったことはありませんでしょうか?

ログイン直後に “You have new mail” と教えてくれています。誰から?20年ちょっと前 “You’ve Got Mail” というトムハンクス主演の映画がありましたが、誰かからのラブレターでしょうか?そうならうれしいのですが 🙂 実は cron で実行されたシステムステータスのレポートがメールで送られてきたものです。こんな感じでメールが溜まっていると思います。

へっ?ファイルが1つあるだけじゃないか?そうです。ファイルとしては1つだけです。いくつメールが溜まっていてもファイルは1つだけなのです。では、どうやってメールを読むのでしょう?たぶん会社でメールを使われる方は IT から押し付けられた M$ outlook などのメールツールで Windows クライアントパソコンで読むのでしょうが、この FreeBSD にはメールに関して何も設定が行われていません。ですので、ここに見えているメールを読むには OS 付属の mailx というコマンドで読みます。メールの内容はお見せしませんが、/etc/passwd や /etc/group にあった変更の状況や、ネットワークインターフェースの状況、バックアップやストレージのマウントの状況や空き情報など、管理者が知らないといけないシステムの状況と、失敗したログインや UID 0 のユーザの報告やパスワードのないアカウントの報告、セキュリティホールの見つかったパッケージに関する情報などシステムセキュリティに関するメールの2本が毎日届いていると思います。それ以外にも、Weekly のレポートや Monthly のレポートなども含まれると思います。これらのメールを ssh などで接続して mailx で読むことになるのですが、1台ならまだ耐えられますが、2台以上になると耐えられません。少なくとも私は 🙂 そこで、何回かに分けでメール関係のセットアップを行ってゆきたいと思います。まず、伝統的な SMTP によるメールサービスの集約を行って、家庭内の全てのメールを1台の FreeBSD に配送するようにします。続いて、SMTP は基本クリアテキストによるデータ伝送を行いますが、これを SSL で暗号化できるようにします。これで Man in the middle の盗聴は防ぐことができるのですが、昨今のメール事情を考えるとこれでは不十分で、メールの差出人を確認できるように DKIM による署名 をメールヘッダに追加して、DNS との組み合わせによりそのメッセージの正当性を確認できるようにします。続いてサイトの正当性を確認するため、DMARC や SPF レコードのセットアップを行ってみます。加えて、SMTP 認証と軽くウイルスチェックを行い、危険が一杯の Windows PC をクライアントにできるようにしてみます。続いて jf3vqb.net ドメイン宛のメールを受信できるようにして、続いて外部から送られてきた受信メールの DKIM などの情報を基にした SPAM チェックまでを行えるようにして、最後に IMAP などを使って Windows PC でメールを読めるようにしてみたいと思います。とりあえず今回はメールフローの設計と SMTP による家庭内メールの集約を行ってみます。
FreeBSD 14.0-RELEASE 以降を使う場合は、先に進む前にデフォルトの MTA を dma から sendmail に変更する必要があります。OS の 13 から 14 へのアップデートのページでも書いたのですが、/etc/mail/mailer.conf を修正して sendmail が動くようにします。
sendmail /usr/libexec/dma
mailq /usr/libexec/dma
newaliases /usr/libexec/dma
を
sendmail /usr/libexec/sendmail/sendmail
send-mail /usr/libexec/sendmail/sendmail
mailq /usr/libexec/sendmail/sendmail
newaliases /usr/libexec/sendmail/sendmail
hoststat /usr/libexec/sendmail/sendmail
purgestat /usr/libexec/sendmail/sendmail
に変更します。
enabling smtp port for NICs

メールアドレスを pokemon@jf3vqb.net として、dhcp さんの /var/mail/pokemon ファイルに集約できるように各設定を行うようにします。まず、dhcp さんでは localhost のみで動いている sendmail を NIC に割り当てている IP アドレスも使用できるようにします。そのために、/etc/rc.conf を編集します。こんな感じです。これで、127.0.0.1 のポート 25 のみで動ていた sendmail が IPv6 を含めて全てのアドレス (*) のポート 25 で動くようになりました。

続いて、dhcp さんが受け取るべきメールアドレスが何なのかを教えてやります。この場合、メールアドレスのドメイン部が jf3vqb.net である場合自分が受け取るべきメールであると理解します。そして、@ より前の部分をローカルのユーザ名と解釈しますので、例えば、root だと、/var/mail/root ファイルにメールを追加します。加えて、ドメインなどの設定がされていない場合、ホスト名をドメイン名として使用します。ですので、ローカルのホスト名も同様に追加してやります。因みに dhcp さん以外の sendmail はメールを受信しないので、この設定は不要です。

/etc/aliases
これでシステムレポートは root ユーザのメールファイルに追記されるのですが、私の場合普段のアカウントは pokemon ですので、この類のメールは /var/mail/pokemon に届いてほしいのです。ですので、/etc/aliases ファイルで振り分けの設定を行います。

デフォルトでは、管理者宛のメールは root 宛に届くようになっています。このコメントを外して自分のメールアドレスに届くようにします。このファイルを変更したら、newaliases コマンドを実行して、/etc/mail/aliases.db ファイルを更新します。FreeBSD では /etc/aliases は /etc/mail/aliases へのシンボリックリンクで、sendmail は /etc/mail/aliases ではなく /etc/mail/aliases.db ファイルを使用します。

お試しで root 宛にメールを送って、/var/mail/pokemon ファイルに届くことを確認します。

fake dns response with response-policy
届いたようです。次に他の FreeBSD からも root 宛のメールが dhcp の pokemon ユーザに届くようにします。方法はいくつかありますが、まず簡単なところで DNS の MX レコードを定義して dhcp さんに送れるようにします。ありゃー。。。外部の DNS の情報が見えていますね。元々の設計時に内部は home.jf3vqb.net ドメインにしたので、これは仕方ありません。

そこで、BIND の response-policy を使用して、嘘のデータで書き換えます。といっても、内部的には正しいデータとなります。まず BIND の named.conf に response-policy を定義します。次に、options 内にこのゾーンが response-policy であることを書き加えます。

そして、ゾーンの定義です。

ゾーンファイルはこのようになります。DNS サーバおよび IP アドレスは本来のアドレスを使用します。そして、MX レコードを本来とは異なる内部のホスト名にします。

これで DNS を起動しなおすと、このようなレスポンスを得ることができます。

期待通りのレスポンスなので、セカンダリ DNS の pokemon でもこのゾーンのセカンダリ設定を書き加えます。named.conf の options への変更は dhcp さんと同じですが、ゾーンの定義はセカンダリとして定義します。問題なさそうであれば DNS を起動しなおします。

sendmail configuration
sendmail に限らずメールの MTA の基本動作として、まずメールを受け取った時に自身の設定を確認して、自分宛のメールかどうかを確認します。自分宛のメールであれば誰宛のメールかを判断し、適当なメールファイルに追加します。逆に自分宛のメールではないと判断したら、DNS の MX レコードを検索して、受け取るべきサーバ情報を取得し、そのサーバに対して SMTP セッションを張り、メールを送ります。ですので、dhcp さん以外もこれらのメール配送の条件をクリアしているので、root 宛のメールは root@jf3vqb.net 宛であると /etc/aliases ファイルに記述してやります。因みに、ネットワークから送りつけられたメールがネットワーク経由の別のサーバ宛のメールである場合、メールをリレーするといいます。この動作はデフォルトで拒否するようになっています。ですので、local-host-names ファイルの設定なしにメールを送ろうとすると、Relaying denied と怒られることになるはずです。勿論 dhcp さん経由で gmail.com 等にメールを送る場合もリレーになりますので同様に拒否されます。

dhcp さん以外すべての FreeBSD で同様の変更を適用します。pokemon さんで試しに root 宛にメールを送って dhcp さんの pokemon ユーザに届くかどうか確認してみます。まずは送信側です。メールのログの最終行に relay=dhcp.home.jf3vqb.net と転送された旨、記録が残っています。

では受信側を見てみます。dhcp さんでエンターキーを叩くと、メールが届きましたとお知らせが表示されます。

中身はというと、こんな感じになっています。送ったメールのようです。

メールヘッダに書かれているアドレス関係はドメインを全く意識していない状態ですが、当初の目的に達することができました。次回は SSL による暗号化を行ってみたいと思います。
以下広告





コメント