#はじめに
自宅で使っている PogoPlug (debian) から、JCOM のメールサーバを経由してメール送信できる環境を作成した時の覚え書きです。
pogoplug のクラウドサービスは、すでに終了しています。なので中身を debian 化して利用するのはオススメです。
・nanddump など NAND に関してのバイナリ置き場
・NAND の書き換えの手順
・rootfs の入手
#目的の環境
・PogoPlug では、sendmail デーモンは起動させておかない、つまりメール送信しか行わない。
・メールは受信しないので From: アドレスは JCOM のアドレスにする。
#インストールと設定
まずは sendmail のインストール、追加して JCOM へ接続時に認証を行うため libsasl 関連のパッケージもインストールします。
# apt-get install sendmail
# apt-get install libsasl2-2 libsasl2-dev libsasl2-modules libsasl2-modules-db
※ sasl 関連パッケージは、多少余分なパッケージも含んでいるかもしれません。
なんと無く名前から必要そうなものをインストールして結果OKであった経緯です。
submit.mc を変更します。以下は diff の差分です。
# diff -u submit.mc.org submit.mc
--- submit.mc.org 2018-08-13 13:41:38.000000000 +0900
+++ submit.mc 2018-08-13 14:11:03.000000000 +0900
@@ -36,6 +36,17 @@
VERSIONID(`$Id: submit.mc, v 8.14.4-8+deb8u2 2017-02-05 23:17:28 cowboy Exp $')
OSTYPE(`debian')dnl
DOMAIN(`debian-msp')dnl
+
+FEATURE(`authinfo',`hash /etc/mail/auth/authinfo')dnl
+define(`SMART_HOST',`smtpa.jcom.zaq.ne.jp')dnl
+define(`confAUTH_MECHANISMS',`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
+define(`confAUTH_OPTIONS', `A')dnl
+
+FEATURE(genericstable, `hash -o /etc/mail/genericstable')dnl
+MASQUERADE_AS(`jcom.zaq.ne.jp')dnl
+MASQUERADE_DOMAIN(`localhost.localdomain')dnl
+FEATURE(`masquerade_envelope')
+
dnl #
dnl #---------------------------------------------------------------------
dnl # Masquerading information, if needed, should go here
@@ -48,7 +59,7 @@
dnl # The real reason we're here: the FEATURE(msp)
dnl # NOTE WELL: MSA (587) should have M=Ea, so we need to use stock 25
dnl #---------------------------------------------------------------------
-FEATURE(`msp', `[127.0.0.1]', `25')dnl
+FEATURE(`msp', `smtpa.jcom.zaq.ne.jp', `25')dnl
dnl #
dnl #---------------------------------------------------------------------
dnl # Some minor cleanup from FEATURE(msp)
JCOM へ接続時のユーザID、パスワードなどを authinfo を作成し設定します。また、ローカルユーザを JCOM のユーザへ置き換えるために genericstable ファイルを作成します。
# mkdir /etc/mail/auth
# chmod 755 /etc/mail/auth
# chown root:smmsp /etc/mail/auth
# vi /etc/mail/auth/authinfo
AuthInfo:smtpa.jcom.zaq.ne.jp "U:1234usr" "I:1234usr@jcom.zaq.ne.jp" "P:LQct1WAA" "M:LOGIN"
# cd /etc/mail/auth
# makemap hash authinfo < authinfo
作成された authinfo.db のパーミッションを確認
# ls -l
-rw------- 1 root smmsp 95 Aug 13 06:11 authinfo
-rw-r----- 1 smmta smmsp 12288 Aug 13 13:57 authinfo.db
#
※root と 1234usr 間はタブです。
# vi /etc/mail/genericstable
root 1234usr
abc 1234usr
# cd /etc/mail
# makemap hash genericstable < genericstable
この設定を反映させるため sendmailconfig を実行
# sendmailconfig
...
メール送信して確認してみる
# date | sendmail -v target-usr@gmail.com
target-usr@gmail.com... Connecting to smtpa.jcom.zaq.ne.jp via relay...
220 smtpa11.esk.m4.zaq.ne.jp ESMTP server ready Mon, 13 Aug 2018 14:11:11 +0900
>>> EHLO pogo.
250-smtpa11.esk.m4.zaq.ne.jp
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
>>> AUTH LOGIN
334 VCNlom5hbWU6
>>> NUMxN3uzcmVAcmNvbS56YXEubmUuanA=
334 UBFzc3xvcmq6
>>> TFFLZTFXXUE=
235 Authentication successful
>>> MAIL From:<1234usr@jcom.zaq.ne.jp> SIZE=29 AUTH=root@pogo.
250 Sender <1234usr@jcom.zaq.ne.jp> and extensions (SIZE=29, AUTH=root@pogo.) Ok
>>> RCPT To:<target-usr@gmail.com>
>>> DATA
250 Recipient <target-usr@gmail.com> Ok
354 Ok Send data ending with <CRLF>.<CRLF>
>>> .
250 Message received: 20180813051111713.IYXO.17729.smtpa11.esk.m4.zaq.ne.jp@smtpa11.esk.m4.zaq.ne.jp
target-usr@gmail.com... Sent (Message received: 20180813051111713.IYXO.17729.smtpa11.esk.m4.zaq.ne.jp@smtpa11.esk.m4.zaq.ne.jp)
Closing connection to smtpa.jcom.zaq.ne.jp
>>> QUIT
221 smtpa11.esk.m4.zaq.ne.jp ESMTP server closing connection
#
1行目: Connecting to smtpa.jcom... の箇所から、jcom の smtp へ接続している事がわかる。
11行目あたり:AUTH LOGIN から Authentication successful あたりまでで、ログイン認証が成功
17行目: Mail From: の箇所で JCOM のアドレスとなっている。
結果、エラーはなく送信完了しメールも届いていました。
#うまく行かない時のチェックポイント
うまくメールが送信できない時の確認ポイントとして、いくつか記載しておきます。
●リレー先に接続する動作になっているか
一般的に、メールを送信する際には自身の TCP 25 番ポートに接続しますが、不要なデーモンは動作させたくないので、ここでは 直接 JCOM のsmtp へ接続しています。
submit.mc 内の以下の変更が対応した設定箇所です。
-FEATURE(`msp', `[127.0.0.1]', `25')dnl
+FEATURE(`msp', `smtpa.jcom.zaq.ne.jp', `25')dnl
以下のようにして -bv オプションを指定し、-C で submit.cf を指定して、期待通りメーラーは "relay" そして接続先のホストも jcom のホスト名になっている事が確認できます。
# sendmail -C /etc/mail/submit.cf -bv target-usr@gmail.com
Notice: -bv may give misleading output for non-privileged user
target-usr@gmail.com... deliverable: mailer relay, host smtpa.jcom.zaq.ne.jp, user target-usr@gmail.com
●jcom 接続時の認証に成功しているか
目的の通り jcom へ接続していても、設定の不備により jcom のアカウントでのログイン認証に進まない場合があります。その時の sendmail -v での出力に AUTH LOGIN などの処理が無く AUTH failure となります。以下は、認証に必要な sasl 関連のライブラリが不足している場合の出力です、Temporary AUTH failure となっていますね。
# date | sendmail -v target-usr@gmail.com
target-usr@gmail.com... Connecting to smtpa.jcom.zaq.ne.jp via relay...
220 smtpa23.esk.m4.zaq.ne.jp ESMTP server ready Tue, 14 Aug 2018 18:48:51 +0900
>>> EHLO pogo.
250-smtpa23.esk.m4.zaq.ne.jp
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
>>> QUIT
221 smtpa23.esk.m4.zaq.ne.jp ESMTP server closing connection
target-usr@gmail.com... Deferred: Temporary AUTH failure
Closing connection to smtpa.jcom.zaq.ne.jp
#
/etc/mail/auth/authinfo.db のパーミッションに問題がある場合。
同様に AUTH LOGIN はなく、MAIL From: に対して Authentication is requred と叱られています。syslog に出力されたメッセージを確認してみると authinfo.db Permission denied となっています。sendmail -bt -d38.20 で確認しても、unsafe map file: Permission denied となっている事がわかります。
# date | sendmail -v target-usr@gmail.com
target-usr@gmail.com... Connecting to smtpa.jcom.zaq.ne.jp via relay...
220 smtpa12.esk.m4.zaq.ne.jp ESMTP server ready Tue, 14 Aug 2018 19:08:03 +0900
>>> EHLO pogo.
250-smtpa12.esk.m4.zaq.ne.jp
250-AUTH=LOGIN PLAIN
250-AUTH LOGIN PLAIN
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
>>> MAIL From:<1234usr@jcom.zaq.ne.jp> SIZE=29
553 Authentication is required to send mail as <1234usr@jcom.zaq.ne.jp>
root... Using cached ESMTP connection to smtpa.jcom.zaq.ne.jp via relay...
>>> RSET
250 Ok resetting state
>>> MAIL From:<> SIZE=1053
553 <> is not allowed to use this service
postmaster... Using cached ESMTP connection to smtpa.jcom.zaq.ne.jp via relay...
>>> RSET
250 Ok resetting state
>>> MAIL From:<> SIZE=2077
553 <> is not allowed to use this service
MAILER-DAEMON... Saved message in /var/lib/sendmail/dead.letter
Closing connection to smtpa.jcom.zaq.ne.jp
>>> QUIT
221 smtpa12.esk.m4.zaq.ne.jp ESMTP server closing connection
#
#
# grep Permission /var/log/syslog
Aug 14 19:08:44 pogo sendmail[25302]: w7EA8hxo025302: SYSERR(root): hash map "authinfo": unsafe map file /etc/mail/auth/authinfo.db: Permission denied
#
この場合 /etc/mail/auth ディレクトリ、および /etc/mail/auth/authinfo.db のオーナ:グループ、そしてパーミッションを適切なものに変更すれば、うまく動作します。
正しいパーミッションは以下となります。
# cd /etc/mail/auth
# ls -la
total 20
drwxr-sr-x 2 root smmsp 4096 Aug 13 06:12 .
drwxr-sr-x 8 smmta smmsp 4096 Aug 15 12:06 ..
-rw------- 1 root smmsp 95 Aug 13 06:11 authinfo
-rw-r----- 1 smmta smmsp 12288 Aug 13 13:57 authinfo.db
#
pogoplug + debian 環境では、ディレクトリに s フラグまでついておりました。
まあ、そんなにおかしな設定になる事もないでしょうから /etc/mail に "s" もセットされているよ! 程度の認識で良いように思います。
# ls -ld /etc/mail
drwxr-sr-x 8 smmta smmsp 4096 Aug 15 12:06 /etc/mail
#
●From のユーザ名
genericstable を設定しないでメールを送ると、Mail From: が pogoローカルユーザ@jcom.zaq.ne.jp となってしまいます。
わたしは jcom の root でもないのに root@jcom.zaq.ne.jp は気持ち悪いし、これで他人にメールはまずいと思うので、genericstable へ root 1234usr のように設定を加えました。
genericstable を利用しなくても下記のように submit.cf 中の MasqHdr ルールセットを変更して強制的に指定のユーザ名にする事もできます。
※ わたしのお気に入りのスイッチ sendmail -bt -d21.12 -C /etc/mail/submit.cf で MasgHdr ルールセットの動作を確認すれば、どのパターンマッチにヒットしているか判断できます。
# diff -u submit.cf.prev submit.cf
--- submit.cf.prev 2018-08-15 12:03:11.000000000 +0900
+++ submit.cf 2018-08-15 12:05:59.000000000 +0900
@@ -973,7 +973,7 @@
R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3
R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2
R$* < @ $+ @ > $* $: $1 < @ $2 > $3 $M is null
-R$* < @ $+ @ $+ > $* $: $1 < @ $3 . > $4 $M is not null
+R$* < @ $+ @ $+ > $* $: 1234usr < @ $3 . > $4 $M is not null
###################################################################
### Ruleset 94 -- convert envelope names to masqueraded form ###
You have new mail in /var/mail/root
以上です。もし、にたような設定を行う方のお役にたてましたら幸いです。