メールサーバーの設定 (sendmail 8.12.11編)

最近、スパムメール自宅サーバーにも届くようになってきたため、久しぶりにsendmailのアップデートを行いました。とりあえず8.12.11をソースから導入したときの記録を残しておきます。
ソースのビルド
sendmail8.12.11のソースを展開しビルドを実行します。
% cd sendmail-8.12.8/sendmail
% sh Build
ユーザーの登録
sendmail8.12以降のバージョンは、メールのやり取りに必要なユーザーを作る必要があるので、先にユーザーとグループを作っておきます。vipwを使い以下の2行を追加します。
# vipw
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
グループも必要となるので以下のグループを追加します。
# vi /etc/group
smmsp:*:25:
mailnull:*:26:
スプールに以下のディレクトリを作成します。
# mkdir /var/spool/clientmqueue
# chown smmsp:smmsp /var/spool/clientmqueue
# chmod 770 /var/spool/clientmqueue
# chmod 700 /var/spool/mqueue
インストールする
必要に応じてバックアップ(sendmailとsendmail.cf)を取り、インストールを行います。
# cd sendmail-8.12.11
# sh Build install
sendmail.cf を作成する
アクセス制御の記述を追加します。
# cd cf/cf
# cp generic-bsd4.4.mc sendmail.mc
# vi sendmail.mc
divert(0)dnl
VERSIONID(`$Id: generic-bsd4.4.mc,v 8.10 1999/02/07 07:26:02 gshapiro Exp $')
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl
FEATURE(`access_db',`hash -T<TMPF> /etc/mail/access')dnl  # 追加
MAILER(local)dnl
MAILER(smtp)dnl
# make sendmail.cf
※MAILERの上に追加しないとエラーになります。
submit.cf を作成する
% vi submit.mc
divert(0)dnl
VERSIONID(`$Id: submit.mc,v 8.6.2.7 2003/09/10 22:11:56 ca Exp $')
define(`confCF_VERSION', `Submit')dnl
define(`__OSTYPE__',`')dnl dirty hack to keep proto.m4 from complaining
define(`_USE_DECNET_SYNTAX_', `1')dnl support DECnet
define(`confTIME_ZONE', `USE_TZ')dnl
define(`confRUN_AS_USER', `smmsp')dnl   # 追加
define(`confDONT_INIT_GROUPS', `True')dnl
dnl
dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
FEATURE(`msp', `[127.0.0.1]')dnl
# make submit.cf
設定ファイルをコピーする
上記で作成した設定ファイルを /etc/mail にコピーします。
# cp sendmail.cf /etc/mail/
# cp submit.cf /etc/mail/
ホストが受け付けるドメイン名を指定する
新しい sendmail ではスパムメールへの対応が強化されているので、上記の設定ファイルを作っただけでは配送ができません。最初にこのホストが受け付けるドメイン名を指定します。
# cd /etc/mail
# vi local-host-names
受け付けるドメイン名を1行ずつ記載していきます。
host1.jp
host2.jp
host3.jp
リレーを受け付けるアドレスを指定する
メールサーバーを利用するクライアントPCのアドレスを記載します。例えば 192.168.0.n のネットワークにクライアントPCが存在している場合には次のような設定になります。また、特定のドメインやユーザーからのメールを拒否したい場合には、REJECTで追加します。
localhost  RELAY
192.168.0  RELAY
spam.com  REJECT
spam@  REJECT
修正が終わったらテーブルの更新を行います。
# makemap hash /etc/mail/access.db < /etc/mail/access
sendmailを起動する
シェルを作って自動起動するようにしておきます。
# vi /usr/local/etc/rc.d/sendmail.sh
#!/bin/sh
/usr/sbin/sendmail -L sm-mta -bd -q30m
/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m
exit 0
※本当ならちゃんと作った方が良いです。(とりあえずテスト書き)
追記事項1
アップデートしたバージョンによっては以下のエラーが出る場合があります。(実は3台の内2台でエラー発生)
mail.local: lockmailbox /var/mail/xxxxxx failed; error code 75
ネットから文献を検索すると「mail.localがsetuidされなくなったので、.defファイルにLOCAL_MAILER_FLAG_ADD='S'を追加すれば良い」とあります。従って定義ファイルに先の設定を追加するか、sendmail.cfに以下の定義を追加すれば動くようになります。
# vi /etc/mail/sendmail.cf
/Mlocal ・・・ Mlocalを検索
Mlocal, P=/usr/libexec/mail.local, F=lsDFMAw5:/|@qPrmn9S, S=EnvFromL/HdrFromL, R=EnvToL ・・・ 「S」を追加
※本来であればsenmail.cfを直接直すことは避けてください。
追記事項2
環境によっては「My unqualified host name (xxxxxx) unknown; sleeping for retry」とかのエラーが出ることもあるようです(3台の内1台で発生(^^;))。本来は名前の解決が出来なくて発生するエラーですが、ローカルメールで、名前が引けている場合でも発生する場合があります。その時には「/etc/hosts」の定義をFQDNで書くと解決できることがあります。
# vi /etc/hosts
127.0.0.1 localhost
192.168.1.30 server1
192.168.1.31 server2
127.0.0.1 localhost.localhost.my.domain
192.168.1.30 server1 server1.localdomain
192.168.1.31 server2 server2.localdomain
追記事項3
先日、メールの送受信テストをしていて、なんかメールが外部に送信が出来なくなっているなあと、あれこれ設定を見直していましたが、BIGLOBEのカスタマーサポートより「ポート25ブロックのお知らせ」メールが届きました(^^;)。もしかしたらそうかな〜と思っていましたが、もっと早くメールくれれば良かったのに。。
と言うことで、自宅サーバーからメールの送信が出来るように模索したところ、BIGLOBEの対応としては、「mail.biglobe.ne.jp」を中継して送信すれば出来ると書かれてありましたので試してみたところ、やはりNG。考えてみれば中継サーバーに使うと言うことは、サーバー承認が必要となるので、Windows用のメールソフトにもサーバー承認の設定を行いました。でも結果はNG。
更に考えてみると、身元がはっきりしていないサーバーからの中継依頼なので「envelope-from」が必要なのではないかと思い、ネットで検索したところ、やはり「envelope-fromがbiglobeである必要有り」との事でした。
とりあえず、sendmailをシェルに置き換えて、sendmail -fにてenvelope-fromを指定するように変更してみました。でも結果はNGでした。
その後、BIGLOBEからの情報をあれこれ見直してみると、以前に「POPbeforeSMTP」を適応すると言った記事を見つけました。すっかり忘れておりましたが、これのおかげで、先にpop3で一度オープンしておかないと送信できないことがわかりました。
そのようなわけで、sendmail用に作成したシェルにpop3をやってからsendmail -fを呼び出すようにすれば送信出来そうであることがわかりましたが、pop3をシェルからオープンさせるにはプログラムが必要なので、今回はやらないことに致しました(^^;)。Cで書いても簡単に書けるでしょうし、phpなどを使えば30分かからないと思います。でも時間がないし面倒。(^^;)
今のところ、自宅サーバーのメールは、家庭内でログの監視やセキュリティカメラの監視などに使っているぐらいなので、自宅サーバーから外部へメールを送信する必要もありません。(なんせ今まで送信できなくなっていたことに気付いていないぐらいでしたし(^^;)) そのうち必要になったらプログラムを書いて試してみるかも知れません。もっとも、仕事で使うなら固定IP取った方が今後のためにも良いかも知れないけど。
とりあえず、今回は試したところまでのメモを残しておくことにします。

>Windowsのメールソフトに「サーバー承認」の設定を行い、BIGLOBEで使用しているアカウントを設定。
>自宅サーバーの設定をBIGLOBEに中継を依頼するように修正。
# vi sendmail.mc
 define(`SMART_HOST',`mail.biglobe.ne.jp')dnl   # リレー設定を追加
>送信するメールにenvelopo-fromを追加する。
# cd /usr/sbin
# mv sendmail sendmail.org
# vi sendmail
 #!/bin/sh
 [pop3でオーブにするプログラムを記述]
 cat |sendmail.org -f 自分で使用しているメールアドレス $*
※実際に最後まで試していないので、本当に送信できるようになるかわかりません。詳しい方、もしおかしな所があればご指摘いただければ幸いです。

以上です。
最近はスパムメールが酷くなる一方で、ほんと嫌になります。最近はプロバイダーなどもスパム撲滅に乗り出してくれていますので嬉しい限りですが、その影響で自宅サーバーからメールが送れなくなったりと弊害も出ていたりします。まあ、少しぐらいの弊害があっても、プロバイダー側には頑張ってもらいたいものです。「目指せスパム撲滅!e-mail世界に平穏を。。(^^)/」